WebGl Phong着色器中的错误

时间:2014-04-19 16:34:46

标签: webgl shader phong

我正在使用webgl中的一个简单的phong着色器,我想我已经接近了但是仍然存在问题。死了:如果我有一个广告牌并让它滚动(所以它像一个轮子一样旋转),点亮的广告牌部分旋转它:(。这让我感到困惑,因为这似乎是模型的一个问题矩阵,但变换使所有的位置和旋转都正确,只是灯光错误。同样的视图矩阵,我可以四处移动,看起来自由,一切都位于适当的位置,只是点亮了错误。

以下是我的着色器(减去空间的定义,并且为了清晰起见,模型矩阵中的光照移动到GPU中){如果您更喜欢在github中阅读:https://github.com/nickgeorge/quantum/blob/master/index.html#L41}

<script id="fragment-shader" type="x-shader/x-fragment">
  void main(void) {
    vec3 lightWeighting;
    if (!uUseLighting) {
      lightWeighting = vec3(1.0, 1.0, 1.0);
    } else {
      vec3 lightDirection = normalize(vLightPosition.xyz - vPosition.xyz);

      float directionalLightWeighting = max(0.0, dot(
          normalize(vTransformedNormal),
          lightDirection));
      lightWeighting = uAmbientColor + uPointLightingColor * directionalLightWeighting;
    }

    vec4 fragmentColor;
    if (uUseTexture) {
      fragmentColor = texture2D(uSampler, 
          vec2(vTextureCoord.s, vTextureCoord.t));
    } else {
      fragmentColor = uColor;
    }
    gl_FragColor = vec4(fragmentColor.rgb * lightWeighting, fragmentColor.a);
  }
</script>

<script id="vertex-shader" type="x-shader/x-vertex">
  void main(void) {
    vPosition = uModelMatrix * vec4(aVertexPosition, 1.0);

    // TODO: Move back to CPU 
    vLightPosition = uModelMatrix * vec4(uPointLightingLocation, 1.0);

    gl_Position = uPerspectiveMatrix * uViewMatrix * vPosition;
    vTextureCoord = aTextureCoord;
    vTransformedNormal = normalize(uNormalMatrix * aVertexNormal);
  }
</script>

非常感谢,如果还有其他有用的内容,请告诉我。

1 个答案:

答案 0 :(得分:1)

Dunno这里的政策是回答你自己的问题,但万一有人因此遇到同样的问题:

我正在用模型矩阵改变我的光位置。这没有任何意义,因为光位置已经处于世界坐标中,因此根本不需要对其进行转换。