我在片段着色器中为球体实现简单的光线跟踪,我目前正致力于为漫反射阴影球体计算颜色的函数。以下是该函数的代码:
vec3 shadeSphere(vec3 point, vec4 sphere, vec3 material) {
vec3 color = vec3(1.,2.,3.);
vec3 N = (point - sphere.xyz) / sphere.w;
vec3 diffuse = max(dot(Ldir, N), 0.0);
vec3 ambient = material/5;
color = ambient + Lrgb * diffuse * max(0.0, N * Ldir);
return color;
}
我在使用max函数的两行中出错。我获得了我在使用函数max(dot(Ldir,N),0.0)
的webgl备忘单中分配max(dot(ec_light_dir, ec_normal), 0.0);
的行的代码
出于某种原因,我的实施不起作用,因为我收到了错误:
ERROR: 0:38: 'max' : no matching overloaded function found
我使用这些最大功能中的任何一个可能会出现什么问题?
答案 0 :(得分:2)
dot
产品是标量值而非vec3
,您需要将其存储在浮点数
float diffuse = max(dot(Ldir, N),0.0);
或用它初始化vec3
vec3 diffuse = vec3(max(dot(Ldir, N),0.0));
ambient
一词同样如此。通常,漫反射和环境术语都只是标量。
答案 1 :(得分:2)
着色器中有2个max
语句。这是第二个问题
max(0.0, N * LDir)
毫无意义。 N
是一个vec3。没有max
的版本需要max(float, vec3)
。 是 max
的{{1}}版本,因此{/ 1}}将其交换为
max(vec3, float)
它可能会奏效。基本上,您的着色器是不 ES 2.0着色器。也许它被用在不符合规范的驱动程序上(即驱动程序有错误)。 WebGL尝试遵循规范100%