纹理缩小 Texture Minification
将纹理应用到图元意味着从纹理图像空间到帧缓冲图像空间的映射。一般来说,这种映射涉及对采样的纹理图像进行重构,然后通过映射到帧缓冲区空间所隐含的齐次变形,接着进行滤波,最后在应用到片段之前对经过滤波、变形、重构的图像进行重新采样。在OpenGL中,这种映射由两种简单的过滤方案之一来近似。其中一种方案是根据从纹理空间到帧缓冲空间的映射是否被认为放大或缩小纹理图像而选择的。
当纹理的 TEXTURE_MAX_ANISOTROPY
值等于 1.0 时,OpenGL 使用本节和第 8.15 节中描述的各向同性纹理过滤方法。然而,当纹理的 TEXTURE_MAX_ANISOTROPY
值大于 1.0 时,OpenGL 应该使用一个考虑到纹理各向异性的纹理过滤方案,该程度不超过纹理 TEXTURE_MAX_ANISOTROPY
的值或 MAX_TEXTURE_MAX_ANISOTROPY
的值中较小的一个。
各向异性纹理过滤方案的具体实现取决于实现。此外,实现可以考虑当前的纹理缩小和放大模式来控制所使用的各向异性过滤方案的具体细节。
各向异性纹理过滤方案只能访问当缩小滤波器需要使用纹理层级时的mipmap
级别。此外,当指定了一个缩小滤波器时,各向异性纹理过滤方案只能访问纹理的 TEXTURE_BASE_LEVEL
和 TEXTURE_MAX_LEVEL
之间的纹理 mipmap
级别,包括这两个级别。实现还应该在各向异性纹理过滤方案允许的范围内尊重 TEXTURE_MAX_LOD
和 TEXTURE_MIN_LOD
的值。
比例因子和细节水平 Scale Factor and Level-of-Detail
尺度因子(Scale Factor)和细节级别(Level-of-Detail, LOD)在纹理采样中扮演重要角色。尺度因子ρ(x, y)用来衡量在屏幕上某一点(x, y)对应的纹理坐标变化对最终采样纹理的影响程度,它直接影响着纹理在屏幕上呈现的大小和清晰度。在计算尺度因子时,通常会利用到纹理坐标对屏幕坐标的导数信息,以求得合适的采样区域大小。
细节级别λ则是决定从纹理的哪个mipmap层级进行采样的关键参数。它反映了当前视角下纹理细节需求的程度,较大的λ值表示需要查看纹理的大致轮廓,此时可能从较低分辨率(较大范围)的mipmap层级采样;较小的λ值则表明需要观察纹理的细部特征,此时可能从较高分辨率(较小范围)的mipmap层级采样。
在OpenGL中,细节级别λ的计算通常涉及尺度因子ρ、基础LOD参数λbase、纹理LOD偏差(TEXTURE_LOD_BIAS)以及可编程的LOD偏移(通过着色器中的偏移参数提供)。这些参数共同作用,确定最终采样时所选用的mipmap层级,从而在纹理放大(magnification)和缩小(minification)时实现合适的纹理过滤效果。
纹理坐标环绕与纹素选择 Coordinate Wrapping and Texel Selection
Wrap mode | Result of wrap(coord) |
---|---|
CLAMP_TO_EDGE | clamp( coord, 0, size − 1 ) |
CLAMP_TO_BORDER | clamp( coord, −1, size ) |
REPEAT | coord mod size |
MIRRORED_REPEAT | (size − 1) − mirror( coord mod (2 × size)) − size ) |
MIRROR_CLAMP_TO_EDGE | clamp( mirror(coord), 0, size − 1 ) |
Table 8.20: Texel location wrap mode application. mirror(a) returns a if a ≥ 0, and −(1 + a) otherwise. The values of mode and size are TEXTURE_WRAP_S and ws, TEXTURE_WRAP_T and hs, and TEXTURE_WRAP_R and ds when wrapping i, j, or k coordinates, respectively
渲染反馈循环 Rendering Feedback Loops
多重纹理映射 Mipmapping
手动Mipmap生成 Manual Mipmap Generation
可以使用以下命令为纹理对象手动生成Mipmap:
void glGenerateMipmap( enum target );
void glGenerateTextureMipmap( uint texture );
对于GenerateMipmap
函数,其对应的纹理对象是绑定至target
的目标。而对于GenerateTextureMipmap
函数,texture
参数即为纹理对象的名称。
target
或 texture
的有效目标必须是以下之一:TEXTURE_1D
, TEXTURE_2D
, TEXTURE_3D
, TEXTURE_1D_ARRAY
, TEXTURE_2D_ARRAY
, TEXTURE_CUBE_MAP
, 或 TEXTURE_CUBE_MAP_ARRAY
。
如果target
或texture
的有效目标是TEXTURE_CUBE_MAP
或TEXTURE_CUBE_MAP_ARRAY
,则相应的纹理对象必须分别满足立方体贴图完整或立方体贴图数组完整的要求,这些定义可在第8.17节找到。否则,若未定义levelbase
,或任何维度值为0,则所有Mipmap层级保持不变,但这并不是错误状态。
Mipmap生成会用基于levelbase
层级图像派生出的图像替换从levelbase+1
到q
的所有纹理图像层级,不论它们之前的内容为何。除此之外的所有其他Mipmap层级,包括levelbase
层级,都会在这个计算过程中保持不变。
派生出的Mipmap纹理图像的内部格式和边框宽度都与levelbase
层级图像相同,而且派生图像的尺寸遵循第8.17节所描述的规定要求。
派生图像的内容通过反复过滤降采样levelbase
层级图像而计算得出。对于一维和二维数组纹理以及立方体贴图数组纹理,每一层都会独立地进行过滤。虽然并未规定特定的滤波算法,但推荐默认使用盒式滤波器。
执行此降采样所需的任何同步操作都将由Generate*Mipmap
命令自身内部完成。