【问题标题】:OpenGL ES (2.0) Shading Language: How to input boolean into vertex shader and pass to fragment shader?OpenGL ES(2.0)着色语言:如何将布尔值输入顶点着色器并传递给片段着色器?
【发布时间】:2012-02-10 09:38:27
【问题描述】:

我第一次尝试将布尔值传递给我的顶点着色器;到现在为止我只用过花车。

所讨论的布尔值是原始特定的,因此不能作为统一传递。但是,对于任何给定图元的所有顶点,它都具有相同的值。

从 Khronos 规范看来,“变化”是将数据传递到片段着色器的唯一方法,但毫不奇怪地声明“变化布尔 my_bool;”在我的顶点着色器中定义时会导致解析器错误。

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

attribute bool a_my_bool;

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

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

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

【问题讨论】:

    标签: opengl-es glsl shader opengl-es-2.0


    【解决方案1】:

    来自The OpenGL® ES Shading Language version 1.0.17 (PDF) 的§4.3.5:

    varying 限定符只能用于数据类型 float、vec2、vec3、vec4、mat2、mat3 和 mat4 或这些数据类型的数组。

    从 §4.3.3 开始:

    属性限定符只能用于数据类型 float、vec2、 vec3、vec4、mat2、mat3 和 mat4。属性变量不能声明为 数组或结构。

    所以根据规范,你不能拥有attribute bool,更不用说varying bool了。

    如果您真的需要每个顶点的布尔值,您可以使用 0.0 表示假,使用 1.0 表示真。测试时,检查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,那么最接近“奇数”角的三角形四分之一的行为将与其他部分不同。)

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        相关资源
        最近更新 更多