浏览代码

WebGLProgram: Introduce loop unrolling pragma

Mugen87 7 年之前
父节点
当前提交
e4daafa3e2

+ 4 - 0
src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl

@@ -22,6 +22,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_POINT_LIGHTS > 0
 #if NUM_POINT_LIGHTS > 0
 
 
+	#pragma three unroll
 	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 );
@@ -43,6 +44,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_SPOT_LIGHTS > 0
 #if NUM_SPOT_LIGHTS > 0
 
 
+	#pragma three unroll
 	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 );
@@ -75,6 +77,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_DIR_LIGHTS > 0
 #if NUM_DIR_LIGHTS > 0
 
 
+	#pragma three unroll
 	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 );
@@ -96,6 +99,7 @@ vec3 directLightColor_Diffuse;
 
 
 #if NUM_HEMI_LIGHTS > 0
 #if NUM_HEMI_LIGHTS > 0
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 
 
 		vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
 		vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );

+ 5 - 0
src/renderers/shaders/ShaderChunk/lights_template.glsl

@@ -25,6 +25,7 @@ IncidentLight directLight;
 
 
 	PointLight pointLight;
 	PointLight pointLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 
 
 		pointLight = pointLights[ i ];
 		pointLight = pointLights[ i ];
@@ -45,6 +46,7 @@ IncidentLight directLight;
 
 
 	SpotLight spotLight;
 	SpotLight spotLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 
 
 		spotLight = spotLights[ i ];
 		spotLight = spotLights[ i ];
@@ -65,6 +67,7 @@ IncidentLight directLight;
 
 
 	DirectionalLight directionalLight;
 	DirectionalLight directionalLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
@@ -85,6 +88,7 @@ IncidentLight directLight;
 
 
 	RectAreaLight rectAreaLight;
 	RectAreaLight rectAreaLight;
 
 
+	#pragma three unroll
 	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 ];
@@ -114,6 +118,7 @@ IncidentLight directLight;
 
 
 	#if ( NUM_HEMI_LIGHTS > 0 )
 	#if ( NUM_HEMI_LIGHTS > 0 )
 
 
+		#pragma three unroll
 		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 );

+ 3 - 0
src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl

@@ -2,6 +2,7 @@
 
 
 	#if NUM_DIR_LIGHTS > 0
 	#if NUM_DIR_LIGHTS > 0
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;
 		vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;
@@ -12,6 +13,7 @@
 
 
 	#if NUM_SPOT_LIGHTS > 0
 	#if NUM_SPOT_LIGHTS > 0
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 
 
 		vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;
 		vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;
@@ -22,6 +24,7 @@
 
 
 	#if NUM_POINT_LIGHTS > 0
 	#if NUM_POINT_LIGHTS > 0
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 
 
 		vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;
 		vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;

+ 3 - 0
src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl

@@ -8,6 +8,7 @@ float getShadowMask() {
 
 
 	DirectionalLight directionalLight;
 	DirectionalLight directionalLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
@@ -21,6 +22,7 @@ float getShadowMask() {
 
 
 	SpotLight spotLight;
 	SpotLight spotLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
 
 
 		spotLight = spotLights[ i ];
 		spotLight = spotLights[ i ];
@@ -34,6 +36,7 @@ float getShadowMask() {
 
 
 	PointLight pointLight;
 	PointLight pointLight;
 
 
+	#pragma three unroll
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
 
 
 		pointLight = pointLights[ i ];
 		pointLight = pointLights[ i ];

+ 3 - 7
src/renderers/webgl/WebGLProgram.js

@@ -174,7 +174,7 @@ function parseIncludes( string ) {
 
 
 function unrollLoops( string ) {
 function unrollLoops( string ) {
 
 
-	var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
+	var pattern = /#pragma three unroll[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
 
 
 	function replace( match, start, end, snippet ) {
 	function replace( match, start, end, snippet ) {
 
 
@@ -506,12 +506,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters
 	fragmentShader = parseIncludes( fragmentShader );
 	fragmentShader = parseIncludes( fragmentShader );
 	fragmentShader = replaceLightNums( fragmentShader, parameters );
 	fragmentShader = replaceLightNums( fragmentShader, parameters );
 
 
-	if ( ! material.isShaderMaterial ) {
-
-		vertexShader = unrollLoops( vertexShader );
-		fragmentShader = unrollLoops( fragmentShader );
-
-	}
+	vertexShader = unrollLoops( vertexShader );
+	fragmentShader = unrollLoops( fragmentShader );
 
 
 	var vertexGlsl = prefixVertex + vertexShader;
 	var vertexGlsl = prefixVertex + vertexShader;
 	var fragmentGlsl = prefixFragment + fragmentShader;
 	var fragmentGlsl = prefixFragment + fragmentShader;