【问题标题】:Can you tell if a vertex attribute is enabled from within a vertex shader?你能判断一个顶点属性是否从顶点着色器中启用吗?
【发布时间】:2012-02-22 20:31:46
【问题描述】:

我想知道是否有办法判断顶点属性是否从顶点着色器中启用?我知道如果顶点属性被禁用,所有值都将被视为 0.0,所以我可以进行如下测试:

if (attribute == 0)
{
    // Do something different to normal.
}
else
{
    // Use the attribute.
}

但这对于属性被启用并且值只是设置为0的情况有明显的问题(它会被视为禁用它)!

另一种解决方案是只使用一个统一变量来说明是否使用该属性,但我想知道 GLSL 中是否有任何内置的东西可以做到这一点?

【问题讨论】:

    标签: opengl glsl vertex-shader vertex-attributes


    【解决方案1】:

    仅供参考:

    我知道如果顶点属性被禁用,所有值都将被视为 0.0,所以我可以进行如下测试:

    那不是真的。如果一个属性被禁用,它的值来自常规的 OpenGL 状态。即,glVertexAttrib 函数设置的状态。因此,将这些“常量属性”发送到着色器是完全合法的。

    这就是 API 无法让着色器判断属性是否“禁用”的原因。 “禁用”的属性可能仍然有有意义的数据。

    【讨论】:

    • @OP 因此,您检查特定“未启用”值的解决方案可以调整为使用不同于 0 的值,该值不是可能出现的“真实”属性值,只需将glVertexAttrib 设置为此值。所以你不需要额外的布尔值。
    • 哦! glVertexAttrib 函数是否设置将用于每个顶点的值?例如,如果我调用glVertexAttrib1f(3, -1.0f),那么位置 3 的所有顶点属性都将设置为 -1.0f?
    • @JamesBedford:是的。除非启用了该属性的数组。
    【解决方案2】:

    没有。

    自己传递一个布尔统一来模拟它。

    【讨论】:

    • 谢谢!这就是我一起去的。如果将来能成为 GLSL 功能那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多