--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <title>three.js webgl - shaders - sky sun shader</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+ <style>
+
+ body {
+ color: #000;
+ font-family:Monospace;
+ font-size:13px;
+ text-align:center;
+ font-weight: bold;
+
+ background-color: #fff;
+ margin: 0px;
+ overflow: hidden;
+ }
+
+ #info {
+ color:#ccc;
+ text-shadow: 1px 1px rgba(0,0,0,0.25);
+ position: absolute;
+ top: 0px; width: 100%;
+ padding: 5px;
+
+ }
+
+ a {
+ color: #fff;
+ }
+
+ </style>
+ </head>
+ <body>
+
+ <div id="info"><a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - sky + sun shader
+
+ <br/><a href="https://plus.google.com/117614030945250277079/posts/MYkgKdvLhNj">More info</a> by <a href="http://twitter.com/blurspline">@blurspline</a>
+
+ </div>
+
+ <script src="../build/three.js"></script>
+
+ <script src="js/controls/OrbitControls.js"></script>
+ <script src="js/SkyShader.js"></script>
+
+ <script src="js/Detector.js"></script>
+ <script src="js/libs/dat.gui.min.js"></script>
+
+ <script>
+
+
+ if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
+
+ var container;
+
+ var camera, controls, scene, renderer;
+
+ var sky, sunSphere;
+
+ init();
+ render();
+
+ function initSky() {
+
+ // Add Sky Mesh
+ sky = new THREE.Sky();
+ scene.add( sky.mesh );
+
+ // Add Sun Helper
+ sunSphere = new THREE.Mesh(
+ new THREE.SphereBufferGeometry( 20000, 16, 8 ),
+ new THREE.MeshBasicMaterial( { color: 0xffffff } )
+ );
+ sunSphere.position.y = - 700000;
+ sunSphere.visible = false;
+ scene.add( sunSphere );
+
+ /// GUI
+
+ var effectController = {
+ turbidity: 10,
+ rayleigh: 2,
+ mieCoefficient: 0.005,
+ mieDirectionalG: 0.8,
+ luminance: 1,
+ inclination: 0.49, // elevation / inclination
+ azimuth: 0.25, // Facing front,
+ sun: ! true
+ };
+
+ var distance = 400000;
+
+ function guiChanged() {
+
+ var uniforms = sky.uniforms;
+ uniforms.turbidity.value = effectController.turbidity;
+ uniforms.rayleigh.value = effectController.rayleigh;
+ uniforms.luminance.value = effectController.luminance;
+ uniforms.mieCoefficient.value = effectController.mieCoefficient;
+ uniforms.mieDirectionalG.value = effectController.mieDirectionalG;
+
+ var theta = Math.PI * ( effectController.inclination - 0.5 );
+ var phi = 2 * Math.PI * ( effectController.azimuth - 0.5 );
+
+ sunSphere.position.x = distance * Math.cos( phi );
+ sunSphere.position.y = distance * Math.sin( phi ) * Math.sin( theta );
+ sunSphere.position.z = distance * Math.sin( phi ) * Math.cos( theta );
+
+ sunSphere.visible = effectController.sun;
+
+ sky.uniforms.sunPosition.value.copy( sunSphere.position );
+
+ renderer.render( scene, camera );
+
+ }
+
+ var gui = new dat.GUI();
+
+ gui.add( effectController, "turbidity", 1.0, 20.0, 0.1 ).onChange( guiChanged );
+ gui.add( effectController, "rayleigh", 0.0, 4, 0.001 ).onChange( guiChanged );
+ gui.add( effectController, "mieCoefficient", 0.0, 0.1, 0.001 ).onChange( guiChanged );
+ gui.add( effectController, "mieDirectionalG", 0.0, 1, 0.001 ).onChange( guiChanged );
+ gui.add( effectController, "luminance", 0.0, 2 ).onChange( guiChanged );
+ gui.add( effectController, "inclination", 0, 1, 0.0001 ).onChange( guiChanged );
+ gui.add( effectController, "azimuth", 0, 1, 0.0001 ).onChange( guiChanged );
+ gui.add( effectController, "sun" ).onChange( guiChanged );
+
+ guiChanged();
+
+ }
+
+ function init() {
+
+ camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 100, 2000000 );
+ camera.position.set( 0, 100, 2000 );
+
+ //camera.setLens(20);
+
+ scene = new THREE.Scene();
+
+ var helper = new THREE.GridHelper( 10000, 2, 0xffffff, 0xffffff );
+ scene.add( helper );
+
+ renderer = new THREE.WebGLRenderer();
+ renderer.setPixelRatio( window.devicePixelRatio );
+ renderer.setSize( window.innerWidth, window.innerHeight );
+ document.body.appendChild( renderer.domElement );
+
+ controls = new THREE.OrbitControls( camera, renderer.domElement );
+ controls.addEventListener( 'change', render );
+ //controls.maxPolarAngle = Math.PI / 2;
+ controls.enableZoom = false;
+ controls.enablePan = false;
+
+ initSky();
+
+ window.addEventListener( 'resize', onWindowResize, false );
+
+ }
+
+ function onWindowResize() {
+
+ camera.aspect = window.innerWidth / window.innerHeight;
+ camera.updateProjectionMatrix();
+
+ renderer.setSize( window.innerWidth, window.innerHeight );
+
+ render();
+
+ }
+
+ function render() {
+
+ renderer.render( scene, camera );
+
+ }
+
+ </script>
+
+ </body>
+
+</html>