关于glColorMask及其工作的快速问题

时间:2011-02-09 19:06:45

标签: c++ opengl graphics 3d glsl

我想渲染深度缓冲区来做一些不错的阴影贴图。我的绘图代码虽然包含许多着色器开关。如果我设置glColorMask(0,0,0,0)并保留所有着色器程序,纹理和其他原样,并只渲染深度缓冲区,它会'OK'吗?我的意思是,如果glColorMask禁用“写入颜色分量”,是否意味着每个片段着色不会被执行

3 个答案:

答案 0 :(得分:2)

为了渲染阴影贴图,您通常需要将深度纹理(最好是正方形和2的幂,因为立体声驱动程序将其作为提示!)绑定到FBO并使用一个着色器(尽可能简单)一切。您不希望附加颜色缓冲区,因为您根本不对颜色感兴趣,并且它对ROP施加了更多不必要的压力(此外,某些硬件可以仅使用深度渲染倍速或更高速度)。您不希望在许多着色器之间切换。

根据您是使用“经典”阴影贴图还是更复杂的指针阴影贴图,您将使用的着色器尽可能简单(常量颜色,无深度写入)或执行一些(中等复杂的)深度计算,但您通常不希望执行任何颜色计算,因为这将意味着无论以何种方式都不可见的不必要的计算。

答案 1 :(得分:1)

不,着色器程序独立于固定功能管道执行。设置glColorMask对着色器程序没有影响。

答案 2 :(得分:1)

不,无论如何都会执行片段操作,但是他们的结果会被你的零色面罩压扁。

如果您不想执行某些片段操作 - 请使用附加了空片段着色器的正确着色器程序,并将绘制缓冲区设置为GL_NONE。

还有另一种方法可以禁用片段处理 - 启用GL_RASTERIZER_DISCARD,但在这种情况下你甚至不会得到深度值:)

相关问题