瀏覽代碼

Fixing #10341 by directly using the camera space coordinate for
distance from camera, rather than using the approximation gl_FragCoord.z / gl_FragCoord.w

Kevin Schmidt 8 年之前
父節點
當前提交
ddd8c2b1eb

+ 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
 

+ 2 - 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
 
@@ -12,4 +13,4 @@
 		uniform float fogFar;
 	#endif
 
-#endif
+#endif

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

@@ -0,0 +1,3 @@
+#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 };