c++ - OpenGL 模板测试发生在片段程序运行之前还是之后?

标签 c++ graphics winapi fragment-shader stencil-buffer

当我设置 glStencilFunc( GL_NEVER, ... ) 有效地禁用所有绘图,然后运行我的 [shader-bound] 程序时,与让片段着色器运行相比,我没有得到任何性能提升。我认为模板测试发生在片段程序之前。事实并非如此,或者至少不能保证?用一个简单地将常量写入 gl_FragColor 的片段着色器替换片段着色器确实会导致更高的 FPS。

最佳答案

实际上两者兼而有之。正如您在此 OpenGL ES 2.0 pipeline diagram 中所见,每个片段操作应该在片段程序之后发生.然而,许多现代图形卡都有早期 z 测试,只要您不写入片段着色器的深度,它就会更早地丢弃片段。

这是一个paper from AMD/ATI that talks about such tests .我记得读过规范允许早期测试,只要在着色器产生与之后执行它们相同的结果之前进行测试,这就是为什么您不想修改深度或丢弃着色器中的片段。这thread on OpenGL forums对此有一些有趣的讨论。

关于c++ - OpenGL 模板测试发生在片段程序运行之前还是之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756273/

相关文章:

c++ - C++ 标准是否保证 "a" "b"被合并到 "ab"?

具有动态选择的 C++ 模板类型

qt - 在具有反转 y 轴的 QPainter 上绘制 QImage

graphics - 有效计算视线和一组对象之间的第一个交点的最佳方法是什么?

windows - 使用 Desktop Duplication API 捕获登录和锁定屏幕

c++ - c++中 vector 容器的大小和调整大小函数

C++ Socket 检索和发送加密数据

java - 我应该使用什么来显示游戏图形?

c++ - Windows I/O 驱动程序中的主动等待

c - 如何将 "split"long WndProc方法转成多个函数?