136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef _LIGHT_MOBILE_GLSL_
							 | 
						||
| 
								 | 
							
								#define _LIGHT_MOBILE_GLSL_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "compiled.inc"
							 | 
						||
| 
								 | 
							
								#include "std/brdf.glsl"
							 | 
						||
| 
								 | 
							
								#ifdef _ShadowMap
							 | 
						||
| 
								 | 
							
								#include "std/shadows.glsl"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#ifdef _Spot
							 | 
						||
| 
								 | 
							
								#include "std/light_common.glsl"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _ShadowMap
							 | 
						||
| 
								 | 
							
									#ifdef _SinglePoint
							 | 
						||
| 
								 | 
							
										#ifdef _Spot
							 | 
						||
| 
								 | 
							
										uniform sampler2DShadow shadowMapSpot[1];
							 | 
						||
| 
								 | 
							
										uniform mat4 LWVPSpot[1];
							 | 
						||
| 
								 | 
							
										#else
							 | 
						||
| 
								 | 
							
										uniform samplerCubeShadow shadowMapPoint[1];
							 | 
						||
| 
								 | 
							
										uniform vec2 lightProj;
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									#ifdef _Clusters
							 | 
						||
| 
								 | 
							
										#ifdef _SingleAtlas
							 | 
						||
| 
								 | 
							
										//!uniform sampler2DShadow shadowMapAtlas;
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
										uniform vec2 lightProj;
							 | 
						||
| 
								 | 
							
										#ifdef _ShadowMapAtlas
							 | 
						||
| 
								 | 
							
										#ifndef _SingleAtlas
							 | 
						||
| 
								 | 
							
										uniform sampler2DShadow shadowMapAtlasPoint;
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
										#else
							 | 
						||
| 
								 | 
							
										uniform samplerCubeShadow shadowMapPoint[4];
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
										#ifdef _Spot
							 | 
						||
| 
								 | 
							
											#ifdef _ShadowMapAtlas
							 | 
						||
| 
								 | 
							
											#ifndef _SingleAtlas
							 | 
						||
| 
								 | 
							
											uniform sampler2DShadow shadowMapAtlasSpot;
							 | 
						||
| 
								 | 
							
											#endif
							 | 
						||
| 
								 | 
							
											#else
							 | 
						||
| 
								 | 
							
											uniform sampler2DShadow shadowMapSpot[maxLightsCluster];
							 | 
						||
| 
								 | 
							
											#endif
							 | 
						||
| 
								 | 
							
											uniform mat4 LWVPSpotArray[maxLightsCluster];
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol,
							 | 
						||
| 
								 | 
							
									const vec3 albedo, const float rough, const float spec, const vec3 f0
							 | 
						||
| 
								 | 
							
									#ifdef _ShadowMap
							 | 
						||
| 
								 | 
							
										, int index, float bias, bool receiveShadow
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									#ifdef _Spot
							 | 
						||
