作者:Nin+.Lee
* 本文属原创,转载请注明出处。
在GLSL中,存在着sampler2D和sampler2DShadow两种2D贴图采样器。在对一个深度贴图(指内部格式为GL_DEPTH_COMPONENT或GL_DEPTH_STENCIL的贴图)进行采样时,可以使用前述两种2D贴图采样器其中的一种进行采样。对两种2D贴图采样器取舍,与贴图对比模式(Texture Comparison Modes)有关。
OpenGL 4.2提供了两种贴图对比模式,分别为普通对比模式(GL_NONE)和引用到贴图对比模式(GL_COMPARE_REF_TO_TEXTURE)。可以通过设置贴图参数GL_TEXTURE_COMPARE_MODE来改变比较模式,改参数的默认值是普通对比模式(GL_NONE)。
如果选择普通对比模式(GL_NONE)作为当前对比模式,则在GLSL着色器脚本中,必须使用sampler2D作为贴图采样器。此时,深度贴图会像颜色纹理贴图一样进行采样。用于采样的贴图坐标是一个2D的向量,采样的结果是一个4D向量,每个分量都包含着同样的单精度深度值。
如果选择引用到贴图对比模式(GL_COMPARE_REF_TO_TEXTURE)作为当前对比模式,则在GLSL着色脚本中,必须使用sampler2DShadow作为贴图采样器。此时,用于采样的贴图坐标是一个3D向量。这个3D向量的x分量和y分量用于查找深度贴图中的深度值,而z分量将作为参考值(Reference Value)和找到的深度值进行深度测试。测试的结果取决于比较函数。可以通过设置贴图参数GL_ TEXTURE_COMPARE_FUNC来改变比较函数,默认值是GL_LEQUAL。如果测试通过,则采样结果返回1.0,否则返回0.0。如果深度贴图使用了线性过滤,那么返回值是实现相关的。但是返回值应该在[0, 1]区间上。
在编程时,如果未按照上述原则正确使用相应的贴图采样器和贴图比较模式,将产生未定义的结果。
注意:如果深度贴图的内部格式是归一化整数时,那么其内部的深度值会被映射到[0, 1] 区间上。用于比较的参考值必须被映射到[0, 1] 区间后,再和深度贴图中保存的深度值比较才有意义。
参考文献
- OpenGL Wiki, http://www.opengl.org/wiki/Sampler_Object#Comparison_mode
- The OpenGL Shading Language Specification Version 4.2, p.139, 8.9 Texture Functions
- The OpenGL Graphics System: A Specification Version 4.2, p.260, 3.9.17 Texture Comparison Modes