Просмотр исходного кода

Merge pull request #10497 from kevineschmidt/bugfix-10341-fix-fog-calculation

Fixing #10341 by directly using the camera space coordinate for
Mr.doob 8 лет назад
Родитель
Сommit
e7dc951e82

+ 7 - 1
examples/js/ShaderSkin.js

@@ -266,6 +266,7 @@ THREE.ShaderSkin = {
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "lights_pars" ],
 			THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
+			THREE.ShaderChunk[ "fog_pars_vertex" ],
 
 			"void main() {",
 
@@ -281,6 +282,7 @@ THREE.ShaderSkin = {
 				"gl_Position = projectionMatrix * mvPosition;",
 
 				THREE.ShaderChunk[ "shadowmap_vertex" ],
+				THREE.ShaderChunk[ "fog_vertex" ],
 
 			"}"
 
@@ -569,6 +571,7 @@ THREE.ShaderSkin = {
 			"varying vec3 vViewPosition;",
 
 			THREE.ShaderChunk[ "common" ],
+			THREE.ShaderChunk[ "fog_pars_vertex" ],
 
 			"void main() {",
 
@@ -597,7 +600,10 @@ THREE.ShaderSkin = {
 
 				"#endif",
 
-			"}"
+				THREE.ShaderChunk[ "fog_vertex" ],
+
+			"}",
+
 
 		].join( "\n" ),
 

+ 2 - 0
examples/js/ShaderTerrain.js

@@ -268,6 +268,7 @@ THREE.ShaderTerrain = {
 			"varying vec3 vViewPosition;",
 
 			THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
+			THREE.ShaderChunk[ "fog_pars_vertex" ],
 
 			"void main() {",
 
@@ -312,6 +313,7 @@ THREE.ShaderTerrain = {
 				"vNormal = normalMatrix * normalTex;",
 
 				THREE.ShaderChunk[ "shadowmap_vertex" ],
+				THREE.ShaderChunk[ "fog_vertex" ],
 
 			"}"
 

+ 5 - 0
examples/js/WaterShader.js

@@ -32,12 +32,17 @@ THREE.ShaderLib[ 'water' ] = {
 		'varying vec4 mirrorCoord;',
 		'varying vec3 worldPosition;',
 
+		THREE.ShaderChunk[ "fog_pars_vertex"],
+
 		'void main()',
 		'{',
 		'	mirrorCoord = modelMatrix * vec4( position, 1.0 );',
 		'	worldPosition = mirrorCoord.xyz;',
 		'	mirrorCoord = textureMatrix * mirrorCoord;',
 		'	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
+
+		THREE.ShaderChunk[ "fog_vertex"],
+
 		'}'
 	].join( '\n' ),
 

+ 5 - 1
examples/js/effects/OutlineEffect.js

@@ -75,6 +75,8 @@ THREE.OutlineEffect = function ( renderer, parameters ) {
 
 	var vertexShaderChunk = [
 
+		"#include <fog_pars_vertex>",
+
 		"uniform float outlineThickness;",
 
 		"vec4 calculateOutline( vec4 pos, vec3 objectNormal, vec4 skinned ) {",
@@ -113,7 +115,9 @@ THREE.OutlineEffect = function ( renderer, parameters ) {
 		"	gl_Position = calculateOutline( gl_Position, objectNormal, skinned );",
 		"#else",
 		"	gl_Position = calculateOutline( gl_Position, objectNormal, vec4( transformed, 1.0 ) );",
-		"#endif"
+		"#endif",
+
+		"#include <fog_vertex>"
 
 	].join( "\n" );
 

+ 3 - 1
examples/js/nodes/materials/PhongNode.js

@@ -46,6 +46,7 @@ THREE.PhongNode.prototype.build = function( builder ) {
 			"#endif",
 
 			THREE.ShaderChunk[ "common" ],
+			THREE.ShaderChunk[ "fog_parse_vertex" ],
 			THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
 			THREE.ShaderChunk[ "skinning_pars_vertex" ],
 			THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
@@ -66,7 +67,8 @@ THREE.PhongNode.prototype.build = function( builder ) {
 
 			"#endif",
 
-				THREE.ShaderChunk[ "begin_vertex" ]
+				THREE.ShaderChunk[ "begin_vertex" ],
+				THREE.ShaderChunk[ "fog_vertex" ]
 		];
 
 		if ( transform ) {

+ 3 - 1
examples/js/nodes/materials/StandardNode.js

@@ -51,6 +51,7 @@ THREE.StandardNode.prototype.build = function( builder ) {
 			"#endif",
 
 			THREE.ShaderChunk[ "common" ],
+			THREE.ShaderChunk[ "fog_pars_vertex" ],
 			THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
 			THREE.ShaderChunk[ "skinning_pars_vertex" ],
 			THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
@@ -71,7 +72,8 @@ THREE.StandardNode.prototype.build = function( builder ) {
 
 			"#endif",
 
-			THREE.ShaderChunk[ "begin_vertex" ]
+			THREE.ShaderChunk[ "begin_vertex" ],
+			THREE.ShaderChunk[ "fog_vertex" ]        
 		];
 
 		if ( transform ) {

+ 4 - 0
src/renderers/shaders/ShaderChunk.js

@@ -28,6 +28,8 @@ import envmap_fragment from './ShaderChunk/envmap_fragment.glsl';
 import envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl';
 import envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl';
 import envmap_vertex from './ShaderChunk/envmap_vertex.glsl';
+import fog_vertex from './ShaderChunk/fog_vertex.glsl';
+import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl';
 import fog_fragment from './ShaderChunk/fog_fragment.glsl';
 import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl';
 import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl';
@@ -137,6 +139,8 @@ export var ShaderChunk = {
 	envmap_pars_fragment: envmap_pars_fragment,
 	envmap_pars_vertex: envmap_pars_vertex,
 	envmap_vertex: envmap_vertex,
+	fog_vertex: fog_vertex,
+	fog_pars_vertex: fog_pars_vertex,
 	fog_fragment: fog_fragment,
 	fog_pars_fragment: fog_pars_fragment,
 	gradientmap_pars_fragment: gradientmap_pars_fragment,

+ 2 - 12
src/renderers/shaders/ShaderChunk/fog_fragment.glsl

@@ -1,22 +1,12 @@
 #ifdef USE_FOG
 
-	#ifdef USE_LOGDEPTHBUF_EXT
-
-		float depth = gl_FragDepthEXT / gl_FragCoord.w;
-
-	#else
-
-		float depth = gl_FragCoord.z / gl_FragCoord.w;
-
-	#endif
-
 	#ifdef FOG_EXP2
 
-		float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );
+		float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );
 
 	#else
 
-		float fogFactor = smoothstep( fogNear, fogFar, depth );
+		float fogFactor = smoothstep( fogNear, fogFar, fogDepth );
 
 	#endif
 

+ 3 - 1
src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl

@@ -1,6 +1,7 @@
 #ifdef USE_FOG
 
 	uniform vec3 fogColor;
+	varying float fogDepth;
 
 	#ifdef FOG_EXP2
 
@@ -10,6 +11,7 @@
 
 		uniform float fogNear;
 		uniform float fogFar;
+
 	#endif
 
-#endif
+#endif

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

@@ -0,0 +1,5 @@
+#ifdef USE_FOG
+
+  varying float fogDepth;
+
+#endif

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

@@ -0,0 +1,4 @@
+
+#ifdef USE_FOG
+fogDepth = -mvPosition.z;
+#endif

+ 2 - 0
src/renderers/shaders/ShaderLib/linedashed_vert.glsl

@@ -5,6 +5,7 @@ varying float vLineDistance;
 
 #include <common>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <logdepthbuf_pars_vertex>
 #include <clipping_planes_pars_vertex>
 
@@ -19,5 +20,6 @@ void main() {
 
 	#include <logdepthbuf_vertex>
 	#include <clipping_planes_vertex>
+	#include <fog_vertex>
 
 }

+ 2 - 0
src/renderers/shaders/ShaderLib/meshbasic_vert.glsl

@@ -3,6 +3,7 @@
 #include <uv2_pars_vertex>
 #include <envmap_pars_vertex>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <morphtarget_pars_vertex>
 #include <skinning_pars_vertex>
 #include <logdepthbuf_pars_vertex>
@@ -33,5 +34,6 @@ void main() {
 	#include <worldpos_vertex>
 	#include <clipping_planes_vertex>
 	#include <envmap_vertex>
+	#include <fog_vertex>
 
 }

+ 2 - 0
src/renderers/shaders/ShaderLib/meshlambert_vert.glsl

@@ -15,6 +15,7 @@ varying vec3 vLightFront;
 #include <bsdfs>
 #include <lights_pars>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <morphtarget_pars_vertex>
 #include <skinning_pars_vertex>
 #include <shadowmap_pars_vertex>
@@ -44,5 +45,6 @@ void main() {
 	#include <envmap_vertex>
 	#include <lights_lambert_vertex>
 	#include <shadowmap_vertex>
+	#include <fog_vertex>
 
 }

+ 2 - 0
src/renderers/shaders/ShaderLib/meshphong_vert.glsl

@@ -14,6 +14,7 @@ varying vec3 vViewPosition;
 #include <displacementmap_pars_vertex>
 #include <envmap_pars_vertex>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <morphtarget_pars_vertex>
 #include <skinning_pars_vertex>
 #include <shadowmap_pars_vertex>
@@ -51,5 +52,6 @@ void main() {
 	#include <worldpos_vertex>
 	#include <envmap_vertex>
 	#include <shadowmap_vertex>
+	#include <fog_vertex>
 
 }

+ 2 - 0
src/renderers/shaders/ShaderLib/meshphysical_vert.glsl

@@ -13,6 +13,7 @@ varying vec3 vViewPosition;
 #include <uv2_pars_vertex>
 #include <displacementmap_pars_vertex>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <morphtarget_pars_vertex>
 #include <skinning_pars_vertex>
 #include <shadowmap_pars_vertex>
@@ -50,5 +51,6 @@ void main() {
 
 	#include <worldpos_vertex>
 	#include <shadowmap_vertex>
+	#include <fog_vertex>
 
 }

+ 2 - 0
src/renderers/shaders/ShaderLib/points_vert.glsl

@@ -3,6 +3,7 @@ uniform float scale;
 
 #include <common>
 #include <color_pars_vertex>
+#include <fog_pars_vertex>
 #include <shadowmap_pars_vertex>
 #include <logdepthbuf_pars_vertex>
 #include <clipping_planes_pars_vertex>
@@ -23,5 +24,6 @@ void main() {
 	#include <clipping_planes_vertex>
 	#include <worldpos_vertex>
 	#include <shadowmap_vertex>
+	#include <fog_vertex>
 
 }

+ 5 - 1
src/renderers/webgl/WebGLProgram.js

@@ -311,6 +311,7 @@ function WebGLProgram( renderer, code, material, parameters ) {
 
 		prefixVertex = [
 
+        
 			'precision ' + parameters.precision + ' float;',
 			'precision ' + parameters.precision + ' int;',
 
@@ -323,6 +324,9 @@ function WebGLProgram( renderer, code, material, parameters ) {
 			'#define GAMMA_FACTOR ' + gammaFactorDefine,
 
 			'#define MAX_BONES ' + parameters.maxBones,
+			( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
+			( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
+
 
 			parameters.map ? '#define USE_MAP' : '',
 			parameters.envMap ? '#define USE_ENVMAP' : '',
@@ -667,4 +671,4 @@ function WebGLProgram( renderer, code, material, parameters ) {
 
 }
 
-export { WebGLProgram };
+export { WebGLProgram };