繁体   English   中英

具有部分颜色写入的OpenGL全深度

[英]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 通过1种颜色通过1深度 通过2 通过2颜色通过2深度

如您所见,在第二次传递的单个绘制命令中,像素值正在深度缓冲区中写入,但颜色缓冲区仅部分写入。 白色区域会引起一些奇怪的问题。

根据GDebugger的说法,这是我在绘制命令期间的状态:

  • GL_BLEND:是的
  • GL_BLEND_EQUATION_ALPHA:GL_FUNC_ADD
  • GL_BLEND_EQUATION:GL_FUNC_ADD
  • GL_BLEND_EQUATION_RGB:GL_FUNC_ADD
  • GL_BLEND_DST:0
  • GL_BLEND_DST_ALPHA:0
  • GL_BLEND_DST_RGB:0
  • GL_BLEND_SRC:1
  • GL_BLEND_SRC_ALPHA:1
  • GL_BLEND_SRC_RGB:1
  • GL_DEPTH_FUNC:GL_LESS
  • GL_DEPTH_TEST:是的
  • GL_STENCIL_FUNC:GL_ALWAYS
  • GL_STENCIL_TEST:FALSE
  • GL_BLEND_COLOR:{0,0,0,0}

谁能告诉我发生了什么事? 我觉得GPU对我不利。

编辑:

  • 我目前有一个活着的GL上下文。
  • 我的卡是英特尔HD 4000,最新的驱动程序运行在具有8 GB RAM的Intel i7上。
  • MY FBO的颜色附件的内部格式为GL_RGBA16F,深度附件为GL_DEPTH_COMPONENT32F。
  • 从不使用模板测试。

好吧,我和遇到类似错误的人交谈过,我在这个过程中解决了这个问题。

事实证明,第一遍结束时白色部分的所有部分都不是白色,而是现实中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM