=0){c.bindBuffer(c.ARRAY_BUFFER,
-u.__webGLNormalBuffer);c.vertexAttribPointer(v.normal,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.normal)}if(v.tangent>=0){c.bindBuffer(c.ARRAY_BUFFER,u.__webGLTangentBuffer);c.vertexAttribPointer(v.tangent,4,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.tangent)}if(v.uv>=0)if(u.__webGLUVBuffer){c.bindBuffer(c.ARRAY_BUFFER,u.__webGLUVBuffer);c.vertexAttribPointer(v.uv,2,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.uv)}else c.disableVertexAttribArray(v.uv);if(z){c.lineWidth(J);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,
-u.__webGLLineBuffer);c.drawElements(c.LINES,u.__webGLLineCount,c.UNSIGNED_SHORT,0)}else{c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,u.__webGLFaceBuffer);c.drawElements(c.TRIANGLES,u.__webGLFaceCount,c.UNSIGNED_SHORT,0)}};this.renderPass=function(i,o,s,p,u,l,v){var z,J,S,Q,H;S=0;for(Q=p.materials.length;S=0;s--){p=i.__webGLObjects[s].object;o==p&&i.__webGLObjects.splice(s,
-1)}};this.setupMatrices=function(i,o){i.autoUpdateMatrix&&i.updateMatrix();t.multiply(o.matrix,i.matrix);I.set(t.flatten());y=THREE.Matrix4.makeInvert3x3(t).transpose();C.set(y.m);n.set(i.matrix.flatten())};this.loadMatrices=function(i){c.uniformMatrix4fv(i.uniforms.viewMatrix,false,A);c.uniformMatrix4fv(i.uniforms.modelViewMatrix,false,I);c.uniformMatrix4fv(i.uniforms.projectionMatrix,false,w);c.uniformMatrix3fv(i.uniforms.normalMatrix,false,C);c.uniformMatrix4fv(i.uniforms.objectMatrix,false,n)};
-this.loadCamera=function(i,o){c.uniform3f(i.uniforms.cameraPosition,o.position.x,o.position.y,o.position.z)};this.setBlending=function(i){switch(i){case THREE.AdditiveBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ONE,c.ONE);break;case THREE.SubtractiveBlending:c.blendFunc(c.DST_COLOR,c.ZERO);break;default:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA)}};this.setFaceCulling=function(i,o){if(i){!o||o=="ccw"?c.frontFace(c.CCW):c.frontFace(c.CW);if(i=="back")c.cullFace(c.BACK);
+V);c.uniform1f(M.uniforms.mRefractionRatio,H);if(s){c.uniform1f(M.uniforms.fogNear,s.near);c.uniform1f(M.uniforms.fogFar,s.far);c.uniform3f(M.uniforms.fogColor,s.color.r,s.color.g,s.color.b)}}if(p instanceof THREE.MeshPhongMaterial){s=p.ambient;l=p.specular;p=p.shininess;c.uniform4f(M.uniforms.mAmbient,s.r,s.g,s.b,v);c.uniform4f(M.uniforms.mSpecular,l.r,l.g,l.b,v);c.uniform1f(M.uniforms.mShininess,p);c.uniform1i(M.uniforms.material,2)}else if(p instanceof THREE.MeshLambertMaterial)c.uniform1i(M.uniforms.material,
+1);else p instanceof THREE.MeshBasicMaterial&&c.uniform1i(M.uniforms.material,0);if(S){g(S,0);c.uniform1i(M.uniforms.tMap,0);c.uniform1i(M.uniforms.enableMap,1)}else c.uniform1i(M.uniforms.enableMap,0);if(Q){d(Q,1);c.uniform1i(M.uniforms.tCube,1);c.uniform1i(M.uniforms.enableCubeMap,1)}else c.uniform1i(M.uniforms.enableCubeMap,0);v=M.attributes;c.bindBuffer(c.ARRAY_BUFFER,u.__webGLVertexBuffer);c.vertexAttribPointer(v.position,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.position);if(v.normal>=
+0){c.bindBuffer(c.ARRAY_BUFFER,u.__webGLNormalBuffer);c.vertexAttribPointer(v.normal,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.normal)}if(v.tangent>=0){c.bindBuffer(c.ARRAY_BUFFER,u.__webGLTangentBuffer);c.vertexAttribPointer(v.tangent,4,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.tangent)}if(v.uv>=0)if(u.__webGLUVBuffer){c.bindBuffer(c.ARRAY_BUFFER,u.__webGLUVBuffer);c.vertexAttribPointer(v.uv,2,c.FLOAT,false,0,0);c.enableVertexAttribArray(v.uv)}else c.disableVertexAttribArray(v.uv);if(z){c.lineWidth(J);
+c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,u.__webGLLineBuffer);c.drawElements(c.LINES,u.__webGLLineCount,c.UNSIGNED_SHORT,0)}else{c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,u.__webGLFaceBuffer);c.drawElements(c.TRIANGLES,u.__webGLFaceCount,c.UNSIGNED_SHORT,0)}};this.renderPass=function(i,o,s,p,u,l,v){var z,J,S,Q,H;S=0;for(Q=p.materials.length;S
=0;s--){p=i.__webGLObjects[s].object;
+o==p&&i.__webGLObjects.splice(s,1)}};this.setupMatrices=function(i,o){i.autoUpdateMatrix&&i.updateMatrix();t.multiply(o.matrix,i.matrix);I.set(t.flatten());y=THREE.Matrix4.makeInvert3x3(t).transpose();C.set(y.m);n.set(i.matrix.flatten())};this.loadMatrices=function(i){c.uniformMatrix4fv(i.uniforms.viewMatrix,false,A);c.uniformMatrix4fv(i.uniforms.modelViewMatrix,false,I);c.uniformMatrix4fv(i.uniforms.projectionMatrix,false,w);c.uniformMatrix3fv(i.uniforms.normalMatrix,false,C);c.uniformMatrix4fv(i.uniforms.objectMatrix,
+false,n)};this.loadCamera=function(i,o){c.uniform3f(i.uniforms.cameraPosition,o.position.x,o.position.y,o.position.z)};this.setBlending=function(i){switch(i){case THREE.AdditiveBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ONE,c.ONE);break;case THREE.SubtractiveBlending:c.blendFunc(c.DST_COLOR,c.ZERO);break;default:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA)}};this.setFaceCulling=function(i,o){if(i){!o||o=="ccw"?c.frontFace(c.CCW):c.frontFace(c.CW);if(i=="back")c.cullFace(c.BACK);
else i=="front"?c.cullFace(c.FRONT):c.cullFace(c.FRONT_AND_BACK);c.enable(c.CULL_FACE)}else c.disable(c.CULL_FACE)};this.supportsVertexTextures=function(){return c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0};var T={depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2E3}},fragment_shader:"uniform float mNear;\nuniform float mFar;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), 1.0 );\n}",
vertex_shader:"void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"},normal:{uniforms:{},fragment_shader:"varying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, 1.0 );\n}",vertex_shader:"varying vec3 vNormal;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvNormal = normalize( normalMatrix * normal );\ngl_Position = projectionMatrix * mvPosition;\n}"}}};
THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableFace3=function(){this.z=null;this.v1=new THREE.Vertex;this.v2=new THREE.Vertex;this.v3=new THREE.Vertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[];this.faceMaterials=this.meshMaterials=null;this.overdraw=false;this.uvs=[null,null,null]};
diff --git a/examples/geometry_minecraft_ao.html b/examples/geometry_minecraft_ao.html
index 60f2f054..837fc045 100644
--- a/examples/geometry_minecraft_ao.html
+++ b/examples/geometry_minecraft_ao.html
@@ -110,15 +110,15 @@
container = document.getElementById( 'container' );
- camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 20000 );
+ camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 7500 );
camera.target.position.z = - 100;
camera.position.y = getY( worldHalfWidth, worldHalfDepth ) * 100 + 100;
camera.target.position.y = camera.position.y;
scene = new THREE.Scene();
- scene.fog = new THREE.Fog( 0xffffff, 0.00025 );
-
+ scene.fog = new THREE.Fog( 0xffffff, 1, 7500 );
+
var debug_texture = false,
debug_numbers = false,
debug_corner_colors = false,
diff --git a/examples/geometry_terrain_fog_gl.html b/examples/geometry_terrain_fog_gl.html
index 50fac96b..7f2bfa8b 100644
--- a/examples/geometry_terrain_fog_gl.html
+++ b/examples/geometry_terrain_fog_gl.html
@@ -69,11 +69,11 @@
container = document.getElementById( 'container' );
- camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 20000 );
+ camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 750 );
camera.target.position.z = - 100;
scene = new THREE.Scene();
- scene.fog = new THREE.Fog( 0xefd1b5, 0.0025 );
+ scene.fog = new THREE.Fog( 0xefd1b5, 1, 750 );
data = generateHeight( worldWidth, worldDepth );
diff --git a/examples/webglrenderer2_sandbox.html b/examples/webglrenderer2_sandbox.html
index aaa2d407..2e0051cf 100644
--- a/examples/webglrenderer2_sandbox.html
+++ b/examples/webglrenderer2_sandbox.html
@@ -127,11 +127,11 @@
container = document.createElement( 'div' );
document.body.appendChild( container );
- camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 100000 );
+ camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.z = 3200;
scene = new THREE.Scene();
- scene.fog = new THREE.Fog( 0xffffff, 0.00025 );
+ scene.fog = new THREE.Fog( 0xffffff, 1, 10000 );
var geometry = new Sphere( 50, 32, 16 );
@@ -151,7 +151,7 @@
new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.SmoothShading } ),
new THREE.MeshNormalMaterial( { shading: THREE.SmoothShading } ),
new THREE.MeshBasicMaterial( { color: 0xffaa00, wireframe: true } ),
- new THREE.MeshDepthMaterial( { near: 1, far: 2000 } ),
+ new THREE.MeshDepthMaterial( { near: 1, far: 10000 } ),
new THREE.MeshBasicMaterial( { map: generatedTexture, fog: false } ),
new THREE.MeshLambertMaterial( { map: generatedTexture } ),
new THREE.MeshShaderMaterial( { uniforms: uniforms, vertex_shader: vertex_shader, fragment_shader: fragment_shader } )
@@ -167,7 +167,6 @@
materials.push( new THREE.MeshFaceMaterial() );
-
for ( var i = 0; i < 5000; i ++ ) {
var mesh = new THREE.Mesh( geometry, materials[ Math.floor( Math.random() * materials.length ) ] );
diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js
index e455552b..1bb1ede8 100644
--- a/src/renderers/WebGLRenderer.js
+++ b/src/renderers/WebGLRenderer.js
@@ -38,9 +38,9 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
maxLightCount = allocateLights( scene, 4 );
fog = scene ? scene.fog : null,
-
+
aa = antialias != undefined ? antialias : true;
-
+
this.domElement = _canvas;
this.autoClear = true;
@@ -363,13 +363,13 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
};
function setMaterialShaders( material, shaders ) {
-
+
material.fragment_shader = shaders.fragment_shader;
material.vertex_shader = shaders.vertex_shader;
material.uniforms = shaders.uniforms;
-
+
};
-
+
this.renderBuffer = function ( camera, lights, fog, material, geometryChunk ) {
var mColor, mOpacity, mReflectivity,
@@ -387,18 +387,18 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
if ( !material.program ) {
if ( material instanceof THREE.MeshDepthMaterial ) {
-
+
setMaterialShaders( material, ShaderLib[ 'depth' ] );
-
+
material.uniforms.mNear.value = material.near;
material.uniforms.mFar.value = material.far;
-
+
} else if ( material instanceof THREE.MeshNormalMaterial ) {
-
+
setMaterialShaders( material, ShaderLib[ 'normal' ] );
-
- }
-
+
+ }
+
material.program = buildProgram( material.fragment_shader, material.vertex_shader, null );
identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
@@ -407,7 +407,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
identifiers.push(u);
}
-
+
cacheUniformLocations( material.program, identifiers );
cacheAttributeLocations( material.program, [ "position", "normal", "uv", "tangent" ] );
@@ -437,7 +437,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
this.loadCamera( program, camera );
this.loadMatrices( program );
- if ( material instanceof THREE.MeshShaderMaterial ||
+ if ( material instanceof THREE.MeshShaderMaterial ||
material instanceof THREE.MeshDepthMaterial ||
material instanceof THREE.MeshNormalMaterial ) {
@@ -478,12 +478,13 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
_gl.uniform1i( program.uniforms.useRefract, useRefract );
_gl.uniform1f( program.uniforms.mRefractionRatio, mRefractionRatio );
-
+
if ( fog ) {
-
- _gl.uniform1f( program.uniforms.fogDensity, fog.density );
+
+ _gl.uniform1f( program.uniforms.fogNear, fog.near );
+ _gl.uniform1f( program.uniforms.fogFar, fog.far );
_gl.uniform3f( program.uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );
-
+
}
}
@@ -535,7 +536,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
_gl.uniform1i( program.uniforms.enableCubeMap, 0 );
}
-
+
attributes = program.attributes;
// vertices
@@ -561,7 +562,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
_gl.enableVertexAttribArray( attributes.tangent );
-
+
}
// uvs
@@ -569,7 +570,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
if ( attributes.uv >= 0 ) {
if ( geometryChunk.__webGLUVBuffer ) {
-
+
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
@@ -957,7 +958,8 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
"#ifdef USE_FOG",
"uniform vec3 fogColor;",
- "uniform float fogDensity;",
+ "uniform float fogNear;",
+ "uniform float fogFar;",
"#endif",
"uniform int pointLightNumber;",
@@ -1113,17 +1115,23 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
"}",
"}",
-
+
"#ifdef USE_FOG",
-
+
+ "float depth = gl_FragCoord.z / gl_FragCoord.w;",
+ "float fogFactor = smoothstep( fogNear, fogFar, depth );",
+ "gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), fogFactor );",
+
+ /*
"const float LOG2 = 1.442695;",
"float z = gl_FragCoord.z / gl_FragCoord.w;",
"float fogFactor = exp2( - fogDensity * fogDensity * z * z * LOG2 );",
"fogFactor = clamp( fogFactor, 0.0, 1.0 );",
"gl_FragColor = mix( vec4( fogColor, 1.0 ), gl_FragColor, fogFactor );",
-
+ */
+
"#endif",
-
+
"}" ];
return chunks.join("\n");
@@ -1237,12 +1245,12 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
"#endif",
fog ? "#define USE_FOG" : "",
-
+
"uniform mat4 viewMatrix;",
"uniform vec3 cameraPosition;",
""
].join("\n"),
-
+
prefix_vertex = [
maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
@@ -1257,7 +1265,7 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
"attribute vec2 uv;",
""
].join("\n");
-
+
_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
@@ -1440,9 +1448,9 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
] );
if ( fog ) {
-
- cacheUniformLocations( program, [ 'fogColor', 'fogDensity' ] );
-
+
+ cacheUniformLocations( program, [ 'fogColor', 'fogNear', 'fogFar' ] );
+
}
if ( maxDirLights ) {
@@ -1642,29 +1650,29 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
return str;
}
*/
-
+
var ShaderLib = {
-
+
'depth': {
- uniforms: { "mNear": { type: "f", value: 1.0 },
+ uniforms: { "mNear": { type: "f", value: 1.0 },
"mFar" : { type: "f", value: 2000.0 } },
fragment_shader: [
-
+
"uniform float mNear;",
"uniform float mFar;",
"void main() {",
-
+
"float depth = gl_FragCoord.z / gl_FragCoord.w;",
"float color = 1.0 - smoothstep( mNear, mFar, depth );",
"gl_FragColor = vec4( vec3( color ), 1.0 );",
-
+
"}"
].join("\n"),
-
+
vertex_shader: [
"void main() {",
@@ -1676,29 +1684,29 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
].join("\n")
},
-
+
'normal': {
-
+
uniforms: { },
-
+
fragment_shader: [
-
+
"varying vec3 vNormal;",
-
+
"void main() {",
-
+
"gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, 1.0 );",
-
+
"}"
].join("\n"),
-
+
vertex_shader: [
-
+
"varying vec3 vNormal;",
"void main() {",
-
+
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
"vNormal = normalize( normalMatrix * normal );",
@@ -1707,9 +1715,9 @@ THREE.WebGLRenderer = function ( scene, antialias ) {
"}"
].join("\n")
-
+
}
-
+
};
};
diff --git a/src/renderers/WebGLRenderer2.js b/src/renderers/WebGLRenderer2.js
index 6282b6b5..24c3b48f 100644
--- a/src/renderers/WebGLRenderer2.js
+++ b/src/renderers/WebGLRenderer2.js
@@ -150,7 +150,8 @@ THREE.WebGLRenderer2 = function ( antialias ) {
if ( scene.fog ) {
_gl.uniform1f( uniforms.fog, 1 );
- _gl.uniform1f( uniforms.fogDensity, scene.fog.density );
+ _gl.uniform1f( uniforms.fogNear, scene.fog.near );
+ _gl.uniform1f( uniforms.fogFar, scene.fog.far );
_gl.uniform3f( uniforms.fogColor, scene.fog.color.r, scene.fog.color.g, scene.fog.color.b );
} else {
@@ -181,9 +182,8 @@ THREE.WebGLRenderer2 = function ( antialias ) {
} else if ( material instanceof THREE.MeshDepthMaterial ) {
- _gl.uniform1f( uniforms.m2Near, material.__2near );
- _gl.uniform1f( uniforms.mFarPlusNear, material.__farPlusNear );
- _gl.uniform1f( uniforms.mFarMinusNear, material.__farMinusNear );
+ _gl.uniform1f( uniforms.mNear, material.near );
+ _gl.uniform1f( uniforms.mFar, material.far );
_gl.uniform1f( uniforms.mOpacity, material.opacity );
}
@@ -492,8 +492,9 @@ THREE.WebGLRenderer2 = function ( antialias ) {
material.map ? 'varying vec2 vUv;' : null,
material.fog ? 'uniform float fog;' : null,
+ material.fog ? 'uniform float fogNear;' : null,
+ material.fog ? 'uniform float fogFar;' : null,
material.fog ? 'uniform vec3 fogColor;' : null,
- material.fog ? 'uniform float fogDensity;' : null,
'void main() {',
'gl_FragColor = vec4( mColor.xyz, mOpacity );',
@@ -505,16 +506,15 @@ THREE.WebGLRenderer2 = function ( antialias ) {
material.map ? 'gl_FragColor *= texture2D( tMap, vUv );' : null,
- material.fog ? 'const float LOG2 = 1.442695;' : null,
- material.fog ? 'float z = fog * ( gl_FragCoord.z / gl_FragCoord.w );' : null,
- material.fog ? 'float fogFactor = exp2( - fogDensity * fogDensity * z * z * LOG2 );' : null,
- material.fog ? 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), 1.0 - clamp( fogFactor, 0.0, 1.0 ) );' : null,
+ material.fog ? 'float depth = gl_FragCoord.z / gl_FragCoord.w;' : null,
+ material.fog ? 'float fogFactor = fog * smoothstep( fogNear, fogFar, depth );' : null,
+ material.fog ? 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), fogFactor );' : null,
'}'
].filter( removeNull ).join( '\n' );
identifiers.push( 'mColor', 'mOpacity' );
material.map ? identifiers.push( 'tMap' ) : null;
- material.fog ? identifiers.push( 'fog', 'fogColor', 'fogDensity' ) : null;
+ material.fog ? identifiers.push( 'fog', 'fogColor', 'fogNear', 'fogFar' ) : null;
} else if ( material instanceof THREE.MeshNormalMaterial ) {
@@ -549,18 +549,18 @@ THREE.WebGLRenderer2 = function ( antialias ) {
].join( '\n' );
fs = [
- 'uniform float m2Near;',
- 'uniform float mFarPlusNear;',
- 'uniform float mFarMinusNear;',
+ 'uniform float mNear;',
+ 'uniform float mFar;',
'uniform float mOpacity;',
'void main() {',
- 'float w = 1.0 - ( m2Near / ( mFarPlusNear - gl_FragCoord.z * mFarMinusNear ) );',
- 'gl_FragColor = vec4( w, w, w, mOpacity );',
+ 'float depth = gl_FragCoord.z / gl_FragCoord.w;',
+ 'float color = 1.0 - smoothstep( mNear, mFar, depth );',
+ 'gl_FragColor = vec4( vec3( color ), 1.0 );',
'}'
].join( '\n' );
- identifiers.push( 'm2Near', 'mFarPlusNear', 'mFarMinusNear', 'mOpacity' );
+ identifiers.push( 'mNear', 'mFar', 'mOpacity' );
} else if ( material instanceof THREE.MeshShaderMaterial ) {
diff --git a/src/scenes/Fog.js b/src/scenes/Fog.js
index ee4bf306..82c9d67b 100644
--- a/src/scenes/Fog.js
+++ b/src/scenes/Fog.js
@@ -3,9 +3,10 @@
* @author alteredq / http://alteredqualia.com/
*/
-THREE.Fog = function ( hex, density ) {
+THREE.Fog = function ( hex, near, far ) {
this.color = new THREE.Color( hex );
- this.density = density || 0.00025;
+ this.near = near || 1;
+ this.far = far || 1000;
};