我在OpenTK(一個C#包裝的OpenGL 4)製作的2D遊戲,一切都很好,除了多邊形和東西跳躍,而不是口吃平滑移動的鋸齒狀邊緣 - 所以我試圖在多重採樣中添加抗鋸齒紋理。的OpenGL 4多重採樣與FBO - FBO不完整
我的設置有幾臺攝像機,它們將所有場景對象渲染到FrameBufferObject紋理上(我希望這是MSAA),然後將它們全部繪製到屏幕上(不需要多重採樣),一個在另一個之上。
沒有多重採樣,它工作得很好,但現在我想改變我的所有的Texture2D調用Texture2DMultisample等,但現在我得到FBO未完成的錯誤和它繪製錯誤。我相信我也需要改變我的着色器,但我想先解決這個問題。
下面的代碼引用了幾類,比如我做了紋理,但我不認爲應該影響到這一點,我不想擾亂後 - 如果需要會給MROE細節。
我成立了FBO每個攝像頭:
private void SetUpFBOTex()
{
_frameBufferTexture = new Texture(GL.GenTexture(), Window.W, Window.H);
GL.BindTexture(TextureTarget.Texture2DMultisample, _frameBufferTexture.ID);
GL.TexImage2DMultisample(TextureTargetMultisample.Texture2DMultisample, 0, PixelInternalFormat.Rgba8, Window.W, Window.H, true);
_frameBufferID = GL.GenFramebuffer();
}
,並得出:
public void Render(Matrix4 matrix)
{
GL.Enable(EnableCap.Multisample);
//Bind FBO to be the draw destination and clear it
GL.BindFramebuffer(FramebufferTarget.Framebuffer, _frameBufferID);
GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2DMultisample, _frameBufferTexture.ID, 0);
GL.ClearColor(new Color4(0,0,0,0));
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
//draw stuff here
foreach (Layer l in Layers)
l.Render(Matrix);
GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
//Bind the FBO to be drawn
_frameBufferTexture.Bind();
//Translate to camera window position
Matrix4 fbomatrix = matrix * Matrix4.CreateTranslation(_window.x, _window.y, 0) * FBOMatrix;
//Bind shader
shader.Bind(ref fbomatrix, DrawType);
//Some OpenGL setup nonsense, binding vertices and index buffer and telling OpenGL where in the vertex struct things are, pointers &c
GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer);
GL.EnableVertexAttribArray(shader.LocationPosition);
GL.VertexAttribPointer(shader.LocationPosition, 2, VertexAttribPointerType.Float, false, Stride, 0);
if (shader.LocationTexture != -1)
{
GL.EnableVertexAttribArray(shader.LocationTexture);
GL.VertexAttribPointer(shader.LocationTexture, 2, VertexAttribPointerType.Float, false, Stride, 8);
}
GL.EnableVertexAttribArray(shader.LocationColour);
GL.VertexAttribPointer(shader.LocationColour, 4, VertexAttribPointerType.UnsignedByte, true, Stride, 16);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);
//Draw the damn quad
GL.DrawArrays(DrawType, 0, Vertices.Length);
//Cleanup
GL.DisableVertexAttribArray(shader.LocationPosition);
if (shader.LocationTexture != -1)
GL.DisableVertexAttribArray(shader.LocationTexture);
GL.DisableVertexAttribArray(shader.LocationColour);
}
請問FBO有深度附件?我沒有看到它被附加在發佈的代碼中,但是您清除深度緩衝區的事實表明存在一個。 –
我不相信它,我不知道我知道一個是什麼.. –
我真的不明白你希望通過什麼建立一個多重採樣紋理0樣品來完成?這可能是因爲它不完整。 –