OpenGL ES(2.0)着色语言:如何将布尔值输入到顶点着色器并传递到片段着色器



我第一次尝试将布尔值传递到顶点着色器中;到目前为止,我一直只使用浮子。

有问题的布尔值是基元特定的,因此不能作为统一值传递。但是,对于任何给定基本体的所有顶点,它都具有相同的值。

从Khronos规范来看,"可变"是将数据传递到片段着色器的唯一方法,但毫不奇怪地声明了"可变bool my_bool;"在顶点着色器中定义时会导致语法分析器错误。

我将布尔值作为传递到顶点着色器中

attribute bool a_my_bool;

我定义了一个变量,试图传递给片段着色器:

varying bool v_my_bool;
void main() {
    // ...
    v_my_bool = a_my_bool;
}

有人能告诉我怎样才能实现我的目标吗?

摘自OpenGL®ES着色语言1.0.17版本的§4.3.5(PDF):

可变限定符只能与数据类型float、vec2、vec3、vec4、mat2、mat3和mat4或它们的数组一起使用。

以及§4.3.3:

属性限定符只能与数据类型float、vec2、vec3一起使用,vec3、vec4、mat2、mat3和mat4。属性变量不能声明为阵列或结构。

因此,根据规范,你不可能有attribute bool,更不用说varying bool

如果确实需要每个顶点的布尔值,可以使用0.0表示false,使用1.0表示true。测试时,检查x > 0.5。例如:

// vertex shader
attribute float a_my_bool;
varying float v_my_bool;
void main() {
    // ...
    v_my_bool = a_my_bool;
}
// fragment shader
varying float v_my_bool;
void main() {
    if (v_my_bool > 0.5) {
        // my_bool is true
        // ...
    } else {
        // my_bool is false
        // ...
    }
}

只要每个三角形中的所有顶点都具有相同的值,这就应该有效。如果它们不一致,那么同一个三角形的不同片段就会表现得不同。(如果你坚持0.0和1.0,最靠近"奇数"角的三角形的四分之一将与其他部分表现不同。)

我强烈建议您不要使用该属性并将其切换为uniform,即使布尔值附加到给定的基元。使用Uniform可以设置一次并多次使用,使用attribute可以大大增加每次绘制所需的内存带宽。我在这里看到的唯一意义是,如果你对你的基元执行极端的批处理,但即使在这种情况下,也必须仔细评估这个解决方案的真正好处,因为风险是达到相反的效果。

关于可变变量,一个常见的错误是没有在"顶点"着色器和"片段"着色器中声明可变,并且错过了其中一个2。

这将引发一个链接错误,通过检查编译和链接结果,您无论如何都会注意到它。

我要检查的另一个方面是确保变量在代码中被分配和使用,因为编译器会剥离未使用的内容(死代码优化),这会导致一个非常常见的问题。

相关内容

最新更新