【问题标题】:In a GLSL fragment shader, how to access to texel at a specific mipmap level?在 GLSL 片段着色器中,如何访问特定 mipmap 级别的纹素?
【发布时间】:2010-09-03 11:20:10
【问题描述】:

我正在使用 OpenGL 通过一个顶点着色器和一个片段着色器的组合来进行一些 GPGPU 计算。我需要对不同比例的图像进行计算。我想使用 mipmap,因为它们的生成可以是自动的和硬件加速的。但是我无法访问片段着色器中的 mipmap 纹理。

我启用了自动 mipmap 生成: glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

我尝试在着色器中使用texture2DLod,但没有成功,它只是保持正常纹理。我还尝试在主程序中使用 glTextureParameteri(GL_BASE_LEVEL, X) 并没有改变任何东西。

你会怎么做?

我正在使用 Linux。我的显卡是相当老的 Nvidia Quadro。 Here 是我的 glxinfo 输出,包含所有支持的扩展。

【问题讨论】:

  • 我赞成您的问题,因为它“有用且清晰”,但您似乎做的一切都很好。 glTextureSize(sampler, lod) 说什么?(在您的片段着色器中)
  • 我没有这样的功能。我认为我的卡太旧了(我刚刚检查了 GLSL 的版本是 GL_ARB_shading_language_100)。这可以解释很多,但我不明白为什么着色器会接受 *Lod 变体而不抱怨它是否不受支持......
  • 我也不明白为什么 glTextureParameteri(GL_BASE_LEVEL, X) 和 glTextureParameteri(GL_MAX_LEVEL, X) 调用也没有效果。这与 GLSL 无关……我现在很困惑。
  • 我有一些消息。我设置了 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST) 和 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST) 和 texture2DLod 调用现在都返回 (1.0, 1.0, 1.0, 1.0)...我猜 mipmaps 在片段阴影中查找我的显卡,我仍然认为它没有抱怨很奇怪。但是,现在 glTextureParameteri(GL_BASE/MAX_LEVEL, X) 似乎可以工作了。
  • 最后一件事:从“相关”部分我读到了stackoverflow.com/questions/3071006/…。然后我尝试了 texture2D(sampler, coord, bias) 结构,我可以在片段着色器中访问所需的 mipmap 级别。我认为我的问题已经解决了,但我对尝试使用不受支持的功能时没有运行时错误感到惊讶......或者也许我做错了什么:)。

标签: opengl gpgpu mipmaps


【解决方案1】:
gvec4 textureLod (gsampler1D sampler, float P, float lod)
gvec4 textureLod (gsampler2D sampler, vec2 P, float lod)
gvec4 textureLod (gsampler3D sampler, vec3 P, float lod)
gvec4 textureLod (gsamplerCube sampler, vec3 P, float lod)
float textureLod (sampler1DShadow sampler, vec3 P, float lod)
float textureLod (sampler2DShadow sampler, vec3 P, float lod)
gvec4 textureLod (gsampler1DArray sampler, vec2 P, float lod)
gvec4 textureLod (gsampler2DArray sampler, vec3 P, float lod)
float textureLod (sampler1DArrayShadow sampler, vec3 P, float lod)

您是否尝试过其中一种内置功能? lod 也必须是浮点类型。报告 GLSL 编译器有哪些错误/警告?

【讨论】:

  • 嗨,很抱歉耽搁了这么久。我尝试了 texture2DLod 功能。奇怪的是,无论我给 'lod' 赋予什么值,返回的值都与标准的 texture2D 查找完全相同。着色器编译时不会产生错误甚至警告。
【解决方案2】:

GLSL 1.20 规范(第 8.7 节)规定片段着色器无法选择自己的 mipmap 级别(并且纹理*Lod 函数仅在顶点着色器中可用)。如果有的话,您可以使用非 Lod 变体的偏差参数来更改 mipmap 级别,但它只能相对于卡已经为您计算的内容进行更改。

我不知道后续版本的 GLSL 是否会改变这一点。

【讨论】:

  • 他们确实改变了这一点,正如这个问题的第一个答案所示。
【解决方案3】:

尝试:

glGenerateMipmapEXT(GL_TEXTURE_2D);

绑定纹理后。 (当然是在渲染之前)

glTexParameteri-GL_GENERATE_MIPMAP 已被弃用,我认为... 制造数码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2011-11-14
    • 2013-07-30
    • 2011-10-04
    • 2017-04-12
    相关资源
    最近更新 更多