【转】OpenGL随笔(1)—— mipmap 详解

【转】OpenGL随笔(1)—— mipmap 详解

注:本文使用的所有 OpenGL 函数来自 OpenGL 4.5,优先使用 DSA。

  使用 mipmap 时,OpenGL 根据被映射对象的大小(单位是像素),自动决定使用纹理图的哪个分辨率级别。mipmap 表示着纹理的层次细节(LOD),随着对象图像变小,使用纹理图的大小将减少。mipmap 需要一些额外的计算和纹理存储空间(大概三分之一),但这些消耗是值得的,如果不使用 mipmap ,那么映射到更小图像上的纹理将随着物体移动而闪烁。 
  OpenGL 的 mipmap 省去了纹素大小和多边形大小的缩放因子 λ 的详细讨论,不更改则使用默认值。下文将使用默认的 mipmap 参数,最后会讨论控制 λ 的细节。 
  参数 GL_TEXTURE_MIN_FILTER 控制在 mipmap 级数大于 0 时如何重建纹素。这个参数共有 6 个设置。前两个与用于放大的相同,GL_NEAREST 和 GL_LINEAR。选择这两个参数会禁用 mipmap,OpenGL 将使用纹理的基数级(级数0)。其他四个模式启用 mipmap,并控制着 mipmap 的使用。这四个值分别是 GL_NEAREST_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_LINEAR。名字结构的第一部分控制纹素的构造,表示当前采用纹理的构造方式;第二部分控制 mipmap 级之间采样模式,NEAREST 表示只使用最近的 mipmap 级,LINEAR 则表示最近的两个 mipmap 线性插值。 
  为了使用 mipmap,必须提供纹理在最大尺寸和 1x1 图之间的所有大小是 2 的幂的纹理级别。如果不想使用 mipmap 到 1x1 纹理的所有变化,可以将 GL_TEXTURE_MAX_LEVEL 的值设置为提供的最大级数,并且 OpenGL 不会考虑更进一步的级别。如果纹理最高级别的分辨率不是正方形,那么一个维度将比另外一个首先到达大小为 1 的纹素。在这种情况下,将继续对这个维度创建新的层级,直到两个维度到达 1x1 的形式为止。例如,如果最高分辨率是 64x16,则必须提供大小 32x8,16x4,8x2,4x1,2x1 和 1x1。mipmap 小图纹素的获取对应于大图 4 个纹素的加权平均。 
  需要特别注意的一点是 glTextureStorage* 生成的纹理空间是不可变的,也就是说不可以使用 glGenerateTextureMipmap 来自动生成函数,而只能用 glTextrueSubImage2D 来手动载入各级纹理;试图让 OpenGL 自动生成 mipmap,请使用 glTextureImage*。 
  OpenGL 提供一个函数,其在应用程序的控制下为纹理自动生成所有的 mipmap—— glGenerateTextureMipmap。在 OpenGL 实现中,它提供了通过采样高分辨率图像来生成更低分辨率图像的一个机制。这通常使用着色器和纹理滤波硬件来实现。这个技术通常被设计用于性能多于质量,并且在不同的实现之间有变化。如果想要高质量的结果,最好自己生成和提供 mipmap 图像。如果需要快速生成 mipmap 链并且对获得的任何结果都满意,可以使用 glGenerateTextureMipmap 函数。 
  计算特定像素的纹理级别时,其结果取决于纹理图像和纹理映射的多边形大小比例因子。我们称这个比例因子为 ρ,再定义第二个值 λ,且 λ=log2ρ+lodbias(因为纹理图像可以是多维的,所以声明 ρ 是所有维的最大比例因子是很重要)。 
  lodbias 是采样器的细节层次偏移,在 glSamplerParameteri 中设置参数为 GL_TEXTURE_LOD_BIAS 来修改它,从而修改 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值