【问题标题】:Find out if GL_TEXTURE_2D is active in shader查明 GL_TEXTURE_2D 是否在着色器中处于活动状态
【发布时间】:2013-02-26 06:58:59
【问题描述】:

我想知道 GL_TEXTURE_2D 在着色器中是否处于活动状态。

我正在将颜色绑定到着色器以及活动纹理(如果设置了 GL_TEXTURE_2D)并且需要将这两者结合起来。

所以如果绑定了纹理,则混合颜色和纹理(sampler2D * color),如果没有绑定纹理,则使用颜色。

或者我应该换个方式解决这个问题?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    您所说的“GL_TEXTURE_2D 处于活动状态”或“GL_TEXTURE_2D 已设置”不是很清楚。

    请注意以下几点:

    • glEnable(GL_TEXTURE_2D) 对您的(片段)着色器没有影响。它将您刚刚使用片段着色器替换的管道的固定功能部分参数化。
    • 没有“直接”/“干净”的方式可以从 GLSL 着色器内部判断是否存在绑定到与纹理采样器关联的纹理单元的有效纹理(据我所知)。
    • 从 GLSL 1.3 开始,您可能会幸运地使用 textureSize(sampler, 0).x > 0 检测与 sampler 关联的有效纹理的存在,但这可能会导致未定义的行为。
    • ARB_texture_query_levels 扩展确实明确指出如果没有与 sampler 关联的纹理,textureQueryLevels(gsampler2D sampler) 返回 0。

    你应该换一种方式解决这个问题吗?我是这么认为的:与其在着色器中做出决定,不如简单地绑定一个 1x1 像素的“白色”纹理并无条件地对该纹理进行采样并将结果与​​ color 相乘,这显然会返回 1.0 * color。这也将更便携、更快。

    【讨论】:

    • +1 用于白色纹理方法。其他地方列出的唯一解决方案是使用两种不同的着色器,这在大多数情况下是没有意义的。
    • opengl 默认为着色器采样器分配一个值,因此为了工作,您需要检查 textureSize 是否大于 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多