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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学上相同的变量 - 一个破坏着色器而不是相关的知识,希望对你有一定的参考价值。

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

答案

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语句的末尾。

以上是关于数学上相同的变量 - 一个破坏着色器而不是的主要内容,如果未能解决你的问题,请参考以下文章

关于何时在私有成员变量上实现访问器而不是将它们公开的实践

为什么片段着色器不会编译?

为啥 gl_Color 不是片段着色器的内置变量?

带有顶点/片段着色器的光。使用不同的变量。 (openGL)

如何为每个片段保存一个变量值以重用它? [关闭]

如何在片段着色器中平铺部分纹理