Ich habe Schwierigkeiten, meine Shadow Mapping-Implementierung von Vorwärts-Rendering auf verzögertes Rendering umzustellen. Ich habe das Problem gefunden und es wird keine Cubemap an den Shader gesendet. Ich vermute, dass es daran liegt, dass mein "GBuffer" -FBO anstelle der Cubemap FBO gebunden ist.OpenGL - Zugreifen auf eine Cubemap, wenn ein anderer FBO gebunden ist
Wenn GLSL in einem einzigen Zeichenaufruf auf Farbanhänge von zwei verschiedenen FBOs zugreifen kann, würde ich diesen Weg gehen, ist das möglich?
Unten, die Arbeit vorwärts Rendering-Code.
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);
}
Und hier die fehlerhafte latente Rendering Änderung
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);
}
Glücklich mehr Informationen auf Anfrage zur Verfügung zu stellen.
Dies räumt viele meiner Missverständnisse auf und wird mir sicherlich Tage retten, vielen Dank Jason. Es funktioniert jetzt übrigens auch. –