你能否在顶点着色器中判断一个顶点属性是否启用?

8

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

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

但是,对于启用属性且将值设置为0的情况,这会带来明显的问题(它将被视为未启用)!
另一个解决方案是使用一个统一变量来表示是否使用属性,但我想知道GLSL中是否有任何内置内容可以做到这一点?
2个回答

18

提示:

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

那是不正确的。如果一个属性被禁用,它的值来自于常规的OpenGL状态,即由 glVertexAttrib 函数设置的状态。所以把这些 "常量属性 " 传送到着色器是完全合法的。

这就是为什么API没有办法让着色器知道一个属性是否 "被禁用" 。一个 "被禁用" 的属性仍然可能具有有意义的数据。


2
@OP 所以,您检查特定的“未启用”值的解决方案可以适应使用不同于0的值,这不是“真实”的属性值,否则可能会发生,只需将glVertexAttrib设置为此值即可。因此,您不需要额外的布尔值。 - Christian Rau
1
哦!glVertexAttrib函数会设置每个顶点将要使用的值吗?例如,如果我调用了glVertexAttrib1f(3, -1.0f),那么位于位置3的所有顶点属性都将被设置为-1.0f? - James Bedford
1
@JamesBedford:是的,除非启用了该属性的数组。 - Nicol Bolas

7

没有。

自行传递布尔型统一变量以模拟它。


谢谢!这就是我选择的。如果将来能够成为GLSL的特性,那就太好了! - James Bedford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接