2017-08-01 5 views
0

J'essaie de configurer un pipeline de rendu, et à la suite de cela, j'essaie de configurer le rendu à une texture afin que je puisse l'échantillonner plus tard pour le flou et le semblable.Impossible de rendre à une texture liée à un framebuffer

J'ai un vertex shader qui ressemble à ceci:

#version 400 

//Heyy renderpasses 
subroutine void RenderPass(); 
subroutine uniform RenderPass currentPass; 

in vec3 ex_normal; 
in vec3 ex_color; 
in vec4 ShadowCoord; 
in vec3 lightDir_cameraspace; 
in vec3 normal_cameraspace; 

layout(location=0) out vec4 color; 
layout(location=1) out float depth; 

uniform vec3 light_pos; 
uniform sampler2D shadowMap; 

void main() 
{ 
    //Bootstrap for render pass 
    currentPass(); 
} 

//Render passes 

subroutine(RenderPass) 
void Default() 
{ 
    //Config 
    vec3 lightColor = vec3(1.0, 1.0, 1.0); 
    float lightIntensity = 1.0; 
    vec3 diffuseColor = ex_color; 

    vec3 n = normalize(normal_cameraspace); 
    // Direction of the light (from the fragment to the light) 
    vec3 l = normalize(lightDir_cameraspace); 

    float cosTheta = clamp(dot(n,l), 0,1); 
    vec3 ambientLight = vec3(0.2, 0.2, 0.2); 
    vec3 lightSum = ambientLight; 
    float visibility = 1.0; 
    float shadowSample = texture(shadowMap, ShadowCoord.xy).z; 

    float bias = 0.005*tan(acos(cosTheta)); // cosTheta is dot(n,l), clamped between 0 and 1 
    bias = clamp(bias, 0,0.01); 

    if (shadowSample < ShadowCoord.z-bias){ 
     visibility = 0.3; 
    } 

    color = vec4(ambientLight + (diffuseColor*visibility*lightColor*lightIntensity/*cosTheta*/), 1.0); 

} 

subroutine(RenderPass) 
void Diffuse() 
{ 
    color = vec4(ex_color, 1.0); 
    depth = gl_FragCoord.z; 
} 

subroutine(RenderPass) 
void Depth() 
{ 
    depth = gl_FragCoord.z; 
} 

Cela fonctionne bien lors du rendu à la fenêtre/framebuffer 0. Cependant, en essayant de rendre à un ensemble sur mesure jusqu'à framebuffer, que j'ai emballé dans une classe pour plus de commodité, comme ceci:

private GameWindow _gameWindow; 
    private Texture _texture; 
    private int _framebufferId; 

    public Framebuffer(GameWindow window) 
    { 
     _gameWindow = window; 

     _framebufferId = GL.GenFramebuffer(); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, _framebufferId); 

     _texture = new Texture(GL.GenTexture()); 
     GL.BindTexture(TextureTarget.Texture2D, _texture.Handle); 
     GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, window.Width, window.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, (IntPtr)0); 

     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); 
     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); 

     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); 

     GL.FramebufferTexture(FramebufferTarget.DrawFramebuffer, FramebufferAttachment.ColorAttachment0, _texture.Handle, 0); 

     GL.DrawBuffers(1, new DrawBuffersEnum[] { DrawBuffersEnum.ColorAttachment0 }); 

     GL.DrawBuffer(DrawBufferMode.None); 

     if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) 
      throw new Exception("Framebuffer creation failed"); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 

    public Texture Texture 
    { 
     get 
     { 
      return _texture; 
     } 
    } 

    public void BeginDraw() 
    { 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, _framebufferId); 
     GL.Viewport(0, 0, _gameWindow.Width, _gameWindow.Height); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
    } 
    public void EndDraw() 
    { 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 

La texture est noire. Suis-je en train de mal comprendre quelque chose à propos des données de couleur de tuyauterie dans la texture?

+1

Pourquoi appelez-vous 'GL.DrawBuffer (DrawBufferMode.None);'? Cela désactive toutes les opérations d'écriture dans le framebuffer. – BDL

+0

quelle carte gfx et pilote? – Spektre

+0

BDL est correct, commentant la ligne a résolu le problème. –

Répondre

1

Vous avez correctement configuré le tampon de trame et vous avez correctement configuré la pièce jointe de couleur et le tampon de dessin, mais vous spécifiez les tampons de couleur qui sont dessinés avec DrawBufferMode.None.

Supprimer cette ligne:

GL.DrawBuffer(DrawBufferMode.None); 

Remarque, depuis un tampon de trame est lié GL.DrawBuffer précisera les tampons de couleurs, qui sont entraînés dans de la mémoire tampon de trame lié.

La réponse acceptée à la question What does GL_COLOR_ATTACHMENT do? dit:

La valeur par défaut est GL_COLOR_ATTACHMENT0.

Vous pouvez donc complètement ignorer pour spécifier le tampon de couleur.

+0

Cela a résolu le problème! Merci! –