来自 flyfish|已发表 2020-10-27
深度纹理可以通过两种模式进行采样, 第一种是按传统的纹理采样模式直接采样来获取深度值,这将会返回一个单浮点数vec4 类型的值。也可以使用比较模式(comparison mode) 模式来采样深度纹理。使用比较模式时,我们需要指定一个参考值(reference value) , 该参考值与从深度纹理中采样的深度值进行比较,为了使参考值与采样的深度值进行比较,我们还需要设置一个比较函数(comparison function),比较结果只有R值是比较结果。测试成功,返回 1.0f, 测试失败,返回0.0f.
当使用线性过滤器去采样时,采用结果是由硬件设备的实现来定义的,一般比较模式的返回值的范围是[0 , 1.0]之间, 这种采样方式称为百分比渐进采样方式“percentage Closer Filering”.
如果纹理是归一化的整型值,那么传入的参考值也将被归一化到[0,1]的范围内去匹配纹理值。否则参考值不会被归一化到[0,1]的区间.
使用比较模式需要专门做两方面的设置,首先GLSL中纹理的采样必须是阴影采样器,也就是这种模式专门针对的是阴影的采样,其次激活的深度纹理关联的采样器要开启比较模式。
要将纹理设置成比较模式,需要设置纹理比较模式GL_TEXTURE_COMPARE_MODE 设置成 GL_COMPARE_REF_TO_TEXTURE, 把纹理比较函数 GL_TEXTURE_COMPARE_FUNC 设置成 GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL , GL_NOT_EQUAL, GL_GEQUAL, GLGREATER 之一, 比较方式:
ref OPERATOR texture
如果设置比较函数为 GL_LESS, 当 参考值 ref 小于 采样的纹素值的情况下,测试通过时, 采样器将会返回非零的值——百分比渐进的采样方式[0,1] 或 0、1 值 。