1、环境光
环境光照射结果=材质的反射系数*环境光强度(Ambient)
在片元着色器中 即:FragColor = Color (物体颜色)* Ambient * 材质的反射系数
2、散射光
散射光照射结果=材质的反射系数*散射光强度*max(cos(入射角),0)
在开发中将其分解为两步:
散射光最终强度=散射光强度*max(cos(入射角),0)
散射光照射结果=材质的反射系数*散射光最终强度
在顶点着色器中:
uniform mat4 MVP;
uniform mat4 M;
uniform vec3 lightPosition;
in vec3 Position;
in vec3 Normal;
out vec4 diffuseTemp;
vec3 normalTarget = Position + Normal;
vec3 newNormal = (M * vec4(normalTarget,1)).xyz - (M * vec4(Position,1)).xyz;
newNormal = normalize(newNormal);//法向量
//点到点光源的向量
vec3 pointTOlight = normalize(lightPosition - ((M * vec4(Position,1)).xyz));
vec4 diffuseTemp = LightDiffuse(散射光强度)*max(0.0,dot(newNormal,pointTOlight));//散射光最终强度=散射光强度*max(cos(入射角),0)
在片元着色器中:
FragColor = Color (物体颜色)* diffuseTemp * 材质的反射系数
3、镜面光
镜面光照射结果=材质的反射系数*镜面光强度*max(0,(cos(半向量与法向量的夹角)))
在开发中将其分解为两步:
镜面光最终强度=镜面光强度*max(0,(cos(半向量与法向量的夹角)))
镜面光照射结果=材质的反射系数*镜面光最终强度
在顶点着色器中:
uniform mat4 MVP;
uniform mat4 M;
uniform vec3 lightPosition;
uniform vec3 eyePosition;
in vec3 Position;
in vec3 Normal;
out vec4 specular ;
vec3 normalTarget = Position + Normal;
vec3 newNormal = (M * vec4(normalTarget,1)).xyz - (M * vec4(Position,1)).xyz;
newNormal = normalize(newNormal);//法向量
//点到点光源的向量
vec3 pointTOlight = normalize(lightPosition - ((M * vec4(Position,1)).xyz));
//点到摄像机的向量vec3 pointTOeye = normalize(eyePosition - ((M * vec4(Position,1)).xyz));
//粗糙度
float shininess = 50.0f;
vec3 half = normalize(pointTOlight + pointTOeye );
vec4 specular = LightSpecular(镜面光强度) * max(0.0,pow(dot(newNormal ,half),shininess));
在片元着色器中:
FragColor = Color (物体颜色)* specular * 材质的反射系数
4、三光合一在片元着色器中:
FragColor = Color (物体颜色)* Ambient * 材质的反射系数+Color (物体颜色)* diffuse* 材质的反射系数+Color (物体颜色)* specular * 材质的反射系数
5、方向光
传入方向光向量,在顶点着色器中,vec3 pointTOlight = LightDierction ,之后计算过程相等。
6、点法向量与面法向量
点法向量:适用于球等表面光滑的模型,向量参考球的向量
面法向量:适用于表面不光滑的模型,如立方体等。其向量构建方法为一个点多次输入,多次更新对应面的法向量。其等于在一个位置存在多个位置坐标相同但是法向量不同的点,一个点对应一个面。
7、片元着色器中计算光照
顶点着色器:计算速度快,但效果差于片元着色器中计算。
片元着色器:计算速度慢,光照效果好,更加细腻,光照过度平滑,没有明显的边缘。
方法:顶点着色器接受到normal后,直接传入片元着色器,然后将光照的计算部分移入片元着色器中。
(图片待续)