GLSL学习笔记 - 6.2 Vertex Shader
一个简单的逐顶点光照模型。光照效果由散射光和镜面反射光构成。
程序流程
转化顶点与法线到当前的眼坐标系中
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
![](/Images/OutliningIndicators/None.gif)
得到 顶点->光源向量 与 顶点->观察点向量
vec3 lightVec = normalize(LightPosition - ecPosition);
vec3 viewVec = normalize(-ecPosition);
![](/Images/OutliningIndicators/None.gif)
根据 入射光线向量 计算反射光线向量
vec3 reflectVec = reflect(-lightVec, tnorm);
![](/Images/OutliningIndicators/None.gif)
假设漫反射光线强度随入射光线与法线夹角呈余弦分布,
则漫反射光照强度可以近似为
float diffuse = max(dot(lightVec, tnorm), 0.0);
![](/Images/OutliningIndicators/None.gif)
假设镜面反射光线强度随反射光线与观察方向夹角呈余弦分布,
则镜面反射光照强度可以近似为
spec = max(dot(reflectVec, viewVec), 0.0);
随后增强镜面反射聚集度
spec = pow(spec, 16.0);
![](/Images/OutliningIndicators/None.gif)
最后通过混合散射光与镜面光强度获得该顶点光线强度
LightIntensity = DiffuseContribution * diffuse + SpecularContribution * spec;
程序清单
uniform vec3 LightPosition;
![](/Images/OutliningIndicators/None.gif)
const float SpecularContribution = 0.3;
![](/Images/OutliningIndicators/None.gif)
const float DiffuseContribution = 1.0 - SpecularContribution;
![](/Images/OutliningIndicators/None.gif)
varying float LightIntensity;
![](/Images/OutliningIndicators/None.gif)
varying vec2 MCposition;
![](/Images/OutliningIndicators/None.gif)
void main(void){
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
![](/Images/OutliningIndicators/InBlock.gif)
vec3 lightVec = normalize(LightPosition - ecPosition);
![](/Images/OutliningIndicators/InBlock.gif)
vec3 reflectVec = reflect(-lightVec, tnorm);
![](/Images/OutliningIndicators/InBlock.gif)
vec3 viewVec = normalize(-ecPosition);
![](/Images/OutliningIndicators/InBlock.gif)
float diffuse = max(dot(lightVec, tnorm), 0.0);
![](/Images/OutliningIndicators/InBlock.gif)
float spec = 0.0;
![](/Images/OutliningIndicators/InBlock.gif)
if (diffuse > 0.0){
spec = max(dot(reflectVec, viewVec), 0.0);
spec = pow(spec, 16.0);
}
![](/Images/OutliningIndicators/InBlock.gif)
LightIntensity = DiffuseContribution * diffuse + SpecularContribution * spec;
![](/Images/OutliningIndicators/InBlock.gif)
MCposition = gl_Vertex.xy;
gl_Position = ftransform();
}
程序流程
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
程序清单
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)