我第一次尝试将布尔值传递到顶点着色器中;到目前为止,我一直只使用浮子。
有问题的布尔值是基元特定的,因此不能作为统一值传递。但是,对于任何给定基本体的所有顶点,它都具有相同的值。
从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。
这将引发一个链接错误,通过检查编译和链接结果,您无论如何都会注意到它。
我要检查的另一个方面是确保变量在代码中被分配和使用,因为编译器会剥离未使用的内容(死代码优化),这会导致一个非常常见的问题。