数学上相同的变量 - 一个破坏着色器而不是

问题描述 投票:0回答:1

我编写了一个片段着色器,它使用一个变量声明,但与数学上相同的另一个断开。我编辑了代码片段以突出显示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吗?

opengl opengl-es
1个回答
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 if-expression then if-statement else else-statement,

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

© www.soinside.com 2019 - 2024. All rights reserved.