首页 > 技术文章 > 白云效果

wzzl 2016-01-13 17:58 原文

白云

<!DOCTYPE HTML>
<html lang="zh-cn">
    <head>
        <title>HTML5 天空云朵效果</title>
        <meta charset="utf-8">
        <style type="text/css">
            body {
                background-color: #326696;
                margin: 0px;
                overflow: hidden;
                font-family:Monospace;
                font-size:13px;
                text-align:center;
                font-weight: bold;
                text-align:center;
            }
            a {
                color:#0078ff;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript" src="assets/three.min.js"></script>
        <script type="text/javascript" src="assets/Detector.js"></script>
        <script id="vs" type="x-shader/x-vertex">
            varying vec2 vUv;
            void main() {
                vUv = uv;
                gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

            }
        </script>
        <script id="fs" type="x-shader/x-fragment">

            uniform sampler2D map;

            uniform vec3 fogColor;
            uniform float fogNear;
            uniform float fogFar;

            varying vec2 vUv;

            void main() {

                float depth = gl_FragCoord.z / gl_FragCoord.w;
                float fogFactor = smoothstep( fogNear, fogFar, depth );

                gl_FragColor = texture2D( map, vUv );
                gl_FragColor.w *= pow( gl_FragCoord.z, 20.0 );
                gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );

            }
        </script>
        <script type="text/javascript">
            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

            var container;
            var camera, scene, renderer;
            var mesh, geometry, material;

            var mouseX = 0, mouseY = 0;
            var start_time = Date.now();

            var windowHalfX = window.innerWidth / 2;
            var windowHalfY = window.innerHeight / 2;

            init();

            function init() {

                container = document.createElement( 'div' );
                document.body.appendChild( container );

                // Bg gradient

                var canvas = document.createElement( 'canvas' );
                canvas.width = 32;
                canvas.height = window.innerHeight;

                var context = canvas.getContext( '2d' );

                var gradient = context.createLinearGradient( 0, 0, 0, canvas.height );
                gradient.addColorStop(0, "#1e4877");
                gradient.addColorStop(0.5, "#4584b4");

                context.fillStyle = gradient;
                context.fillRect(0, 0, canvas.width, canvas.height);

                container.style.background = 'url(' + canvas.toDataURL('image/png') + ')';
                container.style.backgroundSize = '32px 100%';

                //

                camera = new THREE.PerspectiveCamera( 30, window.innerWidth / window.innerHeight, 1, 3000 );
                camera.position.z = 6000;

                scene = new THREE.Scene();

                geometry = new THREE.Geometry();

                var texture = THREE.ImageUtils.loadTexture( 'cloud10.png', null, animate );
                texture.magFilter = THREE.LinearMipMapLinearFilter;
                texture.minFilter = THREE.LinearMipMapLinearFilter;

                var fog = new THREE.Fog( 0x4584b4, - 100, 3000 );

                material = new THREE.ShaderMaterial( {

                    uniforms: {

                        "map": { type: "t", value: texture },
                        "fogColor" : { type: "c", value: fog.color },
                        "fogNear" : { type: "f", value: fog.near },
                        "fogFar" : { type: "f", value: fog.far },

                    },
                    vertexShader: document.getElementById( 'vs' ).textContent,
                    fragmentShader: document.getElementById( 'fs' ).textContent,
                    depthWrite: false,
                    depthTest: false,
                    transparent: true

                } );

                var plane = new THREE.Mesh( new THREE.PlaneGeometry( 64, 64 ) );

                for ( var i = 0; i < 8000; i++ ) {

                    plane.position.x = Math.random() * 1000 - 500;
                    plane.position.y = - Math.random() * Math.random() * 200 - 15;
                    plane.position.z = i;
                    plane.rotation.z = Math.random() * Math.PI;
                    plane.scale.x = plane.scale.y = Math.random() * Math.random() * 1.5 + 0.5;

                    THREE.GeometryUtils.merge( geometry, plane );

                }

                mesh = new THREE.Mesh( geometry, material );
                scene.add( mesh );

                mesh = new THREE.Mesh( geometry, material );
                mesh.position.z = - 8000;
                scene.add( mesh );

                renderer = new THREE.WebGLRenderer( { antialias: false } );
                renderer.setSize( window.innerWidth, window.innerHeight );
                container.appendChild( renderer.domElement );

                document.addEventListener( 'mousemove', onDocumentMouseMove, false );
                window.addEventListener( 'resize', onWindowResize, false );

            }

            function onDocumentMouseMove( event ) {

                mouseX = ( event.clientX - windowHalfX ) * 0.25;
                mouseY = ( event.clientY - windowHalfY ) * 0.15;

            }

            function onWindowResize( event ) {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

            }

            function animate() {

                requestAnimationFrame( animate );

                position = ( ( Date.now() - start_time ) * 0.03 ) % 8000;

                camera.position.x += ( mouseX - camera.position.x ) * 0.01;
                camera.position.y += ( - mouseY - camera.position.y ) * 0.01;
                camera.position.z = - position + 8000;

                renderer.render( scene, camera );

            }

        </script>
    </body>
</html>
three.min.js///

Detector.js
/**
 * @author alteredq / http://alteredqualia.com/
 * @author mr.doob / http://mrdoob.com/
 */

Detector = {

    canvas : !! window.CanvasRenderingContext2D,
    webgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),
    workers : !! window.Worker,
    fileapi : window.File && window.FileReader && window.FileList && window.Blob,

    getWebGLErrorMessage : function () {

        var domElement = document.createElement( 'div' );

        domElement.style.fontFamily = 'monospace';
        domElement.style.fontSize = '13px';
        domElement.style.textAlign = 'center';
        domElement.style.background = '#eee';
        domElement.style.color = '#000';
        domElement.style.padding = '1em';
        domElement.style.width = '475px';
        domElement.style.margin = '5em auto 0';

        if ( ! this.webgl ) {

            domElement.innerHTML = window.WebGLRenderingContext ? [
                'Sorry, your graphics card doesn\'t support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>'
            ].join( '\n' ) : [
                'Sorry, your browser doesn\'t support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a><br/>',
                'Please try with',
                '<a href="http://www.google.com/chrome">Chrome 10</a>, ',
                '<a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 4</a> or',
                '<a href="http://nightly.webkit.org/">Safari 6</a>'
            ].join( '\n' );

        }

        return domElement;

    },

    addGetWebGLMessage : function ( parameters ) {

        var parent, id, domElement;

        parameters = parameters || {};

        parent = parameters.parent !== undefined ? parameters.parent : document.body;
        id = parameters.id !== undefined ? parameters.id : 'oldie';

        domElement = Detector.getWebGLErrorMessage();
        domElement.id = id;

        parent.appendChild( domElement );

    }

};

 

推荐阅读