我正在使用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>
非常感谢,如果还有其他有用的内容,请告诉我。
答案 0 :(得分:1)
Dunno这里的政策是回答你自己的问题,但万一有人因此遇到同样的问题:
我正在用模型矩阵改变我的光位置。这没有任何意义,因为光位置已经处于世界坐标中,因此根本不需要对其进行转换。