2016-12-26 6 views
0

Моя проблема в том, что OpenGL отображает Main-Window, хотя я связал Framebuffer, который я хочу использовать.OpenGL не отображает Framebuffer, а Window

Это моя Главная Rendering-Method

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

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

    SwapBuffers(); 
} 

Это мой 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; 
    } 

} 

И это мой Framebuffer Класс

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

Ожидаемый результат является черным четырехъядерным, потому что Я применяю Texturing, когда обнаружил, что моя модель все еще отображает scre эн. Я обнаружил это, когда комментирую вызов GL.DrawElements в EndRendering(), который должен отображать квадрат на экране. Когда я не рисую этот квадрат, изображение все же появляется.

Что я делаю неправильно?

ответ

1

рендер буфер не является объектом фреймбуфера:

frameBufferID = GL.GenRenderbuffer();

При попытке связать идентификатор вы получили от glGenRenderbuffers как фреймбуфером, вы получите сообщение об ошибке GL_INVALID_OPERATION от glBindFramebuffer(), и команда не будет иметь дополнительный эффект (оставляя видеобуфер по умолчанию связанный).

Новые имена FBO создаются через glGenFramebuffers, поэтому вы должны использовать это.

+0

О, боже, глупая ошибка ... Я просто выключил свой компьютер, чтобы завтра попробовать. Спасибо, что прочитали этот беспорядок Кода! –