Browse Source

Merge pull request #18833 from gkjohnson/unroll-loop-conversion

Unroll loop conversion
Mr.doob 5 years ago
parent
commit
6e4bc19a05

+ 3 - 2
docs/api/en/materials/ShaderMaterial.html

@@ -45,7 +45,7 @@
 				[page:RawShaderMaterial] instead of this class.
 				[page:RawShaderMaterial] instead of this class.
 			</li>
 			</li>
 			<li>
 			<li>
-				You can use the directive #pragma unroll_loop in order to unroll a *for* loop in GLSL by the shader preprocessor.
+				You can use the directive #pragma unroll_loop_start and #pragma unroll_loop_end in order to unroll a *for* loop in GLSL by the shader preprocessor.
 				The directive has to be placed right above the loop. The loop formatting has to correspond to a defined standard.
 				The directive has to be placed right above the loop. The loop formatting has to correspond to a defined standard.
 				<ul>
 				<ul>
 					<li>
 					<li>
@@ -59,12 +59,13 @@
 					</li>
 					</li>
 				</ul>
 				</ul>
 				<code>
 				<code>
-		#pragma unroll_loop
+		#pragma unroll_loop_start
 		for ( int i = 0; i < 10; i ++ ) {
 		for ( int i = 0; i < 10; i ++ ) {
 
 
 			// ...
 			// ...
 
 
 		}
 		}
+		#pragma unroll_loop_end
 				</code>
 				</code>
 			</li>
 			</li>
 		</ul>
 		</ul>

+ 3 - 2
docs/api/zh/materials/ShaderMaterial.html

@@ -35,7 +35,7 @@
 			<li> 内置attributes和uniforms与代码一起传递到shaders。
 			<li> 内置attributes和uniforms与代码一起传递到shaders。
 				如果您不希望[page:WebGLProgram]向shader代码添加任何内容,则可以使用[page:RawShaderMaterial]而不是此类。
 				如果您不希望[page:WebGLProgram]向shader代码添加任何内容,则可以使用[page:RawShaderMaterial]而不是此类。
 			</li>
 			</li>
