1

OpenGL ES 2.0、iOS 用のシンプルな 3D アプリケーションに取り組んでいます。

私がやりたいことは、フラグメントシェーダーの深度バッファーでシーンの深度値を取得したいということです。

そこで、深度バッファを 2D テクスチャとして作成しました

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,  size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);

self.Dimension = IVVec3I_Make(size.x, size.y, 0);
self.BufferObjID = texture;

深度アタッチメントとしてフレーム バッファにアタッチしました。

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, pRD.BufferObjID,0);

シーンをレンダリングすると、深度バッファが正しく機能しています (深度テストと深度書き込みはすべて完全に機能しています)。

しかし、シェーダーのサンプラーにデプス バッファーを割り当て、フル スクリーン クアッド プレーンを使用してデプス バッファーを画面にレンダリングすると、すべて黒くなります。また、別の通常のテクスチャをサンプラーに割り当てると、テクスチャが正しくレンダリングされるため、シェーダー自体に問題はありません。

これがフラグメントシェーダーです。

uniform sampler2D DepthBuffer;

void main()
{
    highp vec2 tex_coord = vec2(gl_FragCoord.x/1024.0,gl_FragCoord.y/768.0);

    tex_coord.y = 1.0-tex_coord.y;

    gl_FragColor = texture2D(DepthBuffer, tex_coord);
}

OpenGL ES フレームをキャプチャして深度バッファーを調べたところ、デバッガーは深度バッファーをすべて白で表示します (ほとんどすべての深度値が 1.0 にかなり近いため、これは正しいことです)。

では、ここで何が問題になる可能性がありますか?

4

2 に答える 2

2

スグ・リー

まったく同じ問題に遭遇しました。テクスチャ フィルタリングが問題であることが判明しました。以下に示すように GL_NEAREST を試してください。

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES30.GL_DEPTH_COMPONENT32F, texWidth, texHeight,
    0, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_FLOAT, null);
GLES30.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES30.GL_TEXTURE_COMPARE_MODE, GLES20.GL_NONE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

: 私は GLES 3.0 を使用していますが、この修正は 2.0 でも機能します。 デバイス: HTC m8 t-mo アンドロイド 5.0 ロリポップ

于 2014-11-28T10:28:51.860 に答える
0

アプリケーションからのセットアップを行わないとわかりにくいですが、いくつかの推測を以下に示します。

*深度テクスチャの GL_TEXTURE_COMPARE_MODE パラメータを GL_NONE に設定します。これが GL_COMPARE_R_TO_TEXTURE の場合、期待どおりの結果が得られない可能性があります。

*単一の値が格納されているため、実際には texture2D ルックアップの最初のコンポーネントのみが必要です。Fragシェーダーでこれを試すことができます:

gl_FragColor = vec4(texture2D(DepthBuffer, tex_coord).rrr, 1.0);

これらの実験も検討したいと思います。

*glReadPixels を使用して、テクスチャの内容を手動で検査します

*深度テクスチャの内容をカラー テクスチャにコピーし、それをレンダリングしてみます (glBlitFramebuffer をお勧めしますが、ES 2.0 では使用できません)。glReadPixels を使用してから glTexImage2D を使用できます。

于 2013-07-17T20:13:36.850 に答える