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

问题描述 投票:1回答:2

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

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

opengl glsl mipmaps
2个回答
2
投票

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

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

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

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

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


1
投票

一些(即:大多数)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函数(根本不进行插值)。

© www.soinside.com 2019 - 2024. All rights reserved.