| 
								 | 
							
										, bool isSpot, float spotSize, float spotBlend, vec3 spotDir, vec2 scale, vec3 right
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									) {
							 | 
						||
| 
								 | 
							
									vec3 ld = lp - p;
							 | 
						||
| 
								 | 
							
									vec3 l = normalize(ld);
							 | 
						||
| 
								 | 
							
									vec3 h = normalize(v + l);
							 | 
						||
| 
								 | 
							
									float dotNH = max(0.0, dot(n, h));
							 | 
						||
| 
								 | 
							
									float dotVH = max(0.0, dot(v, h));
							 | 
						||
| 
								 | 
							
									float dotNL = max(0.0, dot(n, l));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									vec3 direct = lambertDiffuseBRDF(albedo, dotNL) +
							 | 
						||
| 
								 | 
							
												  specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									direct *= lightCol;
							 | 
						||
| 
								 | 
							
									direct *= attenuate(distance(p, lp));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef _Spot
							 | 
						||
| 
								 | 
							
									if (isSpot) {
							 | 
						||
| 
								 | 
							
										direct *= spotlightMask(l, spotDir, right, scale, spotSize, spotBlend);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										#ifdef _ShadowMap
							 | 
						||
| 
								 | 
							
											if (receiveShadow) {
							 | 
						||
| 
								 | 
							
												#ifdef _SinglePoint
							 | 
						||
| 
								 | 
							
												vec4 lPos = LWVPSpot[0] * vec4(p + n * bias * 10, 1.0);
							 | 
						||
| 
								 | 
							
												direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias);
							 | 
						||
| 
								 | 
							
												#endif
							 | 
						||
| 
								 | 
							
												#ifdef _Clusters
							 | 
						||
| 
								 | 
							
													vec4 lPos = LWVPSpotArray[index] * vec4(p + n * bias * 10, 1.0);
							 | 
						||
| 
								 | 
							
													#ifdef _ShadowMapAtlas
							 | 
						||
| 
								 | 
							
														direct *= shadowTest(
							 | 
						||
| 
								 | 
							
															#ifndef _SingleAtlas
							 | 
						||
| 
								 | 
							
															shadowMapAtlasSpot
							 | 
						||
| 
								 | 
							
															#else
							 | 
						||
| 
								 | 
							
															shadowMapAtlas
							 | 
						||
| 
								 | 
							
															#endif
							 | 
						||
| 
								 | 
							
															, lPos.xyz / lPos.w, bias
							 | 
						||
| 
								 | 
							
														);
							 | 
						||
| 
								 | 
							
													#else
							 | 
						||
| 
								 | 
							
															 if (index == 0) direct *= shadowTest(shadowMapSpot[0], lPos.xyz / lPos.w, bias);
							 | 
						||
| 
								 | 
							
														else if (index == 1) direct *= shadowTest(shadowMapSpot[1], lPos.xyz / lPos.w, bias);
							 | 
						||
| 
								 | 
							
														else if (index == 2) direct *= shadowTest(shadowMapSpot[2], lPos.xyz / lPos.w, bias);
							 | 
						||
| 
								 | 
							
														else if (index == 3) direct *= shadowTest(shadowMapSpot[3], lPos.xyz / lPos.w, bias);
							 | 
						||
| 
								 | 
							
													#endif
							 | 
						||
| 
								 | 
							
												#endif
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
										return direct;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef _ShadowMap
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (receiveShadow) {
							 | 
						||
| 
								 | 
							
											#ifdef _SinglePoint
							 | 
						||
| 
								 | 
							
											#ifndef _Spot
							 | 
						||
| 
								 | 
							
											direct *= PCFCube(shadowMapPoint[0], ld, -l, bias, lightProj, n);
							 | 
						||
| 
								 | 
							
											#endif
							 | 
						||
| 
								 | 
							
											#endif
							 | 
						||
| 
								 | 
							
											#ifdef _Clusters
							 | 
						||
| 
								 | 
							
												#ifdef _ShadowMapAtlas
							 | 
						||
| 
								 | 
							
												direct *= PCFFakeCube(
							 | 
						||
| 
								 | 
							
													#ifndef _SingleAtlas
							 | 
						||
| 
								 | 
							
													shadowMapAtlasPoint
							 | 
						||
| 
								 | 
							
													#else
							 | 
						||
| 
								 | 
							
													shadowMapAtlas
							 | 
						||
| 
								 | 
							
													#endif
							 | 
						||
| 
								 | 
							
													, ld, -l, bias, lightProj, n, index
							 | 
						||
| 
								 | 
							
												);
							 | 
						||
| 
								 | 
							
												#else
							 | 
						||
| 
								 | 
							
													 if (index == 0) direct *= PCFCube(shadowMapPoint[0], ld, -l, bias, lightProj, n);
							 | 
						||
| 
								 | 
							
												else if (index == 1) direct *= PCFCube(shadowMapPoint[1], ld, -l, bias, lightProj, n);
							 | 
						||
| 
								 | 
							
												else if (index == 2) direct *= PCFCube(shadowMapPoint[2], ld, -l, bias, lightProj, n);
							 | 
						||
| 
								 | 
							
												else if (index == 3) direct *= PCFCube(shadowMapPoint[3], ld, -l, bias, lightProj, n);
							 | 
						||
| 
								 | 
							
												#endif
							 | 
						||
| 
								 | 
							
											#endif
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return direct;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |