2016-09-29 17 views
5

我是一个有点新的HTML和Javascript和我的HTML中,我有以下代码:JS - 未声明的标识:GLSL脚本 '变种'

 <script id="fragmentShader" type="x-shader/x-fragment"> 
       precision mediump float; 

       //varying vec3 fragmentColor; //not needed? 
       varying vec3 fragmentNormal; 
       varying vec3 fragmentLight; 
       varying vec3 fragmentView; 

       uniform vec3 modelColor; 
       uniform vec3 lightColor; 

       void main() { 
         var m = normalize(fragmentNormal); 
         var l = normalize(fragmentLight); 
         var v = normalize(fragmentView); 
         var h = normalize(l + v); 

         var d = Math.max(l * m , 0); 
         var s = Math.pow(Math.max(h * m, 0), 10); 

         fragmentColor = modelColor * lightColor * d + lightColor * s; 

         gl_FragColor = vec4(fragmentColor, 1.0); 
       } 
     </script> 

然而,返回

Failed to compile shader: ERROR: 0:13: 'var' : undeclared identifier 
ERROR: 0:13: 'm' : syntax error 

我不允许在HTML中的脚本标记中声明/定义变量吗?

+3

即使它是一个'script'元素,它不会作为一个处理,因为您已经指定了一个自定义的'type'值,而是由'shader'编译器处理,而'var'不是一个有效的语法从而出错。 –

+0

啊,我明白了。感谢您的解释! – TacoB0t

回答

2

上面的代码不是JavaScript,而是GLSL。这是用于编写在GPU上运行的程序的语言。它没有关键字var。相反,声明在GLSL变量,你需要把一个类型的他们

vec3 m = normalize(fragmentNormal); 

vec3 l = normalize(fragmentLight); 
vec3 v = normalize(fragmentView); 
vec3 h = normalize(l + v); 

vec3 d = max(l * m , 0.0); 
vec3 s = pow(max(h * m, 0.0), vec3(10)); 

前我不知道你想什么上面做的,但所有的公式产生vec3

此外GLSL 1.00 es是严格的类型。你不能用整数使用vec3。你必须使用浮点数。 0.0而不是0。最后一行没有功能pow,它在左侧采用vec3,右侧采用单个值,因此vec3(10)采用整数10并将其转换为vec3。这与vec3(10, 10, 10)的说法相同。

另外GLSL没有Math.库。它的功能是全球性的。

+0

感谢您的理解!我浏览了控制台错误并相应地进行了清理。 – TacoB0t