由于ES2.0使用了Shader而非固定管线,所以一些变换操作要自己来完成。为了正确把光打到顶点要完成以下变换。
首先,对顶点空间位置做变换这里使用model-view-projection变换。
然后,对normal进行变换,这个是一定要的,否则光照肯定不对。当顶点的空间位置在世界坐标系中发生了改变,normal作为顶点的属性之一,使用normal矩阵对normal进行变换,normal矩阵可以通过model-view计算获得。
这次程序只做了逐顶点光照,当然稍微更改下Shader便可以改成逐像素光照。如果要使模型看起来比较亮的话可以使用Phong光照,使用Phong光照的模型会比较有塑料感觉。
关于逐像素光照和Phong光照有时间再写吧。
以下是vsh与fsh的代码:
vsh
attribute vec4 position;
attribute vec3 normal;
uniform mat3 normalMatrix;
uniform mat4 modelViewProjectionMatrix;
varying vec4 varColor;
void main()
{
vec3 lightPos = vec3(0.0, 1.0, 1.0);
vec3 lightDir = normalize(lightPos - position.xyz);
varColor = vec4(1.0, 1.0, 1.0, 1.0) * dot(normalize(normalMatrix * normal), lightDir);
varColor.w = 1.0;
gl_Position = modelViewProjectionMatrix * position;
}
fsh
varying vec4 varColor;
void main()
{
gl_FragColor = varColor;
}