在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?相关的知识,希望对你有一定的参考价值。

使用glTexParamteri(GL_Texture_2D,GL_TEXTURE_MAG_FILTER,...)和glTexParamteri(GL_Texture_2D,GL_TEXTURE_MIN_FILTER,...)配置OpenGL时,OpenGL如何决定在使用纹理(...)访问着色器中的纹理时使用哪个过滤器?

我唯一的猜测是,它正在计算像素占用空间,但由于您可以在片段或顶点着色器中访问纹理,因此无法知道哪个基元投影了哪个纹理。

答案

我唯一的猜测就是计算像素占用空间

是的,这就是它的作用。它将通过计算相对于窗口空间xy方向的texcoords的导数来近似纹理空间中的像素覆盖区,并且它将通过2x2像素四边形中的有限差分来近似这些导数,就像dFdx and dFdy GLSL functions正在工作一样。它将使用两个偏导数向量中较长的一个作为大小,并根据该值计算Level-Of-Detail值。

但由于您可以在片段或顶点着色器中访问纹理,因此无法知道哪个基元投影了哪个纹理。

正确,这就是为什么GLSL specification, (Version 4.60)在第8.9节纹理函数的开头陈述以下内容:

纹理查找功能在所有着色阶段都可用。但是,仅为片段着色器计算自动细节级别。其他着色器的操作就像基本细节水平计算为零一样

另一答案

一些(即:大多数)GLSL纹理访问函数表示它们需要“隐式衍生物”。所有这些功能只能完全起作用:

  1. In the fragment shader
  2. uniform control flow of the FS内。

如果在非片段着色器中调用需要隐式导数的纹理访问函数,则它只能从基本mipmap级别进行访问。但是,如果您在片段着色器中但在统一控制流之外,则所有此类函数都具有未定义的行为。

因此,如果您不在片段着色器中,您要么从基本mipmap级别访问(在这种情况下,MAG_FILTER适用),或者您想要使用明确提供用于进行插值的值的函数:Lod(您在哪里explicitly say what mipmap level(s) you fetch from),Grad(你用explicitly specify derivatives来决定像素足迹的位置),或任何texelFetchtextureGather函数(根本不进行插值)。

以上是关于在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GL_TEXTURE_2D 的 iOS YUV 420v 在 OpenGL 着色器中显示错误的颜色

在 vertexShader 中使用 OpenGl 未声明的标识符,我在顶点着色器中绘制三角形时遇到问题

着色器中的 OpenGL 法线变换

片段着色器中未使用纹理数据 - OpenGL

在顶点着色器中更改顶点的颜色

OpenGL ES 2.0 符点精度