Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 后续纹理读取和写入的问题_Opengl_Fbo_Read Write_Shadow Mapping_Deferred Rendering - Fatal编程技术网

Opengl 后续纹理读取和写入的问题

Opengl 后续纹理读取和写入的问题,opengl,fbo,read-write,shadow-mapping,deferred-rendering,Opengl,Fbo,Read Write,Shadow Mapping,Deferred Rendering,在我的渲染管道(OpenGL 3.3 core)中,我有以下循环(伪代码): 当n=1时,一切正常。但是,当n=2时,第一次渲染不正确 我怀疑render to texture T在上一个render to back buffer完成T的采样之前开始写入T 将glFlush()放置到循环结束后,渲染是正确的,但是FPS略有下降。在互联网上的任何地方,我都不断发现“如果你需要使用glFlush(),那么你可能做错了什么” 我是否正确识别了问题?在这种情况下,glFlush()是正确的解决方案吗?

在我的渲染管道(OpenGL 3.3 core)中,我有以下循环(伪代码):

n=1
时,一切正常。但是,当
n=2
时,第一次渲染不正确


我怀疑
render to texture T
在上一个
render to back buffer
完成
T
的采样之前开始写入
T

glFlush()
放置到循环结束后,渲染是正确的,但是FPS略有下降。在互联网上的任何地方,我都不断发现“如果你需要使用glFlush(),那么你可能做错了什么”

我是否正确识别了问题?在这种情况下,
glFlush()
是正确的解决方案吗?在每次迭代中使用不同的纹理(我知道
n
)会是更好的解决方案吗

它发生在GTX580上,但不发生在ATI Mobility Radeon 3470上


我的背景-详情:

我有两个灯和g缓冲区(FBO)。在每次迭代中,我使用一个灯光及其阴影贴图(另一个FBO,纹理
T
-对所有灯光都是相互的)进行延迟着色,其中
n
是许多灯光。在
render to back buffer
I中累积灯光

在下图中,我没有积累光线。相反,我将第一次迭代渲染到左视口,第二次渲染到右视口来演示问题


我不确定我是否听懂了。对所有灯光使用相同的阴影贴图纹理的动机是什么?你应该考虑使用足够的单独的阴影贴图纹理为每一个被允许在你的场景中投射阴影的光。您可以通过这种方式分期更新(例如,较不频繁地更新远处灯光的阴影贴图,或每帧更新一半贴图),如果您在照明之前而不是照明期间专门构建阴影贴图,则可以使用计时器查询在整帧中构建阴影贴图所需的时间。好的,我只是没有意识到这种异步性甚至可能发生,所以使用另一种纹理对我来说就像是在浪费内存。在我的渲染器中,我创建阴影贴图,然后将其指定给灯光-这样多个灯光可以共享一个阴影贴图,但它们不必共享(这样我就可以拥有具有不同分辨率、更新频率等的阴影贴图)。在我当前的设置中,我只有一个由两个灯光共享的阴影贴图。我可以创建另一个阴影贴图,但它的属性完全相同。为了清楚起见,我稍微编辑了原始问题。也许“回收”仍然没有抓住要点(这不是太多的内存)。另外,如果我为每个灯光使用另一个纹理,但为着色过程将其绑定到相同的纹理单元,我不能运行到类似的问题吗?例如,将新纹理绑定到仍在使用的纹理单元?好吧,我仍然不明白您是如何在同一过程中读取和写入阴影贴图的?撇开其他事情不谈,这对我来说毫无意义。你在这段代码的第二行写下阴影贴图,然后大概drawFullScreenQuad就是你进行照明和阅读阴影贴图的地方。在什么时候,你曾经在同一个操作中阅读和写作?如果你有小故障,这不是根源,除非你的司机出了问题。传统的纹理采样保证了连贯性。没错,这里显示的伪影表明NV硬件上存在反馈回路。这个问题经常出现,并且由于某种原因,在NV硬件上看起来总是这样(AMD遇到这个问题时,没有一个规则模式)。。。你昨天链接到的代码怎么了?当我有空闲时间的时候,我正打算仔细看一看。我不确定我是否能跟上。对所有灯光使用相同的阴影贴图纹理的动机是什么?你应该考虑使用足够的单独的阴影贴图纹理为每一个被允许在你的场景中投射阴影的光。您可以通过这种方式分期更新(例如,较不频繁地更新远处灯光的阴影贴图,或每帧更新一半贴图),如果您在照明之前而不是照明期间专门构建阴影贴图,则可以使用计时器查询在整帧中构建阴影贴图所需的时间。好的,我只是没有意识到这种异步性甚至可能发生,所以使用另一种纹理对我来说就像是在浪费内存。在我的渲染器中,我创建阴影贴图,然后将其指定给灯光-这样多个灯光可以共享一个阴影贴图,但它们不必共享(这样我就可以拥有具有不同分辨率、更新频率等的阴影贴图)。在我当前的设置中,我只有一个由两个灯光共享的阴影贴图。我可以创建另一个阴影贴图,但它的属性完全相同。为了清楚起见,我稍微编辑了原始问题。也许“回收”仍然没有抓住要点(这不是太多的内存)。另外,如果我为每个灯光使用另一个纹理,但为着色过程将其绑定到相同的纹理单元,我不能运行到类似的问题吗?例如,将新纹理绑定到仍在使用的纹理单元?好吧,我仍然不明白您是如何在同一过程中读取和写入阴影贴图的?撇开其他事情不谈,这对我来说毫无意义。你在这段代码的第二行写下阴影贴图,然后大概drawFullScreenQuad就是你进行照明和阅读阴影贴图的地方。在什么时候,你曾经在同一个操作中阅读和写作?如果你有小故障,这不是根源,除非你的司机出了问题。传统的纹理采样保证了连贯性。没错,这里显示的伪影表明NV硬件上存在反馈回路。这个问题经常出现,并且由于某种原因,在NV硬件上看起来总是这样(AMD遇到这个问题时,没有一个规则模式)。。。你昨天链接到的代码怎么了?我要结束了
for 1..n:
  render to texture T
  bind texture T
  render to back buffer (with texture T sampled in the fragment shader)