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,最接近"奇数"角的三角形的四分之一将与其余部分的行为不同.)
我强烈建议您不要使用该属性并将其切换为制服,即使布尔值附加到给定的原语。使用 Uniform 设置一次并使用多次,使用属性可以大大增加每次绘制所需的内存带宽。我在这方面看到的唯一意义是,如果您对原语执行极端批处理,但即使在这种情况下,也必须仔细评估该解决方案的真正好处,因为风险是达到相反的效果。
关于变量变量,一个常见的错误是没有在顶点和片段着色器中声明变量,而错过了 2 个中的一个。
这会引发链接错误,无论如何您都会通过检查编译和链接结果来注意到它。
我要检查的另一个方面是确保在您的代码中分配和使用变量,因为编译器删除了未使用的内容(死代码优化),这会导致一个非常常见的问题。
| 归档时间: |
|
| 查看次数: |
17891 次 |
| 最近记录: |