[英]OpenGL Full Depth With Partial Color Write
我正在制作一个程序,在两个单独的通道中渲染地形,中间清除深度(无法更改此要求)。 在第一遍中,我使用深度测试来渲染天空盒和地形。 我将深度缓冲区位清除为1.0。 然后,我也用深度测试渲染我所有的近地。 所以代码看起来像这样:
// My State
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ZERO);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glClearColor(0, 0, 0, 0);
glClearDepth(1.0);
// Pass 1
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
DrawSkybox();
DrawFarTerrain();
// Pass 2
glClear(GL_DEPTH_BUFFER_BIT);
DrawNearTerrain(); // IMPORTANT: All done in one draw command
以下图像显示每次传递结束时的颜色值和深度(白色= 1.0):
通过1 通过2
如您所见,在第二次传递的单个绘制命令中,像素值正在深度缓冲区中写入,但颜色缓冲区仅部分写入。 白色区域会引起一些奇怪的问题。
根据GDebugger的说法,这是我在绘制命令期间的状态:
谁能告诉我发生了什么事? 我觉得GPU对我不利。
编辑:
好吧,我和遇到类似错误的人交谈过,我在这个过程中解决了这个问题。
事实证明,第一遍结束时白色部分的所有部分都不是白色,而是现实中的NaN。 GDEBugger将值显示为(255,255,255,255),因为它不能支持显示任何其他纹理格式。 它只是说:“NaN,你必须指的是白色:P”。
好吧,如果我们正在进行像素替换,为什么NaN很重要 - glBlendFunc(GL_ONE,GL_ZERO)。 这是因为NaN上的操作仍然导致NaN在整个管道中向下流动。 GL实现仍然执行“Result = SourceFactor * Source + DestFactor * Dest” - 不执行任何优化。
关于修复......事实证明在片段阶段执行“outFragColor = clamp(outFragColor,vec4(0.0),vec4(3000000000000.0))”(outFragColor是像素返回值)将不会导致NaN甚至虽然outFragColor包含NaNs。 去搞清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.