【问题标题】:Opengl ES diffuse shader not workingOpengl ES 漫反射着色器不工作
【发布时间】:2015-09-23 15:01:57
【问题描述】:

我正在片段着色器中为球体实现简单的光线追踪,我目前正在研究计算漫反射球体颜色的函数。这是函数的代码:

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_light_dir, ec_normal), 0.0); 的 webgl 备忘单中获得了分配 max(dot(Ldir,N),0.0) 的行的代码 出于某种原因,我的实现无法正常工作,因为我收到了错误:

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

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

【问题讨论】:

    标签: opengl-es glsl webgl fragment-shader


    【解决方案1】:

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

    max(0.0, N * LDir) 毫无意义。 N 是一个 vec3。没有采用max(float, vec3)max 版本。 max 的一个版本是max(vec3, float),所以把它换成

    `max(N * LDir, 0.0)`
    

    它可能会起作用。基本上,您的着色器 不是 ES 2.0 着色器。也许它被用于不符合规范的驱动程序(即驱动程序有错误)。 WebGL 尝试 100% 遵循规范

    【讨论】:

      【解决方案2】:

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

      float diffuse = max(dot(Ldir, N),0.0);

      或者用它初始化一个vec3

      vec3 diffuse = vec3(max(dot(Ldir, N),0.0));

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2012-09-08
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        相关资源
        最近更新 更多