Skip to content

Commit 7faae14

Browse files
authored
fog w shadows & ssao (x3dom#1312)
* fog w shadows & ssao * Update CHANGELOG.md
1 parent be8670b commit 7faae14

File tree

8 files changed

+64
-58
lines changed

8 files changed

+64
-58
lines changed

CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
* EXT_meshopt_compression
1313
* MSFT_texture_dds
1414
* field values from metadata for non-standard nodes
15-
1615
* Improvements
16+
* improved fog over shadows ([dmorehead](https://github.com/dmorehead))
1717
* enable negative scale auto-ccw for BufferGeometry/glTF
1818
* enable shadows for BufferGeometry/glTF
1919
* add "STEP" interpolator mode to interpolators
2020
* update cycleInterval behaviour to X3Dv4
2121
* more accurate startTime update
2222
* tune PhysicalMaterial for compatible light intensity
23-
2423
* Bugfixes
2524
* fix nav. type field updates
2625
* fix mipmaps for compressed dds

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"concat": "^1.0.3",
3636
"eslint": "^6.8.0",
3737
"fs-extra": "^8.1.0",
38-
"jsdoc": "3.6.3",
38+
"jsdoc": "^3.6.11",
3939
"terser": "^4.3.8",
4040
"zip-lib": "^0.2.1"
4141
}

src/SSAO.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ x3dom.SSAO.blur = function ( stateManager, gl, scene, ssaoTexture, depthTexture,
255255

256256
stateManager.useProgram( sp );
257257

258+
// shader always requires fog uniforms
259+
var fog = scene.getFog();
260+
sp.fogRange = fog._vf.visibilityRange;
261+
sp.fogType = ( fog._vf.fogType == "LINEAR" ) ? 0.0 : 1.0;
262+
258263
sp.SSAOTexture = 0;
259264
sp.depthTexture = 1;
260265

src/gfx_webgl.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2298,7 +2298,7 @@ x3dom.gfx_webgl = ( function ()
22982298
var fog = scene.getFog();
22992299

23002300
// THINKABOUTME: changed flag only works as long as lights and fog are global
2301-
if ( fog && changed )
2301+
if ( fog._vf.visibilityRange && changed )
23022302
{
23032303
sp.fogColor = fog._vf.color.toGL();
23042304
sp.fogRange = fog._vf.visibilityRange;
@@ -5117,22 +5117,16 @@ x3dom.gfx_webgl = ( function ()
51175117
}
51185118
}
51195119

5120-
if ( properties.FOG ) { sp.fogType = 999.0; } // draw without fog first
5121-
5122-
gl.drawArrays( gl.TRIANGLES, 0, 6 ); //shadows
5123-
5124-
// Set fog
5120+
// Mask shadows w/ fog, no need for fogColor, fogHeight, fogNoise.
51255121
if ( properties.FOG )
51265122
{
51275123
var fog = scene.getFog();
5128-
this.stateManager.blendColor( fog._vf.color.r, fog._vf.color.g, fog._vf.color.b, 1.0 );
5129-
this.stateManager.blendFunc( gl.CONSTANT_COLOR, gl.ONE_MINUS_SRC_COLOR );
5130-
sp.fogColor = fog._vf.color.toGL();
51315124
sp.fogRange = fog._vf.visibilityRange;
51325125
sp.fogType = ( fog._vf.fogType == "LINEAR" ) ? 0.0 : 1.0;
5133-
gl.drawArrays( gl.TRIANGLES, 0, 6 ); // fog
51345126
}
51355127

5128+
gl.drawArrays( gl.TRIANGLES, 0, 6 );
5129+
51365130
// cleanup
51375131
var nk = shadowIndex + 1;
51385132
for ( k = 0; k < nk; k++ )

src/shader/ShaderDynamic.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -742,17 +742,14 @@ x3dom.shader.DynamicShader.prototype.generateFragmentShader = function ( gl, pro
742742
}
743743
}
744744

745-
//Fog
746-
if ( properties.FOG )
747-
{
748-
shader += x3dom.shader.fog();
749-
}
745+
if ( properties.FOG ) { shader += x3dom.shader.fog(); }
750746

751-
if ( properties.LIGHTS || properties.CLIPPLANES )
747+
// same as vertex shader but with fragPositionWS for fogNoise (w/ or w/out lights)
748+
if ( properties.LIGHTS || properties.FOG || properties.CLIPPLANES )
752749
{
753750
shader += "varying vec4 fragPosition;\n";
754-
shader += "varying vec4 fragPositionWS;\n";
755751
shader += "uniform float isOrthoView;\n";
752+
shader += "varying vec4 fragPositionWS;\n";
756753
}
757754

758755
//Lights
@@ -1350,11 +1347,10 @@ x3dom.shader.DynamicShader.prototype.generateFragmentShader = function ( gl, pro
13501347

13511348
shader += "color = " + x3dom.shader.encodeGamma( properties, "color" ) + ";\n";
13521349

1353-
//Fog
1354-
if ( properties.FOG && !properties.SHADOW )
1350+
if ( properties.FOG )
13551351
{
1356-
shader += "float f0 = calcFog(fragEyePosition);\n";
1357-
shader += "color.rgb = fogColor * (1.0-f0) + f0 * (color.rgb);\n";
1352+
shader += " float f0 = calcFog(fragEyePosition);\n" +
1353+
" color.rgb = fogColor * (1.0-f0) + f0 * (color.rgb);\n";
13581354
}
13591355

13601356
shader += "gl_FragColor = color;\n";

src/shader/ShaderParts.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,24 @@ x3dom.shader.twoSidedMaterial = function ()
5858
x3dom.shader.fog = function ()
5959
{
6060
var shaderPart = "uniform vec3 fogColor;\n" +
61-
"uniform float fogType;\n" +
62-
"uniform float fogRange;\n" +
63-
"varying vec3 fragEyePosition;\n" +
64-
"float calcFog(in vec3 eye) {\n" +
65-
" float f0 = 0.0;\n" +
66-
" if(fogType == 0.0) {\n" +
67-
" if(length(eye) < fogRange){\n" +
68-
" f0 = (fogRange-length(eye)) / fogRange;\n" +
69-
" }\n" +
70-
" }else{\n" +
71-
" if(length(eye) < fogRange){\n" +
72-
" f0 = exp(-length(eye) / (fogRange-length(eye) ) );\n" +
73-
" }\n" +
74-
" }\n" +
75-
" f0 = clamp(f0, 0.0, 1.0);\n" +
76-
" return f0;\n" +
77-
"}\n";
78-
61+
"uniform float fogType;\n" +
62+
"uniform float fogRange;\n" +
63+
"varying vec3 fragEyePosition;\n" +
64+
65+
"float calcFog(in vec3 eye) {\n" +
66+
" float f0 = 0.0;\n" +
67+
" if(fogType == 0.0) {\n" +
68+
" if(length(eye) < fogRange){\n" +
69+
" f0 = (fogRange-length(eye)) / fogRange;\n" +
70+
" }\n" +
71+
" }else{\n" +
72+
" if(length(eye) < fogRange){\n" +
73+
" f0 = exp(-length(eye) / (fogRange-length(eye) ) );\n" +
74+
" }\n" +
75+
" }\n" +
76+
" f0 = clamp(f0, 0.0, 1.0);\n" +
77+
" return f0;\n" +
78+
"}\n";
7979
return shaderPart;
8080
};
8181

src/shader/ShaderSSAOBlur.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ x3dom.shader.SSAOBlurShader.prototype.generateFragmentShader = function ( gl )
5555
shader += " precision mediump float;\n";
5656
shader += "#endif\n\n";
5757

58-
shader += "uniform sampler2D SSAOTexture;\n" +
58+
shader += "uniform sampler2D SSAOTexture;\n" +
5959
"uniform sampler2D depthTexture;\n" +
6060
"uniform float nearPlane;\n" +
6161
"uniform float farPlane;\n" +
@@ -66,6 +66,9 @@ x3dom.shader.SSAOBlurShader.prototype.generateFragmentShader = function ( gl )
6666

6767
shader += x3dom.shader.SSAOShader.depthReconsructionFunctionCode();
6868

69+
// always use fog uniforms, even if no fog
70+
shader += x3dom.shader.fog();
71+
6972
shader += "void main(void) {\n" +
7073
" float sum = 0.0;\n" +
7174
" float numSamples = 0.0;\n" +
@@ -78,8 +81,18 @@ x3dom.shader.SSAOBlurShader.prototype.generateFragmentShader = function ( gl )
7881
" numSamples++;\n" +
7982
" }}}\n" +
8083
" float intensity = mix(1.0,sum/numSamples,amount);\n" +
81-
" gl_FragColor = vec4(intensity,intensity,intensity,1.0);\n" +
82-
"}\n";
84+
85+
//" gl_FragColor = vec4(intensity,intensity,intensity,1.0);\n" +
86+
" vec4 color = vec4(intensity,intensity,intensity,1.0);\n" +
87+
88+
" if (fogRange > 0.0) {\n" +
89+
" vec3 eye = vec3(0.0, 0.0, referenceDepth);\n" +
90+
" float f0 = calcFog(eye);\n" +
91+
" color.rgb = vec3(1.0, 1.0, 1.0) * (1.0 - f0) + f0 * color.rgb;\n" +
92+
" }\n" +
93+
94+
" gl_FragColor = color;\n" +
95+
"}\n";
8396

8497
var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
8598
gl.shaderSource( fragmentShader, shader );

src/shader/ShaderShadowRendering.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,7 @@ x3dom.shader.ShadowRenderingShader.prototype.generateFragmentShader = function (
118118
" projCoords = projCoords / projCoords.w;\n" +
119119
" projCoords.xy = vPosition;\n" +
120120
" vec4 eyeCoords = inverseProj*projCoords;\n";
121-
if ( properties.FOG )
122-
{
123-
shader +=
124-
" if (fogType < 2.0) {\n" +
125-
" vec3 eye = eyeCoords.xyz / eyeCoords.w;\n" +
126-
" float f0 = calcFog( eye );\n" +
127-
" color = vec4( 1.0 - f0, 1.0 - f0, 1.0 - f0, 1.0 );\n" +
128-
" }\n" +
129-
" else {\n";
130-
}
121+
131122
shader +=
132123
" float shadowValue = 1.0;\n" +
133124
//reconstruct world and view coordinates from scene map
@@ -172,15 +163,23 @@ x3dom.shader.ShadowRenderingShader.prototype.generateFragmentShader = function (
172163
shader += " }\n";
173164
}
174165

175-
shader += " color = " + x3dom.shader.encodeGamma( {}, "vec4(shadowValue, shadowValue, shadowValue, 1.0)" ) + " ;\n";
176-
if ( properties.FOG ) { shader += " }\n"; }
177166
// In principle we should fix the place where this is multplied in instead
178167
// of overcompensating for the subsequent error from here. This way of doing
179168
// gamma correction explots the rule that (a*b)^x = a^x * b^x (x being the
180169
// gamma coefficient), i.e. the umbra is corrected for now, the penumbra
181170
// is incorrect and full light is zero here so unaffected as well.
171+
shader += " color = " + x3dom.shader.encodeGamma( {}, "vec4(shadowValue, shadowValue, shadowValue, 1.0)" ) + " ;\n";
172+
173+
if ( properties.FOG )
174+
{
175+
shader += " vec3 fragEyePosition = eyeCoords.xyz / eyeCoords.w;\n" +
176+
" float f0 = calcFog(fragEyePosition);\n" +
177+
" color.rgb = vec3(1.0, 1.0, 1.0) * (1.0 - f0) + f0 * color.rgb;\n";
178+
}
179+
182180
shader += " gl_FragColor = color;\n" +
183-
"}\n";
181+
"}\n";
182+
184183
var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
185184
gl.shaderSource( fragmentShader, shader );
186185
gl.compileShader( fragmentShader );

0 commit comments

Comments
 (0)