【问题标题】:How does texture lookup in non fragment shaders works?非片段着色器中的纹理查找如何工作?
【发布时间】:2014-09-16 21:44:47
【问题描述】:

以下是 GLSL 规范的摘录:

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

这就是我的看法:

顶点着色器:

vec4 texel = texture(SamplerObj, texCoord);   
// since this is vertex shader, sampling will always take place
// from 0th Mipmap level of the texture.

片段着色器:

vec4 texel = texture(SamplerObj, texCoord);   
// since this is fragment shader, sampling will take place
// from Nth Mipmap level of the texture, where N is decided
// based on the distance of object on which texture is applied from camera.

我的理解正确吗?

【问题讨论】:

  • 我的理解是否正确。

标签: opengl glsl


【解决方案1】:

听起来不错。您可以通过在顶点着色器中使用textureLod() 而不是texture() 来指定显式LOD。

我相信您也可以通过在纹理上设置GL_TEXTURE_MIN_LOD 参数来使其使用更高的LOD。如果你打电话,例如:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 2.0f);

当纹理被绑定时,当您在顶点着色器中对纹理进行采样时,它应该使用第 2 级 mipmap。我从未尝试过,但这是我对如何定义行为的理解。

【讨论】:

  • OPs 的理解并不完全正确。选择的 mipmap LOD 取决于传递给texture() 的纹理坐标的屏幕空间偏导数,而不是距离。
  • 并非所有版本的 texture() 函数都采用导数。那么默认值是多少。我知道这需要大解释,也许给我一个教程。
【解决方案2】:
// since this is fragment shader, sampling will take place
// from Nth Mipmap level of the texture, where N is decided
// based on the distance of object on which texture is applied from camera.

我认为关于距离的说法是不正确的。要使用的 mipmap 级别是使用相邻像素的纹理坐标的推导来确定的。采样器硬件可以确定这一点,因为为片段着色器生成的代码通常使用 SIMD 指令并同时为多个像素生成值。例如,在 Intel 硬件上,单个线程通常在 4x4 像素网格上运行。这意味着每当一条消息被发送到采样器硬件时,它都会得到一组 16 个纹理坐标,并且需要 16 个纹素作为回复。采样器硬件可以通过查看这 16 个纹理坐标之间的差异来确定推导。这可能就是为什么在 GLSL 规范中进一步说明:

在非统一控制流和非片段着色器纹理提取中未定义隐式导数。

非统一控制流会弄乱隐式导数,因为线程中处理的所有片段可能不会同时进行采样。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多