ADSGouraud.vp

// 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)