普通的点光源着色器改成聚光灯着色器

// 像素着色器
precision mediump float;
const int maxLightCount = 32;
varying vec2 v_texcoord;
varying vec4 v_nomal;
varying vec4 v_position;
varying vec4 v_eye;
varying vec4 v_fragmentColor;
uniform mat4 tMvpMatrix;
uniform vec4 fogColor;
uniform float fogConcentration;
uniform sampler2D Texture;
uniform float fTextureDraw;
uniform float fAddRender;
uniform bool bEnabled[maxLightCount];
uniform vec4 vLightPos[maxLightCount];
uniform vec4 vLightClolor[maxLightCount];
uniform vec4 vLightAttenuation[maxLightCount];
uniform vec4 vSpotDirPos[maxLightCount];uniform float fSpotAngle[maxLightCount];void main()
{
	vec4 vColour = vec4(0.0);
	for(int i=0; i<maxLightCount; i++){
	if(bEnabled[i] == false){
		continue;
	}
	vec4 lightPos = tMvpMatrix * vLightPos[i];
	vec4 vObjPos = tMvpMatrix * v_position;	vec4 lightDir = normalize(lightPos-vObjPos);
	vec4 halfVector=normalize(lightDir+v_eye);
	float att = 1.0;
	// 计算衰减系数
	if(vLightAttenuation[i].w > 0.0){
		float d = length(vLightPos[i]-v_position);
		att = 1.0/(vLightAttenuation[i].x + vLightAttenuation[i].y*d + vLightAttenuation[i].z*d*d);
		// 如果角度小于180度的话,就判断为聚光灯
		if(fSpotAngle[i] < 180.0){
			float spotAtt = 0.0;
			vec4 SpotLigthDir = normalize(v_position - vLightPos[i]);
			vec4 vDir = normalize(vSpotDirPos[i] - vLightPos[i]);
			float dotSpot = dot(SpotLigthDir, vDir);
			float cosCutoff = cos(fSpotAngle[i]*3.1415926/180.0);
			if (dotSpot > cosCutoff){
				spotAtt = 1.0;
			}
			att *= spotAtt;
		}
	}
	float nDotVP = max(0.0, dot(v_nomal, lightDir));
	float nDotHV = max(0.0, dot(v_nomal, halfVector));
	float pf = 0.0;
	if(nDotVP > 0.0){
		pf = pow(nDotHV, 10.0);
	}
	float fValue = (nDotVP+0.3+pf)*att;
	vec4 vColorIn = vec4(fValue*vLightClolor[i].x, fValue*vLightClolor[i].y, fValue*vLightClolor[i].z, 1.0);
	vColour += vColorIn;
	}
	vColour += v_fragmentColor;
	gl_FragColor = texture2D(Texture, v_texcoord)*vColour;
	float fogFactor = 0.008 * gl_FragCoord.z/gl_FragCoord.w;
	fogFactor *= fogFactor;
	fogFactor = clamp(pow(fogConcentration, -fogFactor), 0.0, 1.0);
	gl_FragColor = mix(fogColor, gl_FragColor, fogFactor);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值