2016-12-26 7 views
0

제가 사용하고자하는 Framebuffer를 묶었지만, OpenGL이 Main-Window로 렌더됩니다. OpenGL이 Framebuffer로 렌더링되지 않고 Window에 렌더링됩니다.

내 홈페이지입니다 렌더링 - 방법

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

오 세상에 어리석은 실수 ... 나는 단지 내 컴퓨터를 꺼서 내일 그것을 시도 할 것이다. 코드의 엉망진창을 읽어 주셔서 감사합니다! –