当前位置: 首页 > 面试题库 >

OpenGL通过FBO渲染到纹理—错误的显示与正常的纹理

姜育
2023-03-14
问题内容

屏幕外渲染到纹理绑定的屏幕外帧缓冲对象应该是微不足道的,但是我遇到了一个问题,我无法解决问题。

我的完整示例程序(目前仅2D!)在这里:

http://pastebin.com/hSvXzhJT

请参阅下面的一些说明。

我正在创建一个RGBBA纹理对象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中,这只是获得一个包含4个xy坐标的四边形(-1,-1 :: 1,-1 :: 1,1 :: -1,1)的VBO。

因此,尽管帧缓冲分辨率理论上应为512x512,但显然着色器遵循GL -1..1坐标范例将其“纹理”呈现到“全(非)屏幕四边形”上。

片段着色器:

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

因此,它设置了完全不透明的颜色,其中红色固定为0.25,绿色/蓝色取决于x / y,介于0和1之间。

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

这是我的屏幕外设置。在屏幕上,我还有一个真正的可见全屏四边形,它带有4个xyz坐标{-1,-1,1 ::: 1,-1,1 ::: 1,1,1,1 :::
-1,1, 1}。同样,现在这是2D,所以没有矩阵,因此z始终为1。

该四边形由其他着色器绘制,仅渲染给定的纹理,即教科书GL-101样式。在上面链接的示例程序中,我有一个简单的布尔切换doRtt,当它为false(默认值)时,根本不会执行“渲染到纹理”,并且此着色器仅显示当前目录中的使用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每周22-Feb-2012。


问题答案:

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

同样,当您使用FBO渲染rttFrameTex时,也无需绑定它。仅当您在着色器中读取纹理时,才需要绑定纹理。



 类似资料:
  • 所以我有一个非常简单的glsl着色器,可以用纹理和平行光渲染对象。 现在我有一个非常艰难的时间试图得到的纹理显示,其他一切工作,除此之外。 当我禁用着色器(glUseProgram(0))时,纹理以黑色和白色渲染,但当我启用它时,整个网格是单一颜色,没有纹理,当我尝试不同的纹理时,它会改变颜色。 这就是我加载纹理的方式 这就是我如何绑定我的纹理 这是我的顶点着色器 这是我的碎片着色器 最后但并非最

  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器:

  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位

  • 使用LWJGL的OpenGL版本1.1和2D纹理,我发现自己卡住了... 出于某种原因,LWJGL引擎不会在2D图层上渲染加载的纹理...相反,我得到了一个白色正方形... 我假设我很有可能在代码的某个地方遗漏了什么..以下是与此类事件相关的全部代码.. 加载OpenGL环境: 进入2D绘图模式(用于绘制纯色正方形的功能-通过glcolor函数进行测试,然后通过glvertex调用尺寸): 加载映

  • 我做了一个在上面渲染天空盒和粒子的应用程序。我想添加一些效果,我需要使用帧缓冲区来渲染天空盒、粒子颜色、深度和位置以分离纹理。然后我想使用简单的着色器来使用这些纹理中的值并以适当的方式混合它们。我为纹理、帧缓冲区和屏幕四边形(渲染简单的矩形)编写了辅助类,但不幸的是——当我尝试使用它时没有任何渲染。 当绑定帧缓冲区被注释掉时,我的场景如下所示: 修改着色器表明深度和位置值计算正确。因此问题在于纹理