我正在使用 OpenGL ES 2.0 GLSL 功能来操作图像。我想要实现的是在从片段着色器中从纹理中获取样本时选择特定的细节级别(LOD)。显然texture2DLod()
,OpenGL ES 2.0 中的片段着色器不支持(但有一个扩展GL_EXT_shader_texture_lod
可以选择提供它。)
但是,默认texture2D()
函数提供了第三个可选参数偏差。据我了解,此参数应该是添加到当前 LOD 的偏移量。
在我的测试中,我正在绘制屏幕大小的四边形,并通过缩放样本坐标来放大纹理。我使用 GL_LINEAR_MIPMAP_LINEAR 作为缩小过滤器为纹理启用了 mipmapping。在 ARM Mali-400 GPU 上使用非零偏差参数进行采样时的结果如下图所示。
ISTM 认为一些像素使用缩小过滤器,而其他像素使用放大过滤器。
这是如何控制的?使用偏差时如何确定初始 LOD?可以从顶点着色器调整吗?
一个相关的问题是以下问题:
GLSL 采样器如何确定纹理的缩小以及 mipmap 级别?
更新:我注意到,如果我对纹理进行采样以使其覆盖屏幕,那么它似乎会进行正确的 mipmap 查找(即使它被放大了。)现在,如果我在样本坐标上添加一个小偏移量,那么我将开始看到上图中看到的条带(放大得更多。)如果我不使用偏差参数,我根本看不到任何条带。