2016-12-26 24 views
0

私の問題は、OpenGLがメインウィンドウにレンダリングすることですが、私が使用したいFramebufferをバインドしました。OpenGLはフレームバッファに描画されず、ウィンドウに描画されます

これは私のメインのレンダリング・メソッドである

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

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

    SwapBuffers(); 
} 

期待される結果が黒クワッドあるこれは

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; 
    } 

} 

私のレンダラであり、これは私のフレームバッファクラス

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); 
    } 
} 

あるので、私は、私のモデルがまだscreにレンダリングされていることを発見したときにTexturingを実装していますen。 EndRendering()でGL.DrawElementsを呼び出して、クワッドを画面にレンダリングする必要があることを私が解説するときに見つけました。今私が四分の一を描かないと、イメージはまだ現れる。

私は間違っていますか?

答えて

1

Aは、バッファがフレームバッファオブジェクトでないレンダリング:

frameBufferID = GL.GenRenderbuffer()。あなたはフレームバッファとしてglGenRenderbuffersからもらったIDをバインドしようとすると

、あなたはglBindFramebuffer()からGL_INVALID_OPERATIONエラーになりますし、コマンドには、さらに効果(バインドデフォルトのフレームバッファを残す)を持ちません。

新しいFBO名はglGenFramebuffersで生成されますので、それを使用してください。

+0

ああ私の神は愚かな間違いだ...私はただコンピュータをオフにしたので、私は明日それを試してみるだろう。コードの混乱を読んでくれてありがとう! –

関連する問題