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

5

我是一个对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的脚本标签内声明/定义变量吗?


3
尽管这是一个 script 元素,但由于您指定了自定义的 type 值,它不会作为 script 元素进行处理,而是由 shader 编译器进行处理,其中 var 不是有效的语法,因此出现了错误。 - Arun P Johny
啊,我明白了。谢谢你的解释! - TacoB0t
1个回答

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.库,它内置的函数是全局的。


感谢您澄清这一点!我检查了我的控制台错误,然后相应地进行了清理。 - TacoB0t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接