Opengl es Opengl ES漫反射着色器不工作

Opengl es Opengl ES漫反射着色器不工作,opengl-es,glsl,webgl,fragment-shader,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 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(ec\u light\u dir,ec\u normal),0.0)的webgl备忘单中获得了分配
max(dot(ec\u light\u dir,ec\u normal),0.0)的行的代码
由于某些原因,我的实现无法工作,因为我遇到了错误:

ERROR: 0:38: 'max' : no matching overloaded function found

我使用的这两个max函数中的任何一个都可能有什么问题?

乘积是标量值而不是
vec3
,您需要将其存储在浮点中

float diffuse=max(点(Ldir,N),0.0)

或者用它初始化一个vec3

vec3漫反射=vec3(最大值(点(Ldir,N),0.0))


环境
术语也是如此。通常漫反射项和环境项都只是标量。

乘积是标量值,而不是
vec3
,您需要将其存储在浮点中

float diffuse=max(点(Ldir,N),0.0)

或者用它初始化一个vec3

vec3漫反射=vec3(最大值(点(Ldir,N),0.0))


环境
术语也是如此。通常漫反射和环境光项都只是标量。

着色器中有2个
max
语句。这是第二个问题

max(0.0,N*LDir)
没有意义<代码>N
是一个vec3。没有任何版本的
max
采用
max(float,vec3)
。有一个版本的
max
max(vec3,float)
,所以将其交换为

`max(N * LDir, 0.0)`

这可能会奏效。基本上,您的着色器是而不是ES 2.0着色器。可能是在不符合规范的驱动程序上使用的(即,驱动程序有bug)。WebGL尝试100%遵循规范

着色器中有2个
max
语句。这是第二个问题

max(0.0,N*LDir)
没有意义<代码>N
是一个vec3。没有任何版本的
max
采用
max(float,vec3)
。有一个版本的
max
max(vec3,float)
,所以将其交换为

`max(N * LDir, 0.0)`
这可能会奏效。基本上,您的着色器是而不是ES 2.0着色器。可能是在不符合规范的驱动程序上使用的(即,驱动程序有bug)。WebGL尝试100%遵循规范