-			<li> 您可以使用指令#pragma unroll_loop,以便通过shader预处理器在GLSL中展开for循环。
+			<li> 您可以使用指令#pragma unroll_loop_start#pragma unroll_loop_end 以便通过shader预处理器在GLSL中展开for循环。
 				该指令必须放在循环的正上方。循环格式必须与定义的标准相对应。
 				该指令必须放在循环的正上方。循环格式必须与定义的标准相对应。
 				<ul>
 				<ul>
 					<li> 循环必须标准化[link:https://en.wikipedia.org/wiki/Normalized_loop normalized]。
 					<li> 循环必须标准化[link:https://en.wikipedia.org/wiki/Normalized_loop normalized]。
@@ -48,12 +48,13 @@
 					</li>
 					</li>
 				</ul>
 				</ul>
 				<code>
 				<code>
-		#pragma unroll_loop
+		#pragma unroll_loop_start
 		for ( int i = 0; i < 10; i ++ ) {
 		for ( int i = 0; i < 10; i ++ ) {
 
 
 			// ...
 			// ...
 
 
 		}
 		}
+		#pragma unroll_loop_end
 				</code>
 				</code>
 			</li>
 			</li>
 		</ul>
 		</ul>

+ 6 - 3
examples/js/shaders/TranslucentShader.js

@@ -127,7 +127,7 @@ THREE.TranslucentShader = {
 
 
 		"		PointLight pointLight;",
 		"		PointLight pointLight;",
 
 
-		"		#pragma unroll_loop",
+		"		#pragma unroll_loop_start",
 		"		for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {",
 		"		for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {",
 		"		 	pointLight = pointLights[ i ];",
 		"		 	pointLight = pointLights[ i ];",
 		"		 	getPointDirectLightIrradiance( pointLight, geometry, directLight );",
 		"		 	getPointDirectLightIrradiance( pointLight, geometry, directLight );",
@@ -142,6 +142,7 @@ THREE.TranslucentShader = {
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"			#endif",
 		"		}",
 		"		}",
+		"		#pragma unroll_loop_end",
 
 
 		"		#endif",
 		"		#endif",
 
 
@@ -149,7 +150,7 @@ THREE.TranslucentShader = {
 
 
 		"		DirectionalLight directionalLight;",
 		"		DirectionalLight directionalLight;",
 
 
-		"		#pragma unroll_loop",
+		"		#pragma unroll_loop_start",
 		"		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {",
 		"		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {",
 		"			directionalLight = directionalLights[ i ];",
 		"			directionalLight = directionalLights[ i ];",
 		"			getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );",
 		"			getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );",
@@ -164,6 +165,7 @@ THREE.TranslucentShader = {
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"			#endif",
 		"		}",
 		"		}",
+		"		#pragma unroll_loop_end",
 
 
 		"	#endif",
 		"	#endif",
 
 
@@ -173,12 +175,13 @@ THREE.TranslucentShader = {
 
 
 		"		#if ( NUM_HEMI_LIGHTS > 0 )",
 		"		#if ( NUM_HEMI_LIGHTS > 0 )",
 
 
-		"			#pragma unroll_loop",
+		"			#pragma unroll_loop_start",
 		"			for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {",
 		"			for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {",
 
 
 		"				irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );",
 		"				irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );",
 
 
 		"			}",
 		"			}",
+		"			#pragma unroll_loop_end",
 
 
 		"		#endif",
 		"		#endif",
 
 

+ 12 - 6
examples/jsm/csm/Shader.js

@@ -27,7 +27,7 @@ IncidentLight directLight;
 	PointLightShadow pointLightShadow;
 	PointLightShadow pointLightShadow;
 	#endif
 	#endif
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 
 
 		pointLight = pointLights[ i ];
 		pointLight = pointLights[ i ];
@@ -42,6 +42,7 @@ IncidentLight directLight;
 		RE_Direct( directLight, geometry, material, reflectedLight );
 		RE_Direct( directLight, geometry, material, reflectedLight );
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
@@ -52,7 +53,7 @@ IncidentLight directLight;
 	SpotLightShadow spotLightShadow;
 	SpotLightShadow spotLightShadow;
 	#endif
 	#endif
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 
 
 		spotLight = spotLights[ i ];
 		spotLight = spotLights[ i ];
@@ -67,6 +68,7 @@ IncidentLight directLight;
 		RE_Direct( directLight, geometry, material, reflectedLight );
 		RE_Direct( directLight, geometry, material, reflectedLight );
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
@@ -132,7 +134,7 @@ IncidentLight directLight;
 	#pragma unroll_loop_end
 	#pragma unroll_loop_end
 	#else
 	#else
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
@@ -148,6 +150,7 @@ IncidentLight directLight;
 		if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );
 		if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 
@@ -161,7 +164,7 @@ IncidentLight directLight;
 	DirectionalLightShadow directionalLightShadow;
 	DirectionalLightShadow directionalLightShadow;
 	#endif
 	#endif
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
@@ -176,6 +179,7 @@ IncidentLight directLight;
 		RE_Direct( directLight, geometry, material, reflectedLight );
 		RE_Direct( directLight, geometry, material, reflectedLight );
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
@@ -183,13 +187,14 @@ IncidentLight directLight;
 
 
 	RectAreaLight rectAreaLight;
 	RectAreaLight rectAreaLight;
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {
 
 
 		rectAreaLight = rectAreaLights[ i ];
 		rectAreaLight = rectAreaLights[ i ];
 		RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );
 		RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
@@ -203,12 +208,13 @@ IncidentLight directLight;
 
 
 	#if ( NUM_HEMI_LIGHTS > 0 )
 	#if ( NUM_HEMI_LIGHTS > 0 )
 
 
-		#pragma unroll_loop
+		#pragma unroll_loop_start
 		for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 		for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 
 
 			irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
 			irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
 
 
 		}
 		}
+		#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 

+ 6 - 3
examples/jsm/shaders/TranslucentShader.js

@@ -134,7 +134,7 @@ var TranslucentShader = {
 
 
 		"		PointLight pointLight;",
 		"		PointLight pointLight;",
 
 
-		"		#pragma unroll_loop",
+		"		#pragma unroll_loop_start",
 		"		for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {",
 		"		for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {",
 		"		 	pointLight = pointLights[ i ];",
 		"		 	pointLight = pointLights[ i ];",
 		"		 	getPointDirectLightIrradiance( pointLight, geometry, directLight );",
 		"		 	getPointDirectLightIrradiance( pointLight, geometry, directLight );",
@@ -149,6 +149,7 @@ var TranslucentShader = {
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"			#endif",
 		"		}",
 		"		}",
+		"		#pragma unroll_loop_end",
 
 
 		"		#endif",
 		"		#endif",
 
 
@@ -156,7 +157,7 @@ var TranslucentShader = {
 
 
 		"		DirectionalLight directionalLight;",
 		"		DirectionalLight directionalLight;",
 
 
-		"		#pragma unroll_loop",
+		"		#pragma unroll_loop_start",
 		"		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {",
 		"		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {",
 		"			directionalLight = directionalLights[ i ];",
 		"			directionalLight = directionalLights[ i ];",
 		"			getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );",
 		"			getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );",
@@ -171,6 +172,7 @@ var TranslucentShader = {
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"			#endif",
 		"		}",
 		"		}",
+		"		#pragma unroll_loop_end",
 
 
 		"	#endif",
 		"	#endif",
 
 
@@ -180,12 +182,13 @@ var TranslucentShader = {
 
 
 		"		#if ( NUM_HEMI_LIGHTS > 0 )",
 		"		#if ( NUM_HEMI_LIGHTS > 0 )",
 
 
-		"			#pragma unroll_loop",
+		"			#pragma unroll_loop_start",
 		"			for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {",
 		"			for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {",
 
 
 		"				irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );",
 		"				irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );",
 
 
 		"			}",
 		"			}",
+		"			#pragma unroll_loop_end",
 
 
 		"		#endif",
 		"		#endif",
 
 

+ 4 - 2
src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js

@@ -3,25 +3,27 @@ export default /* glsl */`
 
 
 	vec4 plane;
 	vec4 plane;
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
 	for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
 
 
 		plane = clippingPlanes[ i ];
 		plane = clippingPlanes[ i ];
 		if ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;
 		if ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
 	#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
 
 
 		bool clipped = true;
 		bool clipped = true;
 
 
-		#pragma unroll_loop
+		#pragma unroll_loop_start
 		for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
 		for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
 
 
 			plane = clippingPlanes[ i ];
 			plane = clippingPlanes[ i ];
 			clipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;
 			clipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;
 
 
 		}
 		}
+		#pragma unroll_loop_end
 
 
 		if ( clipped ) discard;
 		if ( clipped ) discard;
 
 

+ 8 - 4
src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js

@@ -25,7 +25,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_POINT_LIGHTS > 0
 #if NUM_POINT_LIGHTS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 
 
 		getPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );
 		getPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );
@@ -42,12 +42,13 @@ vec3 directLightColor_Diffuse;
 		#endif
 		#endif
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
 #if NUM_SPOT_LIGHTS > 0
 #if NUM_SPOT_LIGHTS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 
 
 		getSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );
 		getSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );
@@ -63,6 +64,7 @@ vec3 directLightColor_Diffuse;
 
 
 		#endif
 		#endif
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
@@ -80,7 +82,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_DIR_LIGHTS > 0
 #if NUM_DIR_LIGHTS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		getDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );
 		getDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );
@@ -97,12 +99,13 @@ vec3 directLightColor_Diffuse;
 		#endif
 		#endif
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 
 
 #if NUM_HEMI_LIGHTS > 0
 #if NUM_HEMI_LIGHTS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 
 
 		vIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
 		vIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
@@ -114,6 +117,7 @@ vec3 directLightColor_Diffuse;
 		#endif
 		#endif
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 #endif
 #endif
 `;
 `;

+ 6 - 3
src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js

@@ -3,34 +3,37 @@ export default /* glsl */`
 
 
 	#if NUM_DIR_LIGHT_SHADOWS > 0
 	#if NUM_DIR_LIGHT_SHADOWS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
 
 
 		vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;
 		vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 
 	#if NUM_SPOT_LIGHT_SHADOWS > 0
 	#if NUM_SPOT_LIGHT_SHADOWS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
 
 
 		vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;
 		vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 
 	#if NUM_POINT_LIGHT_SHADOWS > 0
 	#if NUM_POINT_LIGHT_SHADOWS > 0
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
 
 
 		vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;
 		vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 

+ 6 - 3
src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js

@@ -9,13 +9,14 @@ float getShadowMask() {
 
 
 	DirectionalLightShadow directionalLight;
 	DirectionalLightShadow directionalLight;
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
 
 
 		directionalLight = directionalLightShadows[ i ];
 		directionalLight = directionalLightShadows[ i ];
 		shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 		shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 
@@ -23,13 +24,14 @@ float getShadowMask() {
 
 
 	SpotLightShadow spotLight;
 	SpotLightShadow spotLight;
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
 
 
 		spotLight = spotLightShadows[ i ];
 		spotLight = spotLightShadows[ i ];
 		shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;
 		shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif
 
 
@@ -37,13 +39,14 @@ float getShadowMask() {
 
 
 	PointLightShadow pointLight;
 	PointLightShadow pointLight;
 
 
-	#pragma unroll_loop
+	#pragma unroll_loop_start
 	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
 
 
 		pointLight = pointLightShadows[ i ];
 		pointLight = pointLightShadows[ i ];
 		shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;
 		shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;
 
 
 	}
 	}
+	#pragma unroll_loop_end
 
 
 	#endif
 	#endif