1#version 120
2/*
3-----------------------------------------------------------------------------
4This source file is part of OGRE
5(Object-oriented Graphics Rendering Engine)
6For the latest info, see http://www.ogre3d.org
7
8Copyright (c) 2000-2013 Torus Knot Software Ltd
9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal
11in the Software without restriction, including without limitation the rights
12to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13copies of the Software, and to permit persons to whom the Software is
14furnished to do so, subject to the following conditions:
15
16The above copyright notice and this permission notice shall be included in
17all copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25THE SOFTWARE.
26-----------------------------------------------------------------------------
27*/
28
29//-----------------------------------------------------------------------------
30// Program Name: SGXLib_Lighting
31// Program Desc: Per pixel lighting functions.
32// Program Type: Vertex/Pixel shader
33// Language: GLSL
34//-----------------------------------------------------------------------------
35
36//-----------------------------------------------------------------------------
37void SGX_TransformNormal(in mat4 m,
38				   in vec3 v,
39				   out vec3 vOut)
40{
41	vOut = (m * vec4(v, 1.0)).xyz;
42}
43
44//-----------------------------------------------------------------------------
45void SGX_TransformPosition(in mat4 mWorldView,
46				   in vec4 vPos,
47				   out vec3 vOut)
48{
49	vOut = (mWorldView * vPos).xyz;
50}
51
52//-----------------------------------------------------------------------------
53void SGX_Light_Directional_Diffuse(
54				   in vec3 vNormal,
55				   in vec3 vNegLightDirView,
56				   in vec3 vDiffuseColour,
57				   in vec3 vBaseColour,
58				   out vec3 vOut)
59{
60	vec3 vNormalView = normalize(vNormal);
61	float nDotL = dot(vNormalView, vNegLightDirView);
62
63	vOut = vBaseColour + vDiffuseColour * clamp(nDotL, 0.0, 1.0);
64}
65
66//-----------------------------------------------------------------------------
67void SGX_Light_Directional_DiffuseSpecular(
68					in vec3 vNormal,
69					in vec3 vViewPos,
70					in vec3 vNegLightDirView,
71					in vec3 vDiffuseColour,
72					in vec3 vSpecularColour,
73					in float fSpecularPower,
74					in vec3 vBaseDiffuseColour,
75					in vec3 vBaseSpecularColour,
76					out vec3 vOutDiffuse,
77					out vec3 vOutSpecular)
78{
79	vOutDiffuse  = vBaseDiffuseColour;
80	vOutSpecular = vBaseSpecularColour;
81
82	vec3 vNormalView = normalize(vNormal);
83	float nDotL		   = dot(vNormalView, vNegLightDirView);
84	vec3 vView       = -normalize(vViewPos);
85	vec3 vHalfWay    = normalize(vView + vNegLightDirView);
86	float nDotH        = dot(vNormalView, vHalfWay);
87
88	if (nDotL > 0.0)
89	{
90		vOutDiffuse  += vDiffuseColour * nDotL;
91		vOutSpecular += vSpecularColour * pow(clamp(nDotH, 0.0, 1.0), fSpecularPower);
92	}
93}
94
95//-----------------------------------------------------------------------------
96void SGX_Light_Point_Diffuse(
97				    in vec3 vNormal,
98				    in vec3 vViewPos,
99				    in vec3 vLightPosView,
100				    in vec4 vAttParams,
101				    in vec3 vDiffuseColour,
102				    in vec3 vBaseColour,
103				    out vec3 vOut)
104{
105	vOut = vBaseColour;
106
107	vec3 vLightView  = vLightPosView - vViewPos;
108	float fLightD      = length(vLightView);
109	vec3 vNormalView = normalize(vNormal);
110	float nDotL        = dot(vNormalView, normalize(vLightView));
111
112	if (nDotL > 0.0 && fLightD <= vAttParams.x)
113	{
114		float fAtten	   = 1.0 / (vAttParams.y + vAttParams.z*fLightD + vAttParams.w*fLightD*fLightD);
115
116		vOut += vDiffuseColour * nDotL * fAtten;
117	}
118}
119
120
121
122//-----------------------------------------------------------------------------
123void SGX_Light_Point_DiffuseSpecular(
124				    in vec3 vNormal,
125				    in vec3 vViewPos,
126				    in vec3 vLightPosView,
127				    in vec4 vAttParams,
128				    in vec3 vDiffuseColour,
129				    in vec3 vSpecularColour,
130					in float fSpecularPower,
131				    in vec3 vBaseDiffuseColour,
132					in vec3 vBaseSpecularColour,
133					out vec3 vOutDiffuse,
134					out vec3 vOutSpecular)
135{
136	vOutDiffuse  = vBaseDiffuseColour;
137	vOutSpecular = vBaseSpecularColour;
138
139	vec3 vLightView  = vLightPosView - vViewPos;
140	float fLightD      = length(vLightView);
141	vLightView		   = normalize(vLightView);
142	vec3 vNormalView = normalize(vNormal);
143	float nDotL        = dot(vNormalView, vLightView);
144
145	if (nDotL > 0.0 && fLightD <= vAttParams.x)
146	{
147		vec3 vView       = -normalize(vViewPos);
148		vec3 vHalfWay    = normalize(vView + vLightView);
149		float nDotH        = dot(vNormalView, vHalfWay);
150		float fAtten	   = 1.0 / (vAttParams.y + vAttParams.z*fLightD + vAttParams.w*fLightD*fLightD);
151
152		vOutDiffuse  += vDiffuseColour * nDotL * fAtten;
153		vOutSpecular += vSpecularColour * pow(clamp(nDotH, 0.0, 1.0), fSpecularPower) * fAtten;
154	}
155}
156
157//-----------------------------------------------------------------------------
158void SGX_Light_Spot_Diffuse(
159				    in vec3 vNormal,
160				    in vec3 vViewPos,
161				    in vec3 vLightPosView,
162				    in vec3 vNegLightDirView,
163				    in vec4 vAttParams,
164				    in vec3 vSpotParams,
165				    in vec3 vDiffuseColour,
166				    in vec3 vBaseColour,
167				    out vec3 vOut)
168{
169	vOut = vBaseColour;
170
171	vec3 vLightView  = vLightPosView - vViewPos;
172	float fLightD      = length(vLightView);
173	vLightView		   = normalize(vLightView);
174	vec3 vNormalView = normalize(vNormal);
175	float nDotL        = dot(vNormalView, vLightView);
176
177	if (nDotL > 0.0 && fLightD <= vAttParams.x)
178	{
179		float fAtten	= 1.0 / (vAttParams.y + vAttParams.z*fLightD + vAttParams.w*fLightD*fLightD);
180		float rho		= dot(vNegLightDirView, vLightView);
181		float fSpotE	= clamp((rho - vSpotParams.y) / (vSpotParams.x - vSpotParams.y), 0.0, 1.0);
182		float fSpotT	= pow(fSpotE, vSpotParams.z);
183
184		vOut += vDiffuseColour * nDotL * fAtten * fSpotT;
185	}
186}
187
188//-----------------------------------------------------------------------------
189void SGX_Light_Spot_DiffuseSpecular(
190				    in vec3 vNormal,
191				    in vec3 vViewPos,
192				    in vec3 vLightPosView,
193				    in vec3 vNegLightDirView,
194				    in vec4 vAttParams,
195				    in vec3 vSpotParams,
196				    in vec3 vDiffuseColour,
197				    in vec3 vSpecularColour,
198					in float fSpecularPower,
199				    in vec3 vBaseDiffuseColour,
200					in vec3 vBaseSpecularColour,
201					out vec3 vOutDiffuse,
202					out vec3 vOutSpecular)
203{
204	vOutDiffuse  = vBaseDiffuseColour;
205	vOutSpecular = vBaseSpecularColour;
206
207	vec3 vLightView  = vLightPosView - vViewPos;
208	float fLightD      = length(vLightView);
209	vLightView		   = normalize(vLightView);
210	vec3 vNormalView = normalize(vNormal);
211	float nDotL        = dot(vNormalView, vLightView);
212
213
214	if (nDotL > 0.0 && fLightD <= vAttParams.x)
215	{
216		vec3 vView       = -normalize(vViewPos);
217		vec3 vHalfWay    = normalize(vView + vLightView);
218		float nDotH        = dot(vNormalView, vHalfWay);
219		float fAtten	= 1.0 / (vAttParams.y + vAttParams.z*fLightD + vAttParams.w*fLightD*fLightD);
220		float rho		= dot(vNegLightDirView, vLightView);
221		float fSpotE	= clamp((rho - vSpotParams.y) / (vSpotParams.x - vSpotParams.y), 0.0, 1.0);
222		float fSpotT	= pow(fSpotE, vSpotParams.z);
223
224		vOutDiffuse  += vDiffuseColour * nDotL * fAtten * fSpotT;
225		vOutSpecular += vSpecularColour * pow(clamp(nDotH, 0.0, 1.0), fSpecularPower) * fAtten * fSpotT;
226	}
227}
228
229