2016-07-31 43 views
0

シャドウマッピング実装を順方向レンダリングから遅延レンダリングに切り替えるのが難しい。私は問題を見つけました。それはシェーダに送られていないキューマップです。私は "GBuffer" FBOがキューブマップFBOの代わりにバインドされているからだと思います。OpenGL - 別のFBOがバインドされているときにキューマップにアクセスする

GLSLが1回の描画呼び出しで2つの異なるFBOからカラー添付ファイルにアクセスできる場合は、そのルートに行きたいと思いますが、これは可能ですか?

以下、作業フォワードレンダリングコード。

public void NormalPass(Shader shader) 
{ 
    // Reset state 
    GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    GL.BindTexture(TextureTarget.Texture2D, 0); 

    GL.UseProgram(shader.ID); 
    GL.Viewport(0, 0, Width, Height); 
    GL.CullFace(CullFaceMode.Back); 
    GL.ClearColor(0.5f, 0.5f, 0.5f, 1f); 

    // Uniforms 
    Matrix4 viewMatrix = player.GetViewMatrix(); 
    Matrix4 projectionMatrix; 
    Matrix4.CreatePerspectiveFieldOfView((float)Math.PI/4, (float)Width/(float)Height, 0.1f, 100.0f, out projectionMatrix); 
    GL.UniformMatrix4(shader.viewMatrixLocation, false, ref viewMatrix); 
    GL.UniformMatrix4(shader.projectionMatrixLocation, false, ref projectionMatrix); 
    GL.Uniform3(shader.lightPositionLocation, lightPos); 

    GL.BindTexture(TextureTarget.TextureCubeMap, cubeTex); 
    DrawScene(shader, false);        // False = Not shadowpass 
    GL.BindTexture(TextureTarget.TextureCubeMap, 0); 
} 

そしてここで、失敗遅延レンダリング修正

public void Composite(Shader shader) 
{ 
    //Set up FBO reading/writing 
    GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, 0); 
    GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, gBuffer.FBO); 

    // Bind textures 
    GL.ActiveTexture(TextureUnit.Texture2); 
    GL.BindTexture(TextureTarget.Texture2D, gBuffer.positionTexture); 
    GL.ActiveTexture(TextureUnit.Texture1); 
    GL.BindTexture(TextureTarget.Texture2D, gBuffer.normalTexture); 

    GL.UseProgram(shader.ID); 
    GL.Disable(EnableCap.DepthTest); 
    GL.Viewport(0, 0, Width, Height); 
    GL.CullFace(CullFaceMode.Back); 
    GL.ClearColor(0.5f, 0.5f, 0.5f, 1f); 
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

    // Uniforms 
    Matrix4 viewMatrix = player.GetViewMatrix(); 
    GL.UniformMatrix4(shader.viewMatrixLocation, false, ref viewMatrix); 
    GL.Uniform3(shader.lightPositionLocation, lightPos); 

    GL.BindTexture(TextureTarget.TextureCubeMap, cubeTex); 
    Quad2D.drawScreenSizedQuad(); // Draw the combined lighting and diffuse to screen 
    GL.BindTexture(TextureTarget.TextureCubeMap, 0); 
} 

リクエストに応じて任意のより多くの情報を提供するためにハッピー。

答えて

2

GLSLは、単一のドローコールに二つの異なるFBOsから色の添付ファイルにアクセスできる場合、私はそのルートを行きたい、これは可能ですか?

この問題は、何が起こっているのか理解していないことを裏付けるものです。 GLSLアクセステクスチャ、FBOのカラーアタッチメントではありません。

明らかに、テクスチャはカラー添付として使用できます。しかし、GLSLがバインディングされたテクスチャにアクセスしているにもかかわらず、FBOにあるものではなく、区別が重要です。

OpenGLは、添付ファイルとしてFBOに添付されているテクスチャから読み取るルールは、レンダリング中にアクティブな描画フレームバッファである特定のフレームバッファにこれらのテクスチャが実際には添付されていない限り動作しますコマンド。それでは、OpenGL will only care if you break the feedback loop rules

読み込みフレームバッファにバインドするのは無意味です。これは、テクスチャを読んだり、何かに利用できるようにしていません。これは、読み込みフレームバッファバインディングポイントのためのものではありません。 framebuffer reading commandsframebuffer blitting operationsにのみ使用されています。

したがって、デフォルトのフレームバッファーをFramebufferTarget.Framebufferにバインドするだけで、大文字と同じように正しく動作します。

あなたの原則の問題はこれです:あなたがそのキューブマップをバインドするテクスチャユニットを指定するglActiveTextureを使用しなかった

GL.BindTexture(TextureTarget.TextureCubeMap, cubeTex); 

。つまり、最後に設定したテクスチャユニット(TextureUnit.Texture1)が使用され、既にそこに2Dテクスチャがバインドされていることを意味します。 GLSLでは、2つの異なるタイプの2つのテクスチャを同じテクスチャユニットから読み込むことは不正です。

オッズはあなたが意味するものではないので、良いです。 常にを使用すると、glBindTextureが呼び出される前にglActiveTextureが使用されます。 glBindTextures from GL 4.4/ARB_multibindまたはglBindTextureUnit from GL 4.5/ARB_DSAを使用している場合を除きます。

+0

これは私の誤解の多くをクリアし、確かにトラックの下で私の日を節約します、ありがとうジェイソン。今はあまりにも機能しています。 –

関連する問題