纹理比较模式 Texture Comparison Modes
纹理值也可以根据指定的比较函数进行计算。纹理参数TEXTURE_COMPARE_MODE
指定了比较的操作数,参数TEXTURE_COMPARE_FUNC
指定了比较函数。
深度纹理比较模式 Depth Texture Comparison Mode
如果当前绑定纹理的基础内部格式为DEPTH_COMPONENT
或DEPTH_STENCIL
,那么TEXTURE_COMPARE_MODE
和TEXTURE_COMPARE_FUNC
将按照以下描述控制纹理单元的输出。否则,纹理单元将以正常方式运作,跳过纹理比较。
假设Dt
为深度纹理值,St
为模板索引组件。如果没有模板组件,St
的值未定义。令Dref
为着色器纹理查找函数提供的参考值。如果纹理的内部格式指示为定点深度纹理,则Dt
和Dref
会被限制在[0, 1]范围内;否则不进行任何钳位操作。
接下来,按照以下方式计算有效纹理值:
- 如果基础内部格式为
STENCIL_INDEX
,则r
=St
。 - 如果基础内部格式为
DEPTH_STENCIL
,且DEPTH_STENCIL_TEXTURE_MODE
的值为STENCIL_INDEX
,则r
=St
。 - 否则,如果
TEXTURE_COMPARE_MODE
的值为NONE
,则r
=Dt
。 - 否则,如果
TEXTURE_COMPARE_MODE
的值为COMPARE_REF_TO_TEXTURE
,则r
依赖于纹理比较函数,具体如Table 8.23
所示。
得到的结果r
将被赋给Rt
。
如果TEXTURE_MAG_FILTER
的值不是NEAREST
,或者TEXTURE_MIN_FILTER
的值不是NEAREST
或NEAREST_MIPMAP_NEAREST
,那么r
可能通过比较多个深度纹理值与纹理参考值来计算得出。这一过程的具体细节取决于实现,但r
应该是一个在[0, 1]范围内的值,与其通过比较成功的次数或失败次数成比例。
Texture Comparison Function | Computed result r |
---|---|
LEQUAL | r = ( Dref ≤ Dt) ? 1.0 : 0.0 |
GEQUAL | r = ( Dref ≥ Dt) ? 1.0 : 0.0 |
LESS | r = (Dref < Dt) ? 1.0 : 0.0 |
GREATER | r = (Dref > Dt) ? 1.0 : 0.0 |
EQUAL | r = (Dref = Dt) ? 1.0 : 0.0 |
NOTEQUAL | r =(Dref != Dt) ? 1.0 : 0.0 |
ALWAYS | r = 1.0 |
NEVER | r = 0.0 |
Table 8.23: Depth texture comparison functions