WebGl Phong着色器中的错误

WebGl Phong着色器中的错误,webgl,shader,phong,Webgl,Shader,Phong,我正在webgl中开发一个简单的phong着色器,我想我已经接近了,但还是有问题。死亡赠予:如果我有一个广告牌并让它滚动(因此它像轮子一样旋转),那么被点亮的广告牌部分会随着它旋转:(.这让我很困惑,因为这似乎是模型矩阵的问题,但变换使所有位置和旋转正确,只是照明错误。与视图矩阵一样,我可以自由移动和查看,所有东西都位于正确的位置,只是照明错误 以下是我的着色器(减去空间的定义,并将模型矩阵中的照明移到GPU中以清晰显示){如果您喜欢在github中阅读:} 真空总管(真空){ vec3轻量化

我正在webgl中开发一个简单的phong着色器,我想我已经接近了,但还是有问题。死亡赠予:如果我有一个广告牌并让它滚动(因此它像轮子一样旋转),那么被点亮的广告牌部分会随着它旋转:(.这让我很困惑,因为这似乎是模型矩阵的问题,但变换使所有位置和旋转正确,只是照明错误。与视图矩阵一样,我可以自由移动和查看,所有东西都位于正确的位置,只是照明错误

以下是我的着色器(减去空间的定义,并将模型矩阵中的照明移到GPU中以清晰显示){如果您喜欢在github中阅读:}


真空总管(真空){
vec3轻量化;
如果(!uUserLighting){
轻量化=vec3(1.0,1.0,1.0);
}否则{
vec3 lightDirection=规格化(vLightPosition.xyz-vPosition.xyz);
浮动方向轻量化=最大值(0.0,点(
正常化(VTTransformedNormal),
光照方向);
轻量化=uAmbientColor+uPointLightingColor*方向轻量化;
}
vec4片段颜色;
if(uUseTexture){
fragmentColor=texture2D(uSampler,
vec2(vtexturecord.s,vtexturecord.t));
}否则{
碎片颜色=uColor;
}
gl_fragmcolor=vec4(fragmentColor.rgb*轻量化,fragmentColor.a);
}
真空总管(真空){
vPosition=uModelMatrix*vec4(1.0);
//TODO:移回CPU
vLightPosition=uModelMatrix*vec4(向上点照明位置,1.0);
gl_位置=监督矩阵*uViewMatrix*V位置;
vTextureCoord=ATextureCord;
vTransformedNormal=正常化(非正常矩阵*避免异常);
}

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

不知道回答您自己问题的政策是什么,但如果有人遇到同样的问题:

我用模型矩阵变换我的灯光位置。这没有任何意义,因为灯光位置已经在世界坐标中,所以根本不需要变换它

<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>