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