Răsfoiți Sursa

Merge pull request #17323 from WestLangley/dev_precision_safe

Shaders: Added precisionSafeLength()
Mr.doob 6 ani în urmă
părinte
comite
b1ed69efcf

+ 10 - 0
src/renderers/shaders/ShaderChunk/common.glsl.js

@@ -22,6 +22,16 @@ highp float rand( const in vec2 uv ) {
 	return fract(sin(sn) * c);
 }
 
+#ifdef HIGH_PRECISION
+	float precisionSafeLength( vec3 v ) { return length( v ); }
+#else
+	float max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }
+	float precisionSafeLength( vec3 v ) {
+		float maxComponent = max3( abs( v ) );
+		return length( v / maxComponent ) * maxComponent;
+	}
+#endif
+
 struct IncidentLight {
 	vec3 color;
 	vec3 direction;

+ 4 - 0
src/renderers/webgl/WebGLProgram.js

@@ -370,6 +370,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 			'precision ' + parameters.precision + ' float;',
 			'precision ' + parameters.precision + ' int;',
 
+			( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+
 			'#define SHADER_NAME ' + shader.name,
 
 			customDefines,
@@ -488,6 +490,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 			'precision ' + parameters.precision + ' float;',
 			'precision ' + parameters.precision + ' int;',
 
+			( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+
 			'#define SHADER_NAME ' + shader.name,
 
 			customDefines,