如何在纹理中使用OpenGL LOD?

5
如何使用 GL_TEXTURE_MIN_LODGL_TEXTURE_MAX_LODLOD_BIAS
为了直观地检查,我创建了一张6*6的贴图,并进行了mipmapping。当 MIN_LOD 值大于0.5时,无论 MAX_LOD 的值是多少,我都会得到一张3*3的贴图。如果我更改 LOD_BIAS,它不会影响我的输出结果。我无法确定它究竟是如何工作的。
请问是否有人可以用一个例子来解释它?
编辑: 我手动创建了mipmap级别,以便观察它选择了哪个级别。这是我的代码:
glTexImage2D(target, 0, GL_RGBA,9 ,9, 0, GL_RGBA, GL_BYTE,subpix);
glTexImage2D(target, 1, GL_RGBA,4 ,4, 0, GL_RGBA, GL_BYTE,&subpix[4]);
glTexImage2D(target, 2, GL_RGBA,2 ,2, 0, GL_RGBA, GL_BYTE,&subpix[10]);
glTexImage2D(target, 3, GL_RGBA,1 ,1, 0, GL_RGBA, GL_BYTE,&subpix[18]);
glSamplerParameterf(sampler,GL_TEXTURE_MIN_LOD,0.862);
glSamplerParameterf(sampler,GL_TEXTURE_MAX_LOD,0.99);
glSamplerParameterf(sampler,GL_TEXTURE_LOD_BIAS,0.0);

在这种情况下,我期望它会选择2×2的第二个mipmap级别,但它选择了4×4的第一个mipmap级别。当我设置min lod < 0.5时,它选择9×9的第0级。这发生的原因与max lod的值无关。

请参考Daniel Rakos的“Mountains demo”,该演示程序可以在此处获取。一定要下载代码并阅读,您会找到所需的示例。http://rastergrid.com/blog/2010/10/gpu-based-dynamic-geometry-lod/ - Piotr Wadas
1
@PiotrWadas 这是几何LOD而不是纹理LOD。一篇不错的文章,但完全没有抓住重点。 - Bartek Banachewicz
这听起来像是一个XY问题。你究竟想用这些参数做什么? - Nicol Bolas
1个回答

2
首先一些参考资料:

TEXTURE_MIN_LOD 设置最小细节级别参数。这个浮点值限制了选择最高分辨率的mipmap(最低细节级别)。初始值为-1000。

TEXTURE_LOD_BIAS 指定一个固定的偏移值,将被添加到纹理的细节级别参数之前进行纹理采样。指定的值将与着色器提供的偏移值(如果有)相加,并在实现定义的范围内进行裁剪——偏差最大值bias max bias max ,其中bias max是实现定义常量GL_MAX_TEXTURE_LOD_BIAS的值。初始值为0.0。

因此,如果你对mipmap的选择感到惊讶,我建议按照以下步骤进行(不一定按顺序):

  • 手动创建视觉上有区别的mipmap。
  • 验证你的mipmap是否正确提供。
  • 验证你的LOD_BIAS设置是否只是将所有值放在范围之外,使得采样器始终使用最大或最小的LOD。
搜索了一下,我找到了textureQueryLod。这可能对你在调试时有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接