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