Я делаю 2D-игры в OpenTK (оболочка C# для OpenGL 4), и все было хорошо, за исключением зубчатых краев многоугольников и вещей, прыгающих и заикающихся, вместо того чтобы двигаться плавно - так что я Я пытаюсь добавить в multisampling к antialias свои текстуры.OpenGL 4 мультисэмплинг с FBO - FBO неполным
У меня есть несколько камер, которые отображают все их объекты сцены на текстуру FrameBufferObject (я бы хотел, чтобы это был MSAA), которые затем все нарисованы на экране (без необходимости мультисэмплирования), один поверх другого.
Без мультисэмплинга он работал нормально, но теперь я попытался изменить все мои вызовы Texture2D на Texture2DMultisample и т. Д., Но теперь я получаю ошибки FBO Not Complete, и это неправильно. Я считаю, что мне тоже нужно изменить свои шейдеры, но я хочу сначала решить эту проблему.
В приведенном ниже коде приведено несколько классов, таких как текстура, которые я создал, но я не думаю, что это должно повлиять на это, и я не хочу загромождать сообщение - при необходимости предоставит детали 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 образцами? Вероятно, поэтому он неполный. –