1 2#include "lights.glsl:default" 3#include "lights.glsl:ambient" 4#include ":dirLights" 5#include ":pointLights" 6 7#ifdef lightingFlag 8 void applyLights(const in vec4 position, const in vec3 viewVec, const in vec3 normal, const in float shininess) { 9 #if defined(ambientFlag) 10 #if defined(separateAmbientFlag) 11 g_lightAmbient = getAmbient(normal); 12 #else 13 g_lightDiffuse = getAmbient(normal); 14 #endif 15 #endif 16 applyDirectionalLights(g_lightDiffuse, g_lightSpecular, viewVec, normal, shininess); 17 applyPointLights(g_lightDiffuse, g_lightSpecular, position, viewVec, normal, shininess); 18 } 19#else 20 #define applyLights(position, viewVec, normal, shininess) nop() 21#endif 22 23[common] 24#define gouraudSpecularComponent(normal, lightDir, viewDir, shininess) pow(dot(normal, normalize((lightDir) + (viewDir))), shininess) 25 26 27[dirLights] 28#include "common.glsl:specularFlag" 29#include "common.glsl:nop" 30#include "lights.glsl:dirLights" 31#include ":common" 32 33#ifdef directionalLightsFlag 34 /** Apply the directional lights to the diffuse argument using a basic lighting algorithm */ 35 void applyDiffuseDirectionalLights(inout vec3 diffuse, const in vec3 normal) { 36 for (int i = 0; i < numDirectionalLights; i++) { 37 vec3 lightDir = -u_dirLights[i].direction; 38 float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0); 39 diffuse += u_dirLights[i].color * NdotL; 40 } 41 } 42 43 /** Apply the directional lights to both the diffuse and specular arguments using a basic lighting algorithm */ 44 void applyDiffuseAndSpecularDirectionalLights(inout vec3 diffuse, inout vec3 specular, const in vec3 viewVec, const in vec3 normal, const in float shininess) { 45 for (int i = 0; i < numDirectionalLights; i++) { 46 vec3 lightDir = -u_dirLights[i].direction; 47 float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0); 48 diffuse += u_dirLights[i].color * NdotL; 49 specular += u_dirLights[i].color * NdotL * gouraudSpecularComponent(normal, lightDir, viewVec, shininess); 50 //float halfDotView = dot(normal, normalize(lightDir + viewVec)); 51 //specular += u_dirLights[i].color * clamp(NdotL * pow(halfDotView, shininess), 0.0, 1.0); 52 } 53 } 54 #ifdef specularFlag 55 #define applyDirectionalLights(diffuse, specular, viewVec, normal, shininess) applyDiffuseAndSpecularDirectionalLights(diffuse, specular, viewVec, normal, shininess) 56 #else 57 #define applyDirectionalLights(diffuse, specular, viewVec, normal, shininess) applyDiffuseDirectionalLights(diffuse, normal) 58 #endif 59#else 60 #define applyDiffuseDirectionalLights(diffuse, normal) nop() 61 #define applyDiffuseAndSpecularDirectionalLights(diffuse, specular, viewVec, normal, shininess) nop() 62 #define applyDirectionalLights(diffuse, specular, viewVec, normal, shininess) nop() 63#endif 64 65 66 67 68 69[pointLights] 70#include "common.glsl:nop" 71#include "common.glsl:specularFlag" 72#include "lights.glsl:pointLights" 73#include ":common" 74 75#ifdef pointLightsFlag 76 void applyDiffusePointLights(inout vec3 diffuse, const in vec3 pos, const in vec3 normal) { 77 for (int i = 0; i < numPointLights; i++) { 78 vec3 lightDir = u_pointLights[i].position - pos; 79 float dist2 = dot(lightDir, lightDir); 80 lightDir *= inversesqrt(dist2); 81 float NdotL = clamp(dot(normal, lightDir), 0.0, 2.0); 82 float falloff = clamp(u_pointLights[i].intensity / (1.0 + dist2), 0.0, 2.0); // FIXME mul intensity on cpu 83 diffuse += u_pointLights[i].color * (NdotL * falloff); 84 } 85 } 86 87 void applyDiffusePointLights(inout vec3 diffuse, const in vec4 pos, const in vec3 normal) { 88 applyDiffusePointLights(diffuse, pos.xyz, normal); 89 } 90 91 void applyDiffuseAndSpecularPointLights(inout vec3 diffuse, inout vec3 specular, const in vec3 pos, const in vec3 viewVec, const in vec3 normal, const in float shininess) { 92 for (int i = 0; i < numPointLights; i++) { 93 vec3 lightDir = u_pointLights[i].position - pos; 94 float dist2 = dot(lightDir, lightDir); 95 lightDir *= inversesqrt(dist2); 96 float NdotL = clamp(dot(normal, lightDir), 0.0, 2.0); 97 float falloff = clamp(u_pointLights[i].intensity / (1.0 + dist2), 0.0, 2.0); // FIXME mul intensity on cpu 98 diffuse += u_pointLights[i].color * (NdotL * falloff); 99 float halfDotView = clamp(dot(normal, normalize(lightDir + viewVec)), 0.0, 2.0); 100 specular += u_pointLights[i].color * clamp(NdotL * pow(halfDotView, shininess) * falloff, 0.0, 2.0); 101 } 102 } 103 104 void applyDiffuseAndSpecularPointLights(inout vec3 diffuse, inout vec3 specular, const in vec4 pos, const in vec3 viewVec, const in vec3 normal, const in float shininess) { 105 applyDiffuseAndSpecularPointLights(diffuse, specular, pos.xyz, viewVec, normal, shininess); 106 } 107 #ifdef specularFlag 108 #define applyPointLights(diffuse, specular, pos, viewVec, normal, shininess) applyDiffuseAndSpecularPointLights(diffuse, specular, pos, viewVec, normal, shininess) 109 #else 110 #define applyPointLights(diffuse, specular, pos, viewVec, normal, shininess) applyDiffusePointLights(diffuse, pos, normal) 111 #endif 112#else 113 #define applyDiffusePointLights(diffuse, pos, normal) nop() 114 #define applyDiffuseAndSpecularPointLights(diffuse, specular, pos, viewVec, normal, shininess) nop() 115 #define applyPointLights(diffuse, specular, pos, viewVec, normal, shininess) nop() 116#endif 117