Почему я получаю белый квадрат с фреймбуфером?

Я пытаюсь добавить использование кадровых буферов в свой проект OpenGL (OpenTK).

В метод инициализации я добавил в самом начале: this.RenderBufferTex = GL.GenTexture();

GL.BindTexture(TextureTarget.Texture2D, this.BufferTex);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, this.glc.Width, this.glc.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero);
GL.BindTexture(TextureTarget.Texture2D, 0);

GL.GenFramebuffers(1, out this.Buffer);
GL.BindFramebuffer(FramebufferTarget.FramebufferExt, this.Buffer);
GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, this.BufferTex, 0);

this.glc — это GLControl, в котором запускается сцена.

Перед рендерингом я добавил

GL.BindFramebuffer(FramebufferTarget.Framebuffer, this.Buffer);

затем GL.Clear() и весь мой старый код для рисования сцены.

И затем метод для отображения отрендеренной сцены:

GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.Disable(EnableCap.DepthTest);
GL.Disable(EnableCap.Lighting);
GL.Disable(EnableCap.LineSmooth);
GL.Disable(EnableCap.PointSmooth);
GL.MatrixMode(MatrixMode.Projection);
GL.PushMatrix();
GL.LoadIdentity();
GL.Ortho(0.0, (double)this.glc.Width, 0.0, (double)this.glc.Height, 0.0, 10000.0);
GL.MatrixMode(MatrixMode.Modelview);
GL.PushMatrix();
GL.LoadIdentity();

GL.BindTexture(TextureTarget.Texture2D, this.BufferTex);
GL.Begin(BeginMode.Quads);
GL.TexCoord2(0, 0);
GL.Vertex2(0, 0);
GL.TexCoord2(1, 0);
GL.Vertex2(this.glc.Height, 0);
GL.TexCoord2(1, 1);
GL.Vertex2(this.glc.Height, this.glc.Width);
GL.TexCoord2(0, 1);
GL.Vertex2(0, this.glc.Width);
GL.End();

GL.PopMatrix();
GL.MatrixMode(MatrixMode.Projection);
GL.PopMatrix();
GL.Enable(EnableCap.DepthTest);
this.glc.SwapBuffers();

В результате я получаю белый квадрат, заполняющий левую часть моего экрана (поэтому он кажется квадратным по высоте моего экрана).

Что я делаю не так?


person Cobra_Fast    schedule 06.03.2011    source источник


Ответы (1)


Вам нужно установить GL_MIN_FILTER и GL_MAG_FILTER вашей текстуры на что-то разумное, например GL_LINEAR или GL_NEAREST, по умолчанию используются MIP-карты, и это делает текстуру неполной.

person Dr. Snoopy    schedule 06.03.2011
comment
Еще один: как изменить разрешение фреймбуфера? - person Cobra_Fast; 06.03.2011
comment
@Cobra_Fast Вы должны задать еще один вопрос для этого. - person Dr. Snoopy; 06.03.2011