我编写了一个片段着色器,它使用一个变量声明,但与数学上相同的另一个断开。我编辑了代码片段以突出显示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_1
在if
语句的范围内声明,因此在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语句的末尾。