镜面光照
镜面光照(Specular Lighting)依据光的方向向量和物体的法向量计算。
我们通过反射法向量周围光的方向计算反射向量。然后我们计算反射向量和视线方向的角度,如果之间的角度越小,那么镜面光的作用就会越大。它的作用效果就是,当我们去看光被物体所反射的那个方向的时候,我们会看到一个高光。观察向量是镜面光照的一个附加变量,我们可以使用观察者世界空间位置(Viewer’s World Space Position)和片段的位置来计算。之后,我们计算镜面光亮度,用它乘以光的颜色,在用它加上作为之前计算的光照颜色。
顶点着色器
attribute vec4 a_position;
uniform mat4 u_worldViewProjection;
attribute vec4 aVertexColor;
//法向量的变量
attribute vec3 a_normal;
uniform mat4 uModelViewMatrix;
uniform mat4 uProjectionMatrix;
varying lowp vec4 vColor;
//将法向量从顶点着色器传递到片元着色器的变量
varying lowp vec3 v_normal;
varying lowp vec3 v_fragpos;
void main() {
gl_Position = uProjectionMatrix * uModelViewMatrix * a_position;
vColor = aVertexColor;
v_normal = mat3(uModelViewMatrix) * a_normal;
v_fragpos = vec3(uModelViewMatr