-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8798 from CesiumGS/fog-post-process
Fog post process sandcastle
- Loading branch information
Showing
2 changed files
with
116 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||
<meta | ||
name="viewport" | ||
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" | ||
/> | ||
<meta name="description" content="Fog post process" /> | ||
<meta | ||
name="cesium-sandcastle-labels" | ||
content="Showcases, Post Processing" | ||
/> | ||
<title>Cesium Demo</title> | ||
<script type="text/javascript" src="../Sandcastle-header.js"></script> | ||
<script type="text/javascript" src="../CesiumUnminified/Cesium.js"></script> | ||
</head> | ||
<body | ||
class="sandcastle-loading" | ||
data-sandcastle-bucket="bucket-requirejs.html" | ||
> | ||
<style> | ||
@import url(../templates/bucket.css); | ||
</style> | ||
<div id="cesiumContainer" class="fullSize"></div> | ||
<div id="loadingOverlay"><h1>Loading...</h1></div> | ||
<div id="toolbar"></div> | ||
<script id="cesium_sandcastle_script"> | ||
function startup(Cesium) { | ||
"use strict"; | ||
//Sandcastle_Begin | ||
var viewer = new Cesium.Viewer("cesiumContainer", { | ||
shouldAnimate: true, | ||
}); | ||
|
||
if (!viewer.scene.context.depthTexture) { | ||
window.alert("This browser does not support the fog post process."); | ||
} | ||
|
||
var tileset = new Cesium.Cesium3DTileset({ | ||
url: Cesium.IonResource.fromAssetId(40866), | ||
}); | ||
|
||
viewer.scene.primitives.add(tileset); | ||
|
||
viewer.scene.camera.setView({ | ||
destination: new Cesium.Cartesian3( | ||
1216356.033078094, | ||
-4736402.278325668, | ||
4081270.375520902 | ||
), | ||
orientation: new Cesium.HeadingPitchRoll( | ||
0.08033365594766728, | ||
-0.29519015695063455, | ||
0.00027759141518046704 | ||
), | ||
endTransform: Cesium.Matrix4.IDENTITY, | ||
}); | ||
|
||
var fragmentShaderSource = | ||
"float getDistance(sampler2D depthTexture, vec2 texCoords) \n" + | ||
"{ \n" + | ||
" float depth = czm_unpackDepth(texture2D(depthTexture, texCoords)); \n" + | ||
" if (depth == 0.0) { \n" + | ||
" return czm_infinity; \n" + | ||
" } \n" + | ||
" vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth); \n" + | ||
" return -eyeCoordinate.z / eyeCoordinate.w; \n" + | ||
"} \n" + | ||
"float interpolateByDistance(vec4 nearFarScalar, float distance) \n" + | ||
"{ \n" + | ||
" float startDistance = nearFarScalar.x; \n" + | ||
" float startValue = nearFarScalar.y; \n" + | ||
" float endDistance = nearFarScalar.z; \n" + | ||
" float endValue = nearFarScalar.w; \n" + | ||
" float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); \n" + | ||
" return mix(startValue, endValue, t); \n" + | ||
"} \n" + | ||
"vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) \n" + | ||
"{ \n" + | ||
" return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); \n" + | ||
"} \n" + | ||
"uniform sampler2D colorTexture; \n" + | ||
"uniform sampler2D depthTexture; \n" + | ||
"uniform vec4 fogByDistance; \n" + | ||
"uniform vec4 fogColor; \n" + | ||
"varying vec2 v_textureCoordinates; \n" + | ||
"void main(void) \n" + | ||
"{ \n" + | ||
" float distance = getDistance(depthTexture, v_textureCoordinates); \n" + | ||
" vec4 sceneColor = texture2D(colorTexture, v_textureCoordinates); \n" + | ||
" float blendAmount = interpolateByDistance(fogByDistance, distance); \n" + | ||
" vec4 undergroundColor = vec4(fogColor.rgb, fogColor.a * blendAmount); \n" + | ||
" gl_FragColor = alphaBlend(undergroundColor, sceneColor); \n" + | ||
"} \n"; | ||
|
||
var ellipsoid = viewer.scene.globe.ellipsoid; | ||
var postProcessStage = viewer.scene.postProcessStages.add( | ||
new Cesium.PostProcessStage({ | ||
fragmentShader: fragmentShaderSource, | ||
uniforms: { | ||
fogByDistance: new Cesium.Cartesian4(10, 0.0, 200, 1.0), | ||
fogColor: Cesium.Color.BLACK, | ||
}, | ||
}) | ||
); //Sandcastle_End | ||
Sandcastle.finishedLoading(); | ||
} | ||
if (typeof Cesium !== "undefined") { | ||
window.startupCalled = true; | ||
startup(Cesium); | ||
} | ||
</script> | ||
</body> | ||
</html> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.