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

Kom*_*ave 10 shader opengl-es glsl opengl-es-2.0

我正试图第一次将布尔值传递给我的顶点着色器; 我到现在才使用花车.

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

从Khronos规范看来,'vary'是将数据传递到片段着色器的唯一方法,但不出所料地声明'变化bool my_bool;' 在我的顶点着色器中定义时会导致解析器错误.

我将布尔值传递给我的顶点着色器:

attribute bool a_my_bool;
Run Code Online (Sandbox Code Playgroud)

我在尝试传递给片段着色器时定义了一个变量:

varying bool v_my_bool;
void main() {
    // ...
    v_my_bool = a_my_bool;
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何实现我的目标吗?

Lau*_*ves 19

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

变量限定符只能用于数据类型float,vec2,vec3,vec4,mat2,mat3和mat4,或者这些数组.

从§4.3.3开始:

属性限定符只能用于float,vec2,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
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

只要每个三角形中的所有顶点具有相同的值,这应该起作用.如果它们不一致,那么对于相同的三角形,你最终会得到不同的碎片.(如果你坚持0.0和1.0,最接近"奇数"角的三角形的四分之一将与其余部分的行为不同.)


Mau*_*tti 5

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

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

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

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