は、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だけを返す、私が使用する構成に依存します。
は、私はこのような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);
カラーテクスチャから読み取る場合と比較して、奥行きテクスチャから読み取るときに特別なことはありません。あなたのテクスチャがどのように拘束されているかを知ることは不可能なので、最小の実例を提供してください。 – BDL
@BDLは私のプロセスのコード例を追加しました。ジオメトリシェーダは、基本的なカラーシェーダとデプス値がReadPixelを使って正しく読み込まれるため含まれていません。 – bitQUAKE
関連していませんが、画面をクリアした後でクリアカラー*を設定しても効果はありません。 – BDL