2017-05-31 10 views
0

は、2つのパスレンダリングを行います。 最初のパス私はColorAttachmentとDepthAttachmentを持つFrameBufferにすべてのジオメトリと色を描画します。 DepthAttachmentは、次のようにバインドされます。OpenGLのアクセスDepthComponentテクスチャ

(注:私は強く私のコード例では、入力されOpenTK、とC#を使用しています)

GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2D, depthTexture.ID, 0); 

深度テクスチャは、内部のピクセル形式を持っていますDepthComponent32fのピクセル形式およびのピクセル形式のfloatです。他のすべてのプロパティにはデフォルト値があります。

#version 400 
uniform sampler2D finalImage; 
in vec2 texCoords; 
out vec4 fragColor; 
void main(){ 
    fragColor = vec4(texture2D(finalImage, texCoords.xy).rgb, 1.0); 
} 

しかし、今ではなく、カラーテクスチャ(RGBA)の深さのテクスチャ(DepthComponent)を読みたい:

第二のパスは、以下のシェーダーを使用してスクリーン上にフレームバッファカラー画像をレンダリングします。

TextureCompareModeを無効にするなど、shadow2DSamplerをshadow2DProj(sampler, vec4(texCoords.xy, 0.0, 1.0))またはちょうどtextureProj(sampler, vec3(texCoords.xy, 0.0))に設定してみました。しかし、それは1または0だけを返す、私が使用する構成に依存します。

私の深さのテクスチャがOKであることを確認する

は、私はこのようなfloat配列に戻ってピクセルを読んだ:

GL.ReadPixels(0, 0, depthTexture.Width, depthTexture.Height, PixelFormat.DepthComponent, PixelType.Float, float_array); 

すべてが正しいように思える、その空スペースと値のために私1.0を示します可視オブジェクトの場合は0.99〜1.0です。

編集 ここでは私のプロセスがどのように見えるかのコード例です:

初期化コード

depthTexture= new GLEXTexture2D(width, height); 
     depthTexture.TextureCompareMode = TextureCompareMode.None; 
     depthTexture.CreateMutable(PixelInternalFormat.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float); 
***CreateMutable Function*** 
ReserveTextureID(); 
GLEX.glBeginTexture2D(ID); 
GL.TexImage2D(TextureTarget.Texture2D, 0, pInternalFormat, width, height, 0, pFormat, pType, IntPtr.Zero); 
ApplyOptions(); 
MarkReserved(true); 
GLEX.glEndTexture2D(); 

(フレームバッファの添付ファイルは、上述した)

パス1をレンダリング

GL.BindFramebuffer(FramebufferTarget.Framebuffer, drawBuffer.ID); 
     GL.Viewport(0, 0, depthTexture.Width, depthTexture.Height); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); 
     GL.Enable(EnableCap.DepthTest); 
     GL.ClearColor(Color.Gray); 
     GL.UseProgram(geometryPassShader.ID); 
     geometry_shaderUniformMVPM.SetValueMat4(false, geometryImageMVMatrix * geometryImageProjMatrix); 
     testRectangle.Render(PrimitiveType.QuadStrip); 
     GL.UseProgram(0); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 

数時間後、私は解決策を見つけ、パス2

GL.Viewport(0, 0, depthTexture.Width, depthTexture.Height); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); 
     GL.ClearColor(Color.White); 
     GL.UseProgram(finalImageShader.ID); 
     GL.ActiveTexture(TextureUnit.Texture0); 

     depthTexture.Bind(); 
     final_shaderUniformMVPM.SetValueMat4(false, finalImageMatrix); 
     screenQuad.Render(PrimitiveType.Quads); 
     GL.UseProgram(0); 
     GL.BindTexture(TextureTarget.Texture2D, 0); 
+1

カラーテクスチャから読み取る場合と比較して、奥行きテクスチャから読み取るときに特別なことはありません。あなたのテクスチャがどのように拘束されているかを知ることは不可能なので、最小の実例を提供してください。 – BDL

+0

@BDLは私のプロセスのコード例を追加しました。ジオメトリシェーダは、基本的なカラーシェーダとデプス値がReadPixelを使って正しく読み込まれるため含まれていません。 – bitQUAKE

+1

関連していませんが、画面をクリアした後でクリアカラー*を設定しても効果はありません。 – BDL

答えて

0

をレンダリングします。 問題はMinFilterでした。クロノスグループのようにglTexParameterに言った:

GL_TEXTURE_MIN_FILTERの初期値はGL_NEAREST_MIPMAP_LINEARです。

私はGL_NEARESTに私の深度テクスチャのMinFilterを変更(GL_LINEARも合法である場合)となりましたGLSLシェーダでの深度値は、(当然の線形化した後に)正しいです。

その他の情報: MagFilterの拡張子はLINEAR_DETAIL_ALPHA_SGISです。私はこれらのいくつかを試みましたが、深さ値の正確さは影響を受けませんでした。

+0

何か問題があれば、私の答えをコメントしてください。すべてがうまくいけば、答えとしてマークします。 – bitQUAKE

関連する問題