8.14 OpenGL纹理和采样器:纹理缩小

纹理缩小 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_LEVELTEXTURE_MAX_LEVEL 之间的纹理 mipmap 级别,包括这两个级别。实现还应该在各向异性纹理过滤方案允许的范围内尊重 TEXTURE_MAX_LODTEXTURE_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 modeResult of wrap(coord)
CLAMP_TO_EDGEclamp( coord, 0, size − 1 )
CLAMP_TO_BORDERclamp( coord, −1, size )
REPEATcoord mod size
MIRRORED_REPEAT(size − 1) − mirror( coord mod (2 × size)) − size )
MIRROR_CLAMP_TO_EDGEclamp( 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参数即为纹理对象的名称。

targettexture 的有效目标必须是以下之一:TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, 或 TEXTURE_CUBE_MAP_ARRAY

如果targettexture的有效目标是TEXTURE_CUBE_MAPTEXTURE_CUBE_MAP_ARRAY,则相应的纹理对象必须分别满足立方体贴图完整或立方体贴图数组完整的要求,这些定义可在第8.17节找到。否则,若未定义levelbase,或任何维度值为0,则所有Mipmap层级保持不变,但这并不是错误状态。

Mipmap生成会用基于levelbase层级图像派生出的图像替换从levelbase+1q的所有纹理图像层级,不论它们之前的内容为何。除此之外的所有其他Mipmap层级,包括levelbase层级,都会在这个计算过程中保持不变。

派生出的Mipmap纹理图像的内部格式和边框宽度都与levelbase层级图像相同,而且派生图像的尺寸遵循第8.17节所描述的规定要求。

派生图像的内容通过反复过滤降采样levelbase层级图像而计算得出。对于一维和二维数组纹理以及立方体贴图数组纹理,每一层都会独立地进行过滤。虽然并未规定特定的滤波算法,但推荐默认使用盒式滤波器。

执行此降采样所需的任何同步操作都将由Generate*Mipmap命令自身内部完成。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值