• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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