Opengl ES漫反射着色器无法正常工作

时间:2015-09-23 15:01:57

标签: opengl-es glsl webgl fragment-shader

我在片段着色器中为球体实现简单的光线跟踪,我目前正致力于为漫反射阴影球体计算颜色的函数。以下是该函数的代码:

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

我使用这些最大功能中的任何一个可能会出现什么问题?

2 个答案:

答案 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%