好的,所以这里是我目前的渲染工作流程。我创建了一个没有深度/模板附件且只有颜色纹理附件的帧缓冲对象。我绑定了framebuffer并将所有纹理渲染到它上面。然后我将纹理数据从渲染缓冲区纹理复制到另一个纹理(尽管这部分并不真正相关,因为渲染到帧缓冲区时会出现问题)。所以问题是,一旦渲染超过窗口边界,它将停止绘制。因此,这里的什么是当前呈现的图像(抱歉,我不得不发布链接,我没有足够的声誉还没有发表图片):OpenGL FrameBuffer没有渲染屏幕外
而这里的实际纹理数据的图像(提供由gDEBUgger)。
正如你所看到的,它切断部分就是窗口宽度。使用glClear
也只覆盖纹理的窗口大小,没有别的。 我曾尝试使用glDisable(GL_SCISSOR_TEST)
以及glViewport(0, 0, texture_width, texture_height)
,但它仍然会切断纹理。使视口在同一点处更小,从而使其更大,只是拉伸图像并切掉更多纹理。
我的意思是说,当你甚至不能看到它们时,为什么要在屏幕外画像素,这对性能来说会很糟糕。但就我而言,我需要这样做。这就是为什么我正在寻找一种方法来禁用它或类似的东西。
另请注意,我已禁用深度测试,因此无法将深度清除超过窗口范围,因为我禁用了它。
任何人有任何想法?
编辑:以防万一任何人看到这个线程在未来,只是想说什么解决了我。我只需要将视口设置为纹理的大小,并在渲染时将透视矩阵缩放为相同的大小。就我而言,我使用了自己的矩阵类。例如:
glViewport(0, 0, texture_width, texture_height);
perspective_mat.identity();
perspective_mat.scale(1.0f/(texture_width/2), -1.0f/(texture_height/2));
perspective_mat.translate(-1.0f, 1.0f);
如果您使用的是固定管道的东西(无着色器等),那么您可以使用openGL矩阵函数进行缩放和转换。 :)
嗯,因某些原因被现在的工作。设置视口后,我一定错过了它的工作,但不完全确定如何。但无论如何,感谢您的帮助,我会标记为无论如何解决。 :) – QualityPixels 2015-02-08 09:57:38