// 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 ; }