69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| uniform int useTexture;
 | |
| uniform sampler2D texSampler;
 | |
| uniform int numLights;
 | |
| uniform vec4 materialColor;
 | |
| uniform float shininess;
 | |
| uniform vec3 ambientLight;
 | |
| 
 | |
| struct Light {
 | |
| 	vec4 vector;
 | |
| 	vec3 color;
 | |
| 	float intensity;
 | |
| 	float linear_att;
 | |
| };
 | |
| 
 | |
| uniform Light lights[10];
 | |
| 
 | |
| varying vec3 fcolor;
 | |
| varying vec2 ftexcoord;
 | |
| varying vec3 fnormal;
 | |
| varying vec4 fposition;
 | |
| 
 | |
| void main() {
 | |
| 	vec3 diffuseAccum = vec3(0.0, 0.0, 0.0);
 | |
| 	vec3 specularAccum = vec3(0.0, 0.0, 0.0);
 | |
| 
 | |
| 	if (numLights > 0) {
 | |
| 		diffuseAccum = ambientLight;
 | |
| 
 | |
| 		for (int i = 0; i < 10; i++) {
 | |
| 			if (i >= numLights) break;
 | |
| 
 | |
| 			vec3 N = normalize(fnormal);
 | |
| 			vec3 L = lights[i].vector.xyz;
 | |
| 			float attenuation = 1.0;
 | |
| 
 | |
| 			if (lights[i].vector.w == 1.0) {
 | |
| 				L = L - fposition.xyz;
 | |
| 				float distance = length(L);
 | |
| 				attenuation = 1.0 / (1.0 + lights[i].linear_att * distance);
 | |
| 			}
 | |
| 
 | |
| 			L = normalize(L);
 | |
| 			float NdotL = max(dot(N, L), 0.0);
 | |
| 
 | |
| 			diffuseAccum += NdotL * lights[i].color * lights[i].intensity * attenuation;
 | |
| 
 | |
| 			if (shininess > 0.0 && NdotL > 0.0) {
 | |
| 				vec3 V = normalize(-fposition.xyz);
 | |
| 				vec3 H = normalize(L + V);
 | |
| 				float NdotH = max(dot(N, H), 0.0);
 | |
| 				specularAccum += pow(NdotH, shininess) * attenuation * lights[i].color * lights[i].intensity;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	vec4 fragmentColor;
 | |
| 	if (useTexture == 1) {
 | |
| 		fragmentColor = texture2D(texSampler, ftexcoord);
 | |
| 	} else {
 | |
| 		fragmentColor = materialColor;
 | |
| 	}
 | |
| 
 | |
| 	if (numLights > 0) {
 | |
| 		gl_FragColor = vec4(fragmentColor.rgb * diffuseAccum + specularAccum, fragmentColor.a);
 | |
| 	} else {
 | |
| 		gl_FragColor = fragmentColor;
 | |
| 	}
 | |
| }
 |