Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL通过FBO渲染到纹理--与正常纹理相比显示不正确_Opengl_Go_Framebuffer_Render To Texture_Off Screen - Fatal编程技术网

OpenGL通过FBO渲染到纹理--与正常纹理相比显示不正确

OpenGL通过FBO渲染到纹理--与正常纹理相比显示不正确,opengl,go,framebuffer,render-to-texture,off-screen,Opengl,Go,Framebuffer,Render To Texture,Off Screen,对纹理绑定的屏幕外帧缓冲区对象进行屏幕外渲染应该非常简单,但我遇到了一个无法解决的问题 我的完整示例程序(目前仅限于2D!)如下: 请参阅下面的部分描述 我正在创建一个rgba纹理对象512x512,将其绑定到FBO。此时不需要深度或其他渲染缓冲区,严格来说是二维的 以下极其简单的着色器渲染到此纹理: 顶点着色器: varying vec2 vPos; attribute vec2 aPos; void main (void) { vPos = (aPos + 1) / 2;

对纹理绑定的屏幕外帧缓冲区对象进行屏幕外渲染应该非常简单,但我遇到了一个无法解决的问题

我的完整示例程序(目前仅限于2D!)如下:

请参阅下面的部分描述

我正在创建一个rgba纹理对象512x512,将其绑定到FBO。此时不需要深度或其他渲染缓冲区,严格来说是二维的

以下极其简单的着色器渲染到此纹理:

顶点着色器:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
    vPos = (aPos + 1) / 2;
    gl_Position = vec4(aPos, 0.0, 1.0);
}
在aPos中,这只会得到一个VBO,其中包含四元组的4个xy坐标(-1,-1::1,-1::1,1::-1,1)

因此,尽管从理论上讲帧缓冲区分辨率应该为512x512,但着色器显然会按照GLs-1..1 coords范式将其“纹理”渲染到“全屏幕(离屏)四元体”上

片段着色器:

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}。同样,现在这是2D,所以没有矩阵,所以z总是1

该四边形由不同的着色器绘制,只需渲染给定的纹理,即课本GL-101样式。在我上面链接的示例程序中,我有一个简单的布尔切换doRtt,如果该值为false(默认值),则根本不执行“渲染到纹理”,该着色器仅显示当前目录中的uses texture.jpg

此doRtt=false模式显示第二个屏幕上的四元渲染器“正确”符合我当前的要求,并按我的要求执行纹理:垂直重复两次,水平重复两次(稍后将被钳制,重复仅用于此处测试),否则缩放时不使用纹理过滤或mipmapping

因此,无论窗口(以及视图端口)的大小如何调整,我们都会看到一个具有单个纹理的全屏四元结构,在水平方向上重复两次,在垂直方向上重复两次

现在,使用doRtt=true,第二个着色器仍能完成其工作,但纹理从未完全正确缩放或绘制,这一点我不确定,因为不幸的是,我们不能只说“嘿,gl将此FBO保存到磁盘以进行调试”

RTT着色器确实执行部分渲染(或者可能是完整渲染,同样无法确定屏幕外发生了什么…),特别是当您将视口的大小调整为比默认大小小得多时,您会看到纹理重复之间的中断,并且并非我们非常简单的RTT片段着色器中预期的所有颜色都会显示出来

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

(B) 或者:512x512纹理未正确渲染,rtt frag着色器会根据窗口分辨率以某种方式更改其输出,但为什么?对于x和y,屏幕外四元始终为-1..1,顶点着色器始终将其映射到片段坐标0..1,对于此简单测试,RTT纹理始终保持在512x512

请注意,屏幕外四元和屏幕上四元都不会改变坐标,始终是“全屏”(-1..1)

同样,这应该很简单。我到底错过了什么


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

首先-尝试检查OpenGL错误。在每个OpenGL函数之后调用glGetError()。此外,还必须为图形设置正确的视口。在绘制到FBO之前,请调用glViewport(0、0、512、512)。在绘制到屏幕之前,调用GLVIEW(0,0,显示宽度,显示高度)


另外,在使用FBO渲染rttFrameTex时,不需要绑定rttFrameTex。仅当您在着色器中读取纹理时才需要绑定纹理。

如果Pastebin已关闭,则此处也会显示完全相同的源文件:--路径中也有一个texture.jpg。这就是所需的全部!令人惊讶的是,thx花了一些时间来帮助我在这一点上-我做了“查看端口的实验”之前没有用,但现在它立即工作,再次感谢!声望大于等于15的人能投票给毛利人吗?