2016-12-26 1 views
0

Mon problème est que OpenGL rend à la fenêtre principale, bien que je lie le Framebuffer que je veux utiliser.OpenGL ne rend pas à Framebuffer mais à la fenêtre

Ceci est mon principal rendu méthode

protected override void OnRenderFrame(FrameEventArgs e) 
{ 
    base.OnRenderFrame(e); 

    renderer.BeginFrame(); 
    renderer.RenderEntity(testEntity); 
    renderer.EndFrame(); 

    SwapBuffers(); 
} 

Ceci est mon Renderer

class Renderer 
{ 
    List<Vertex> screenQuadVertecies = new List<Vertex> 
    { 
     new Vertex(new Vector3(-1, 1, 0), new Vector3()), 
     new Vertex(new Vector3(1, 1, 0), new Vector3()), 
     new Vertex(new Vector3(-1, -1, 0), new Vector3()), 
     new Vertex(new Vector3(1, -1, 0), new Vector3()) 
    }; 

    List<int> screenQuadIndices = new List<int> 
    { 
     0, 1, 2, 
     1, 2, 3 
    }; 

    List<Vector2> screenQuadUVs = new List<Vector2> 
    { 
     new Vector2(0, 0), 
     new Vector2(1, 0), 
     new Vector2(0, 1), 
     new Vector2(1, 1) 
    }; 

    TexturedMesh screenQuad; 

    Framebuffer mainPassFramebuffer; 

    Camera activeCamera; 
    Shader ModelShader; 
    Shader PostProcessingShader; 

    int width, height; 

    public Renderer(int width, int height) 
    { 
     this.width = width; 
     this.height = height; 

     ModelShader = new MainShader(); 
     PostProcessingShader = new PostProcessingShader(); 
     mainPassFramebuffer = new Framebuffer(width, height); 
     screenQuad = new TexturedMesh(screenQuadVertecies, screenQuadIndices, screenQuadUVs); 
    } 

    public void BeginFrame() 
    { 
     mainPassFramebuffer.EndRendering(); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
     mainPassFramebuffer.ClearBuffer(); 
     mainPassFramebuffer.BeginRendering(); 
    } 

    public void EndFrame() 
    { 
     mainPassFramebuffer.EndRendering(); 
     mainPassFramebuffer.BindTexture(); 
     PostProcessingShader.UseShader(); 
     screenQuad.PrepareRendering(); 
     GL.DrawElements(PrimitiveType.Triangles, 6, DrawElementsType.UnsignedInt, 0); 
     screenQuad.EndRendering(); 
     PostProcessingShader.UnuseShader(); 
    } 

    public void RenderEntity(Entity e) 
    { 
     e.Mesh.PrepareRendering(); 
     ModelShader.UseShader(); 
     ModelShader.LoadCamera(activeCamera); 
     ModelShader.LoadModel(e.GetModelMatrix()); 
     GL.DrawElements(PrimitiveType.Triangles, e.Mesh.GetSize(), DrawElementsType.UnsignedInt, 0); 
     ModelShader.UnuseShader(); 
    } 

    public void RenderTerrain(Terrain t) 
    { 
     foreach (var chunk in t.chunks) 
     { 
      RenderEntity(chunk.GetEntity()); 
     } 
    } 

    public void SetActiveCamera(Camera camera) 
    { 
     activeCamera = camera; 
    } 

} 

Et voici ma framebuffer classe

class Framebuffer 
{ 
    int frameBufferID; 
    int textureID; 

    int width, height; 

    public Framebuffer(int width, int height) 
    { 
     this.width = width; 
     this.height = height; 

     frameBufferID = GL.GenRenderbuffer(); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBufferID); 
     textureID = CreateTexture(); 
     GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, textureID, 0); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 

    protected int CreateTexture() 
    { 
     int returnID; 

     returnID = GL.GenTexture(); 
     GL.BindTexture(TextureTarget.Texture2D, returnID); 

     GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, width, height, 0, PixelFormat.Rgb, PixelType.UnsignedByte, (IntPtr)0); 

     int nearest = (int)TextureMagFilter.Nearest; 
     GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, ref nearest); 
     GL.TexParameterI(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, ref nearest); 

     return returnID; 
    } 

    public void BeginRendering() 
    { 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBufferID); 
     GL.Viewport(new System.Drawing.Point(0, 0), new System.Drawing.Size(width, height)); 
    } 

    public void EndRendering() 
    { 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 

    public void BindTexture() 
    { 
     GL.BindTexture(TextureTarget.Texture2D, textureID); 
    } 

    public void ClearBuffer() 
    { 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBufferID); 
     GL.Viewport(new System.Drawing.Point(0, 0), new System.Drawing.Size(width, height)); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 
} 

Le résultat attendu est un quad noir parce que J'ai mis en place Texturing quand j'ai découvert que mon modèle restait toujours à l'écran en. J'ai trouvé cela quand je commente l'appel GL.DrawElements dans EndRendering() qui devrait rendre le quad à l'écran. Quand je ne dessine pas ce quad, l'image apparaît toujours.

Qu'est-ce que je fais mal?

Répondre

1

un rendu tampon est pas un objet de mémoire vidéo:

frameBufferID = GL.GenRenderbuffer();

Lorsque vous essayez de lier un ID que vous avez obtenu de glGenRenderbuffers comme framebuffer, vous obtiendrez une erreur de GL_INVALID_OPERATIONglBindFramebuffer(), et la commande aura sans effet (en laissant le framebuffer par défaut lié).

De nouveaux noms FBO sont générés via glGenFramebuffers, vous devriez donc l'utiliser.

+0

Oh mon dieu stupide erreur ... Je viens d'éteindre mon ordinateur alors je vais l'essayer demain. Merci d'avoir lu ce bazar de Code! –