JS - 未声明的标识符:GLSL脚本中的'var'

时间:2016-09-29 02:16:40

标签: javascript html glsl webgl

我对HTML和Javascript有点新,在我的HTML中,我有以下代码:

        <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中的脚本标记内声明/定义变量吗?

1 个答案:

答案 0 :(得分:2)

上面的代码不是JavaScript GLSL。它是用于编写在GPU上运行的程序的语言。它没有关键字FileTable。而不是在GLSL中声明变量,您需要在它们前面放置一个类型

var

我不确定你在上面尝试做什么,但你的所有等式产生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));

GLSL 1.00 es对类型也很严格。你不能将vec3与整数一起使用。您必须使用浮点数。 vec3代替0.0。最后一行没有函数0,左边是vec3,右边是单个值,因此pow取整数vec3(10)并将其转换为10 。这跟vec3一样。

GLSL也没有vec3(10, 10, 10)库。它内置的功能是全球性的。