数学上相同的变量 - 一个破坏着色器一个没有

时间:2018-03-08 04:15:09

标签: opengl opengl-es

我已经编写了一个片段着色器,它使用一个变量声明,但与数学上相同的另一个断开。我编辑了代码段,以突出显示thetastrt_2的两个备选方案。 PI已正确定义,partsnum是一个等于3.0的浮点数

fragmentShader: [

    "uniform vec3 mixfinal;",
    //more uniforms

    "vec3 mixer () {",
    "   vec3 lightOG = vec3 ( 0.0 );",          
    "   float thetastrt_0 = PI / 2.0;",
    "   if ( partsnum >= 2.0 ) {",
    "       float thetastrt_1 =  thetastrt_0 + ( PI * 2.0 / partsnum );",
            //more code
    "   }",
    "   if ( partsnum >= 3.0 ) {",

    "       float thetastrt_2 =  thetastrt_0 + ( PI * 4.0 / partsnum );", //shader works

    "       float thetastrt_2 =  thetastrt_1 + ( PI * 2.0 / partsnum );", //shader breaks

            //more code
    "   }",
    "   return lightOG;",
    "}",    //end mixer ()

    "void main() {",
    "   vec3 outgoingLight = vec3( 0.0 );", 
    "   outgoingLight = mixer();",
        //more code
    "}"

没有调试器,很难找到。这是运行/编译时间问题吗? thetastrt_2取决于thetastrt_1的问题是否取决于thetastrt_0

1 个答案:

答案 0 :(得分:2)

if ( partsnum >= 2.0 ) {
    float thetastrt_1 =  thetastrt_0 + ( PI * 2.0 / partsnum );
    ....
}

float thetastrt_1if - 语句的范围内声明,因此在if - 语句块之外不再可访问它。

请参阅OpenGL ES Shading Language 3.20 Specification; 4.2.2 Types of Scope; page 44 and 45

  

变量的范围取决于声明的位置。 .....

     

将if结构表示为:

     

如果 if-expression 然后 if-statement else 其他语句

     

在if语句中声明的变量的作用域是if语句的结尾。在else语句中声明的变量的作用域是else语句的末尾。