我正在使用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查找(即使已放大)。现在,如果我向采样坐标添加一个小的偏移量,则我将开始看到在上图中看到的条带(甚至进一步放大了)。如果不使用bias参数,则根本看不到任何条带。
android mipmaps level-of-detail fragment-shader opengl-es-2.0
问题是相当自我解释的.我问的是使用可能来自任何地方的纹理坐标(统一,变化,另一个纹理提取).
比方说,我在mipmapped(或各向异性过滤)纹理上进行纹理提取,并使用在顶点着色器中设置的变化的平方.我假设glsl不能确定这样的任意复杂函数的导数,那么它如何知道使用哪个mip级别?
谢谢.
我试图在OpenGL ES 2.0片段着色器中与mipmap纹理的细节水平达成一致.
根据这个答案,不可能使用bias参数texture2D来访问片段着色器中的特定细节级别.根据该帖子,相反,细节水平是从相邻片段的并行执行中自动计算的.我必须相信这就是事情的运作方式.
我无法理解的是它的原因.为什么不能访问特定级别的细节,这样做的确非常简单?为什么人们必须依赖复杂的固定功能呢?
对我来说,这似乎非常违反直觉.毕竟,整个OpenGL相关的东西从固定功能演变而来.OpenGL ES旨在涵盖比OpenGL更广泛的硬件,因此只支持更多简单版本的东西.因此,我完全理解规范的开发人员是否已经确定LOD参数是强制性的(可能默认为零),并且由着色器程序员以他认为合适的任何方式计算出适当的LOD.添加一个自动执行该计算的函数似乎是我在桌面OpenGL中所期望的.
无论我如何看待它,不提供对特定级别的直接访问对我来说都没有任何意义.特别是因为该bias参数表明我们确实允许调整细节级别,所以显然这不是关于从内存中获取数据仅用于并行处理的一堆片段的单个级别.我想不出任何其他原因.
当然,为什么问题往往会吸引意见.但由于Stack Overflow不接受基于意见的答案,请将您的意见仅作为评论发布.另一方面,答案应该基于可验证的事实,例如具有明确知识的人的陈述.如果有任何开发者讨论这个事实的记录,那将是完美的.如果有人在讨论这个问题时有博客文章,那仍然会非常好.
由于Stack Overflow问题应该处理真正的编程问题,有人可能会争辩说要求理由是个坏问题.得到答案不会突然出现明确的lod访问,因此无法帮助我解决我的直接问题.但我觉得这里的原因可能是由于OpenGL ES如何工作的一些重要方面,到目前为止我还没有掌握.如果是这样的话,那么了解这一决定背后的动机将有助于我和其他人更好地理解OpenGL ES作为一个整体,从而在性能,准确性,可移植性等方面更好地利用它. .因此,我可能已经将这个问题称为"我错过了什么?",这对我来说当然是一个非常真实的编程问题.