1#version 150 core 2precision highp int; 3precision highp float; 4 5struct Light 6{ 7 vec3 position; 8 vec3 ambient; 9 vec3 diffuse; 10 vec3 specular; 11 vec4 lightModel; 12}; 13 14struct MaterialColor 15{ 16 vec4 ambient; 17 vec4 diffuse; 18 vec4 specular; 19 vec3 emission; 20 float shininess; 21}; 22 23in vec3 iPosition; 24in vec3 iNormal; 25in vec2 iUv; 26in vec4 iColor; 27 28uniform mat4 uCurrentProjectionMatrix; 29uniform mat4 uCurrentModelViewMatrix; 30uniform mat4 uCurrentTextureMatrix; 31 32uniform bool uIsLight; 33uniform Light uLight; 34uniform MaterialColor uMaterial; 35uniform int uMaterialFlags; 36 37out vec4 oViewPos; 38out vec2 oUv; 39out vec4 oColor; 40out vec4 oLightResult; 41 42vec4 getLightResult() 43{ 44 vec3 normal = normalize(mat3(transpose(inverse(uCurrentModelViewMatrix))) * vec3(iNormal.x, iNormal.y, -iNormal.z)); 45 float nDotVP = max(0.0, dot(normal, normalize(vec3(uLight.position)))); 46 float nDotHV = max(0.0, dot(normal, normalize(vec3(oViewPos.xyz + uLight.position)))); 47 float pf = nDotVP == 0.0 ? 0.0 : pow(nDotHV, uMaterial.shininess); 48 49 vec4 ambient = vec4(uLight.ambient, 1.0); 50 vec4 diffuse = vec4(uLight.diffuse, 1.0) * nDotVP; 51 vec4 specular = vec4(uLight.specular, 1.0) * pf; 52 53 vec4 sceneColor = (uMaterialFlags & 1) != 0 ? vec4(uMaterial.emission, 1.0) + uMaterial.ambient * uLight.lightModel : uLight.lightModel; 54 vec4 finalColor = sceneColor + ambient * uMaterial.ambient + diffuse * uMaterial.specular + specular * uMaterial.specular; 55 return clamp(finalColor, 0.0, 1.0); 56} 57 58void main() 59{ 60 oViewPos = uCurrentModelViewMatrix * vec4(vec3(iPosition.x, iPosition.y, -iPosition.z), 1.0); 61 gl_Position = uCurrentProjectionMatrix * oViewPos; 62 63 oUv = (uCurrentTextureMatrix * vec4(iUv, 1.0, 1.0)).xy; 64 oColor = iColor; 65 oLightResult = uIsLight && (uMaterialFlags & 4) == 0 ? getLightResult() : uMaterial.ambient; 66} 67