atmosphere: smooth front haze with 24-bit distance and dither
This commit is contained in:
1 parent
8af10a4f4a
commit
7f733b8efe
1 file changed
+12
-5
Vendored
+12
-5
@@ -460,15 +460,18 @@ var FRAG_SRC = [
|
|||||||
'if (uMode == 3) {',
|
'if (uMode == 3) {',
|
||||||
'if (uFrontHazeOn < 0.5) { gl_FragColor = vec4(0.0); return; }',
|
'if (uFrontHazeOn < 0.5) { gl_FragColor = vec4(0.0); return; }',
|
||||||
'vec2 uv = gl_FragCoord.xy / uResolution;',
|
'vec2 uv = gl_FragCoord.xy / uResolution;',
|
||||||
'float distNorm = texture2D(uTerrainDistTex, uv).a;',
|
'vec4 distTex = texture2D(uTerrainDistTex, uv);',
|
||||||
'float column = 0.0;',
|
'float column = 0.0;',
|
||||||
'if (distNorm > 0.0005 && distNorm < 0.999) {',
|
'if (distTex.a > 0.5) {',
|
||||||
|
'float distNorm = (distTex.r * 65536.0 + distTex.g * 256.0 + distTex.b) / 16777215.0;',
|
||||||
'column = hazeColumnToDistance(rd, distNorm * max(1.0, uFarPlane));',
|
'column = hazeColumnToDistance(rd, distNorm * max(1.0, uFarPlane));',
|
||||||
'} else {',
|
'} else {',
|
||||||
'column = airHazeColumn(rd);',
|
'column = airHazeColumn(rd);',
|
||||||
'}',
|
'}',
|
||||||
'float tau = uFrontHazeDensity * column;',
|
'float tau = uFrontHazeDensity * column;',
|
||||||
'float alpha = clamp((1.0 - exp(-tau)) * uFrontHazeGain, 0.0, uFrontHazeMaxAlpha);',
|
'float alpha = clamp((1.0 - exp(-tau)) * uFrontHazeGain, 0.0, uFrontHazeMaxAlpha);',
|
||||||
|
'float dither = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);',
|
||||||
|
'alpha = clamp(alpha + (dither - 0.5) / 255.0, 0.0, uFrontHazeMaxAlpha);',
|
||||||
'gl_FragColor = vec4(uFrontHazeColor, alpha);',
|
'gl_FragColor = vec4(uFrontHazeColor, alpha);',
|
||||||
'return;',
|
'return;',
|
||||||
'}',
|
'}',
|
||||||
@@ -818,7 +821,11 @@ var TERRAIN_FRAG_SRC = [
|
|||||||
'void main() {',
|
'void main() {',
|
||||||
'if (uDistancePassOn > 0.5) {',
|
'if (uDistancePassOn > 0.5) {',
|
||||||
'float d = clamp(length(vViewPos) / max(1.0, uFarPlane), 0.0, 1.0);',
|
'float d = clamp(length(vViewPos) / max(1.0, uFarPlane), 0.0, 1.0);',
|
||||||
'gl_FragColor = vec4(0.0, 0.0, 0.0, d);',
|
'float v = d * 16777215.0;',
|
||||||
|
'float r = floor(v / 65536.0) / 255.0;',
|
||||||
|
'float g = floor(mod(v, 65536.0) / 256.0) / 255.0;',
|
||||||
|
'float b = floor(mod(v, 256.0)) / 255.0;',
|
||||||
|
'gl_FragColor = vec4(r, g, b, 1.0);',
|
||||||
'return;',
|
'return;',
|
||||||
'}',
|
'}',
|
||||||
'vec2 gUv = vUV;',
|
'vec2 gUv = vUV;',
|
||||||
@@ -2274,8 +2281,8 @@ function ensureTerrainDistFbo(gl, w, h) {
|
|||||||
terrainDistTex = gl.createTexture();
|
terrainDistTex = gl.createTexture();
|
||||||
gl.bindTexture(gl.TEXTURE_2D, terrainDistTex);
|
gl.bindTexture(gl.TEXTURE_2D, terrainDistTex);
|
||||||
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
||||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
||||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
||||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
||||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
||||||
terrainDistDepth = gl.createRenderbuffer();
|
terrainDistDepth = gl.createRenderbuffer();
|
||||||
|
|||||||
Reference in new issue
Block a user