// ADS Point lighting Shader
// Vertex Shader
#version 330
in vec4 vVertex ; // 顶点位置[世界坐标]
in vec3 vNormal ; // 顶点法线[世界坐标]
smooth out vec4 vVaryingColor ;
uniform vec4 ambientColor ; // 环境光
uniform vec4 diffuseColor ; // 漫反射光
uniform vec4 specularColor ; // 镜面反射光
uniform vec3 lightPosition ; // 光源位置[世界坐标]
uniform mat4 mvpMatrix ; // 模型-视图-投影矩阵
uniform mat4 mvMatrix ; // 模型-视图矩阵
uniform mat3 normalMatrix ; // 不带平移的模型-视图矩阵
void main (void)
{
// 获得顶点在摄像机坐标系中的位置
vec4 vec4Temp = mvMatrix * vVertex ;
// 抵消可能的缩放
vec3 vVertexInView = vec4Temp.xyz / vec4Temp.w ;
// 计算从顶点到光源方向的单位向量
vec3 vLightDirection = normalize(lightPosition - vVertexInView) ;
// 获得顶点法线在摄像机坐标中的位置
vec3 vNormalInView = normalMatrix * vNormal ;
float fDiffuseColorWeight = max(0, dot(vLightDirection, vNormalInView)) ;
// 计算出漫反射颜色
vVaryingColor = diffuseColor * fDiffuseColorWeight ;
// 叠加上环境光,这个不能放在计算镜面反射之后
vVaryingColor += ambientColor ;
// 计算镜面反射颜色
if (fDiffuseColorWeight > 0)
{
// 计算反射光线向量
vec3 relectionDirection = normalize(reflect(-lightPosition, vNormalInView)) ;
float fTemp = max(0, dot(relectionDirection, vNormalInView)) ;
if (fTemp > 0)
{
float vSpecularColorWeight = pow(fTemp, 128) ;
// 叠加镜面高光
vVaryingColor.rgb += vec3(vSpecularColorWeight, vSpecularColorWeight, vSpecularColorWeight) ;
}
}
// 将顶点从世界坐标系投影到裁剪立方体
gl_Position = mvpMatrix * vVertex ;
}
ADSGouraud.vp
最新推荐文章于 2021-04-05 13:25:09 发布