OpenGL渲染

离屏渲染到纹理绑定的屏幕外帧缓冲区对象应该是如此微不足道,但我遇到了一个问题,我无法环绕我的头。

我的完整示例程序(仅适用于2D!)位于以下位置:

http://pastebin.com/hSvXzhJT

请参阅下面的一些说明。

我创建一个rgba纹理对象512x512,将它绑定到一个FBO。 在这一点上,不需要深度或其他渲染缓冲区,严格来说是2D。

以下非常简单的着色器呈现给这个纹理:

顶点着色器:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
    vPos = (aPos + 1) / 2;
    gl_Position = vec4(aPos, 0.0, 1.0);
}

在aPos中,这只是得到一个包含四个xy坐标的VBO(-1,-1 :: 1,-1 :: 1,1 :: -1,1)

因此,尽管帧缓冲区分辨率理论上应该是512x512,但明显地,着色器将其“纹理”渲染到“全屏幕(四屏)四边形”,遵循GLs -1..1协调范例。

片段着色器:

varying vec2 vPos;
void main (void) {
    gl_FragColor = vec4(0.25, vPos, 1);
}

所以它设置了一个完全不透明的颜色,红色固定在0.25和绿色/蓝色,取决于0和1之间的任何x / y。

在这一点上,我的假设是,渲染的512x512纹理仅显示-1..1全 - (关)屏幕四边形,片段为0..1的绿/蓝色阴影。

所以这是我的离屏设置。 在屏幕上,我还有另一个真正可见的全屏四元组,包含4个xyz坐标{-1,-1,1 ::: 1,-1,1 ::: 1,1,1 ...... -1,1, 1}。 再次,现在这是二维的,所以没有矩阵,所以z总是1。

这个四边形由不同的着色器绘制,只是渲染给定的纹理,文本书GL-101样式。 在我上面链接的示例程序中,我有一个简单的布尔切换doRtt,当这是false(默认)时,render-to-texture完全不会执行,并且此着色器仅显示当前目录中的使用texture.jpg。

这doRtt = false模式显示第二个屏幕四渲染器对于我当前的要求是“正确的”,并按照我的要求执行纹理处理:垂直和水平重复两次(稍后将被钳位,重复仅用于测试这里),否则缩放与没有纹理过滤或mipmapping。

因此,无论窗口(以及视图端口)如何调整大小,我们总是会看到一个全屏四边形,其中一个纹理水平重复两次,垂直两次。

现在,在doRtt = true的情况下,第二个着色器仍然可以完成它的工作,但是纹理从来没有完全正确地缩放 - 或者是绘制的,我不确定,因为不幸的是我们不能只说“嘿gl将这个FBO保存到磁盘调试目的“。

RTT着色器执行了一些局部渲染(或者可能是完整的渲染),特别是当您调整视口的尺寸比默认尺寸小很多时,您会看到纹理之间的中断重复,并不是所有颜色都是我们非常简单的RTT片段着色器所预期的。

(A):512x512纹理被正确创建,但没有被我的代码正确映射(但是为什么doRtt = false使用完全相同的简单纹理四色着色器显示的任何给定的texture.jpg文件都很好?)

(B)或:512x512纹理渲染不正确,rtt碎片着色器根据窗口分辨率改变其输出 - 但为什么? 对于x和y,屏幕四边形总是在-1..1处,顶点着色器总是将这个映射到片段坐标0..1,对于这个简单的测试,RTT纹理始终保持在512x512!

请注意,屏幕四方和屏幕四方都不会更改其坐标,并且始终为“全屏”(两个维度均为-1..1)。

再次,这应该是如此简单。 我究竟在想什么?

规格:OpenGL 4.2(但代码显然不需要任何4.2功能!),Nvidia Quadro 5010M,openSuse 12.1 64bit,Golang Weekly 22-Feb-2012。


首先 - 尝试检查OpenGL错误。 在每个OpenGL函数之后调用glGetError()。 你也必须为绘图设置正确的视口。 在绘制到FBO之前调用glViewport(0,0,512,512)。 在绘制屏幕前调用glViewport(0,0,display_width,display_height)。

当你使用FBO进行渲染时,也不需要绑定rttFrameTex。 只有在读取着色器中的纹理时才需要绑定纹理。

链接地址: http://www.djcxy.com/p/34053.html

上一篇: OpenGL render

下一篇: Render to Texture OpenGL ES 2.0