1#if defined(diffuseTextureFlag) || defined(specularTextureFlag) 2#define textureFlag 3#endif 4 5#if defined(specularTextureFlag) || defined(specularColorFlag) 6#define specularFlag 7#endif 8 9#if defined(specularFlag) || defined(fogFlag) 10#define cameraPositionFlag 11#endif 12 13attribute vec3 a_position; 14uniform mat4 u_projViewTrans; 15 16#if defined(colorFlag) 17varying vec4 v_color; 18attribute vec4 a_color; 19#endif // colorFlag 20 21#ifdef normalFlag 22attribute vec3 a_normal; 23uniform mat3 u_normalMatrix; 24varying vec3 v_normal; 25#endif // normalFlag 26 27#ifdef textureFlag 28attribute vec2 a_texCoord0; 29#endif // textureFlag 30 31#ifdef diffuseTextureFlag 32uniform vec4 u_diffuseUVTransform; 33varying vec2 v_diffuseUV; 34#endif 35 36#ifdef specularTextureFlag 37uniform vec4 u_specularUVTransform; 38varying vec2 v_specularUV; 39#endif 40 41#ifdef boneWeight0Flag 42#define boneWeightsFlag 43attribute vec2 a_boneWeight0; 44#endif //boneWeight0Flag 45 46#ifdef boneWeight1Flag 47#ifndef boneWeightsFlag 48#define boneWeightsFlag 49#endif 50attribute vec2 a_boneWeight1; 51#endif //boneWeight1Flag 52 53#ifdef boneWeight2Flag 54#ifndef boneWeightsFlag 55#define boneWeightsFlag 56#endif 57attribute vec2 a_boneWeight2; 58#endif //boneWeight2Flag 59 60#ifdef boneWeight3Flag 61#ifndef boneWeightsFlag 62#define boneWeightsFlag 63#endif 64attribute vec2 a_boneWeight3; 65#endif //boneWeight3Flag 66 67#ifdef boneWeight4Flag 68#ifndef boneWeightsFlag 69#define boneWeightsFlag 70#endif 71attribute vec2 a_boneWeight4; 72#endif //boneWeight4Flag 73 74#ifdef boneWeight5Flag 75#ifndef boneWeightsFlag 76#define boneWeightsFlag 77#endif 78attribute vec2 a_boneWeight5; 79#endif //boneWeight5Flag 80 81#ifdef boneWeight6Flag 82#ifndef boneWeightsFlag 83#define boneWeightsFlag 84#endif 85attribute vec2 a_boneWeight6; 86#endif //boneWeight6Flag 87 88#ifdef boneWeight7Flag 89#ifndef boneWeightsFlag 90#define boneWeightsFlag 91#endif 92attribute vec2 a_boneWeight7; 93#endif //boneWeight7Flag 94 95#if defined(numBones) && defined(boneWeightsFlag) 96#if (numBones > 0) 97#define skinningFlag 98#endif 99#endif 100 101uniform mat4 u_worldTrans; 102 103#if defined(numBones) 104#if numBones > 0 105uniform mat4 u_bones[numBones]; 106#endif //numBones 107#endif 108 109#ifdef shininessFlag 110uniform float u_shininess; 111#else 112const float u_shininess = 20.0; 113#endif // shininessFlag 114 115#ifdef blendedFlag 116uniform float u_opacity; 117varying float v_opacity; 118 119#ifdef alphaTestFlag 120uniform float u_alphaTest; 121varying float v_alphaTest; 122#endif //alphaTestFlag 123#endif // blendedFlag 124 125#ifdef lightingFlag 126varying vec3 v_lightDiffuse; 127 128#ifdef ambientLightFlag 129uniform vec3 u_ambientLight; 130#endif // ambientLightFlag 131 132#ifdef ambientCubemapFlag 133uniform vec3 u_ambientCubemap[6]; 134#endif // ambientCubemapFlag 135 136#ifdef sphericalHarmonicsFlag 137uniform vec3 u_sphericalHarmonics[9]; 138#endif //sphericalHarmonicsFlag 139 140#ifdef specularFlag 141varying vec3 v_lightSpecular; 142#endif // specularFlag 143 144#ifdef cameraPositionFlag 145uniform vec4 u_cameraPosition; 146#endif // cameraPositionFlag 147 148#ifdef fogFlag 149varying float v_fog; 150#endif // fogFlag 151 152 153#if numDirectionalLights > 0 154struct DirectionalLight 155{ 156 vec3 color; 157 vec3 direction; 158}; 159uniform DirectionalLight u_dirLights[numDirectionalLights]; 160#endif // numDirectionalLights 161 162#if numPointLights > 0 163struct PointLight 164{ 165 vec3 color; 166 vec3 position; 167}; 168uniform PointLight u_pointLights[numPointLights]; 169#endif // numPointLights 170 171#if defined(ambientLightFlag) || defined(ambientCubemapFlag) || defined(sphericalHarmonicsFlag) 172#define ambientFlag 173#endif //ambientFlag 174 175#ifdef shadowMapFlag 176uniform mat4 u_shadowMapProjViewTrans; 177varying vec3 v_shadowMapUv; 178#define separateAmbientFlag 179#endif //shadowMapFlag 180 181#if defined(ambientFlag) && defined(separateAmbientFlag) 182varying vec3 v_ambientLight; 183#endif //separateAmbientFlag 184 185#endif // lightingFlag 186 187void main() { 188 #ifdef diffuseTextureFlag 189 v_diffuseUV = u_diffuseUVTransform.xy + a_texCoord0 * u_diffuseUVTransform.zw; 190 #endif //diffuseTextureFlag 191 192 #ifdef specularTextureFlag 193 v_specularUV = u_specularUVTransform.xy + a_texCoord0 * u_specularUVTransform.zw; 194 #endif //specularTextureFlag 195 196 #if defined(colorFlag) 197 v_color = a_color; 198 #endif // colorFlag 199 200 #ifdef blendedFlag 201 v_opacity = u_opacity; 202 #ifdef alphaTestFlag 203 v_alphaTest = u_alphaTest; 204 #endif //alphaTestFlag 205 #endif // blendedFlag 206 207 #ifdef skinningFlag 208 mat4 skinning = mat4(0.0); 209 #ifdef boneWeight0Flag 210 skinning += (a_boneWeight0.y) * u_bones[int(a_boneWeight0.x)]; 211 #endif //boneWeight0Flag 212 #ifdef boneWeight1Flag 213 skinning += (a_boneWeight1.y) * u_bones[int(a_boneWeight1.x)]; 214 #endif //boneWeight1Flag 215 #ifdef boneWeight2Flag 216 skinning += (a_boneWeight2.y) * u_bones[int(a_boneWeight2.x)]; 217 #endif //boneWeight2Flag 218 #ifdef boneWeight3Flag 219 skinning += (a_boneWeight3.y) * u_bones[int(a_boneWeight3.x)]; 220 #endif //boneWeight3Flag 221 #ifdef boneWeight4Flag 222 skinning += (a_boneWeight4.y) * u_bones[int(a_boneWeight4.x)]; 223 #endif //boneWeight4Flag 224 #ifdef boneWeight5Flag 225 skinning += (a_boneWeight5.y) * u_bones[int(a_boneWeight5.x)]; 226 #endif //boneWeight5Flag 227 #ifdef boneWeight6Flag 228 skinning += (a_boneWeight6.y) * u_bones[int(a_boneWeight6.x)]; 229 #endif //boneWeight6Flag 230 #ifdef boneWeight7Flag 231 skinning += (a_boneWeight7.y) * u_bones[int(a_boneWeight7.x)]; 232 #endif //boneWeight7Flag 233 #endif //skinningFlag 234 235 #ifdef skinningFlag 236 vec4 pos = u_worldTrans * skinning * vec4(a_position, 1.0); 237 #else 238 vec4 pos = u_worldTrans * vec4(a_position, 1.0); 239 #endif 240 241 gl_Position = u_projViewTrans * pos; 242 243 #ifdef shadowMapFlag 244 vec4 spos = u_shadowMapProjViewTrans * pos; 245 v_shadowMapUv.xy = (spos.xy / spos.w) * 0.5 + 0.5; 246 v_shadowMapUv.z = min(spos.z * 0.5 + 0.5, 0.998); 247 #endif //shadowMapFlag 248 249 #if defined(normalFlag) 250 #if defined(skinningFlag) 251 vec3 normal = normalize((u_worldTrans * skinning * vec4(a_normal, 0.0)).xyz); 252 #else 253 vec3 normal = normalize(u_normalMatrix * a_normal); 254 #endif 255 v_normal = normal; 256 #endif // normalFlag 257 258 #ifdef fogFlag 259 vec3 flen = u_cameraPosition.xyz - pos.xyz; 260 float fog = dot(flen, flen) * u_cameraPosition.w; 261 v_fog = min(fog, 1.0); 262 #endif 263 264 #ifdef lightingFlag 265 #if defined(ambientLightFlag) 266 vec3 ambientLight = u_ambientLight; 267 #elif defined(ambientFlag) 268 vec3 ambientLight = vec3(0.0); 269 #endif 270 271 #ifdef ambientCubemapFlag 272 vec3 squaredNormal = normal * normal; 273 vec3 isPositive = step(0.0, normal); 274 ambientLight += squaredNormal.x * mix(u_ambientCubemap[0], u_ambientCubemap[1], isPositive.x) + 275 squaredNormal.y * mix(u_ambientCubemap[2], u_ambientCubemap[3], isPositive.y) + 276 squaredNormal.z * mix(u_ambientCubemap[4], u_ambientCubemap[5], isPositive.z); 277 #endif // ambientCubemapFlag 278 279 #ifdef sphericalHarmonicsFlag 280 ambientLight += u_sphericalHarmonics[0]; 281 ambientLight += u_sphericalHarmonics[1] * normal.x; 282 ambientLight += u_sphericalHarmonics[2] * normal.y; 283 ambientLight += u_sphericalHarmonics[3] * normal.z; 284 ambientLight += u_sphericalHarmonics[4] * (normal.x * normal.z); 285 ambientLight += u_sphericalHarmonics[5] * (normal.z * normal.y); 286 ambientLight += u_sphericalHarmonics[6] * (normal.y * normal.x); 287 ambientLight += u_sphericalHarmonics[7] * (3.0 * normal.z * normal.z - 1.0); 288 ambientLight += u_sphericalHarmonics[8] * (normal.x * normal.x - normal.y * normal.y); 289 #endif // sphericalHarmonicsFlag 290 291 #ifdef ambientFlag 292 #ifdef separateAmbientFlag 293 v_ambientLight = ambientLight; 294 v_lightDiffuse = vec3(0.0); 295 #else 296 v_lightDiffuse = ambientLight; 297 #endif //separateAmbientFlag 298 #else 299 v_lightDiffuse = vec3(0.0); 300 #endif //ambientFlag 301 302 303 #ifdef specularFlag 304 v_lightSpecular = vec3(0.0); 305 vec3 viewVec = normalize(u_cameraPosition.xyz - pos.xyz); 306 #endif // specularFlag 307 308 #if (numDirectionalLights > 0) && defined(normalFlag) 309 for (int i = 0; i < numDirectionalLights; i++) { 310 vec3 lightDir = -u_dirLights[i].direction; 311 float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0); 312 vec3 value = u_dirLights[i].color * NdotL; 313 v_lightDiffuse += value; 314 #ifdef specularFlag 315 float halfDotView = max(0.0, dot(normal, normalize(lightDir + viewVec))); 316 v_lightSpecular += value * pow(halfDotView, u_shininess); 317 #endif // specularFlag 318 } 319 #endif // numDirectionalLights 320 321 #if (numPointLights > 0) && defined(normalFlag) 322 for (int i = 0; i < numPointLights; i++) { 323 vec3 lightDir = u_pointLights[i].position - pos.xyz; 324 float dist2 = dot(lightDir, lightDir); 325 lightDir *= inversesqrt(dist2); 326 float NdotL = clamp(dot(normal, lightDir), 0.0, 1.0); 327 vec3 value = u_pointLights[i].color * (NdotL / (1.0 + dist2)); 328 v_lightDiffuse += value; 329 #ifdef specularFlag 330 float halfDotView = max(0.0, dot(normal, normalize(lightDir + viewVec))); 331 v_lightSpecular += value * pow(halfDotView, u_shininess); 332 #endif // specularFlag 333 } 334 #endif // numPointLights 335 #endif // lightingFlag 336} 337