webgl_custom_attributes_points.html 4.8 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - custom attributes [particles]</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: #ffffff;
				font-family:Monospace;
				font-size:13px;
				text-align:center;
				font-weight: bold;

				background-color: #000000;
				margin: 0px;
				overflow: hidden;
			}
			#info {
				color: #fff;
M
r72  
Mr.doob 已提交
21
				position: absolute;
M
Mr.doob 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
				top: 0px; width: 100%;
				padding: 5px;
				z-index:100;
			}
			a { color: #ff0000 }
		</style>
	</head>

	<body>
		<div id="info"><a href="http://threejs.org" target="_blank">three.js</a> - custom attributes example - particles</div>
		<div id="container"></div>

		<script src="../build/three.min.js"></script>

		<script src="js/Detector.js"></script>
		<script src="js/libs/stats.min.js"></script>

		<script type="x-shader/x-vertex" id="vertexshader">

			uniform float amplitude;
			attribute float size;
			attribute vec3 customColor;

			varying vec3 vColor;

			void main() {

				vColor = customColor;

				vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

				//gl_PointSize = size;
				gl_PointSize = size * ( 300.0 / length( mvPosition.xyz ) );

				gl_Position = projectionMatrix * mvPosition;

			}

		</script>

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

			uniform vec3 color;
			uniform sampler2D texture;

			varying vec3 vColor;

			void main() {

				gl_FragColor = vec4( color * vColor, 1.0 );
				gl_FragColor = gl_FragColor * texture2D( texture, gl_PointCoord );

			}

		</script>


		<script>

		if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

		var renderer, scene, camera, stats;

M
r72  
Mr.doob 已提交
85
		var sphere;
M
Mr.doob 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

		var noise = [];

		var WIDTH = window.innerWidth;
		var HEIGHT = window.innerHeight;

		init();
		animate();

		function init() {

			camera = new THREE.PerspectiveCamera( 40, WIDTH / HEIGHT, 1, 10000 );
			camera.position.z = 300;

			scene = new THREE.Scene();

M
r72  
Mr.doob 已提交
102 103
			var amount = 100000;
			var radius = 200;
M
Mr.doob 已提交
104

M
r72  
Mr.doob 已提交
105 106 107
			var positions = new Float32Array( amount * 3 );
			var colors = new Float32Array( amount * 3 );
			var sizes = new Float32Array( amount );
M
Mr.doob 已提交
108

M
r72  
Mr.doob 已提交
109 110
			var vertex = new THREE.Vector3();
			var color = new THREE.Color( 0xffffff );
M
Mr.doob 已提交
111

M
r72  
Mr.doob 已提交
112
			for ( var i = 0; i < amount; i ++ ) {
M
Mr.doob 已提交
113

M
r72  
Mr.doob 已提交
114 115 116 117
				vertex.x = ( Math.random() * 2 - 1 ) * radius;
				vertex.y = ( Math.random() * 2 - 1 ) * radius;
				vertex.z = ( Math.random() * 2 - 1 ) * radius;
				vertex.toArray( positions, i * 3 );
M
Mr.doob 已提交
118

M
r72  
Mr.doob 已提交
119
				if ( vertex.x < 0 ) {
M
Mr.doob 已提交
120

M
r72  
Mr.doob 已提交
121
					color.setHSL( 0.5 + 0.1 * ( i / amount ), 0.7, 0.5 );
M
Mr.doob 已提交
122

M
r72  
Mr.doob 已提交
123
				} else {
M
Mr.doob 已提交
124

M
r72  
Mr.doob 已提交
125
					color.setHSL( 0.0 + 0.1 * ( i / amount ), 0.9, 0.5 );
M
Mr.doob 已提交
126

M
r72  
Mr.doob 已提交
127
				}
M
Mr.doob 已提交
128

M
r72  
Mr.doob 已提交
129
				color.toArray( colors, i * 3 );
M
Mr.doob 已提交
130

M
r72  
Mr.doob 已提交
131
				sizes[ i ] = 10;
M
Mr.doob 已提交
132 133 134

			}

M
r72  
Mr.doob 已提交
135 136 137 138 139 140
			var geometry = new THREE.BufferGeometry();
			geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
			geometry.addAttribute( 'customColor', new THREE.BufferAttribute( colors, 3 ) );
			geometry.addAttribute( 'size', new THREE.BufferAttribute( sizes, 1 ) );

			//
M
Mr.doob 已提交
141

M
r72  
Mr.doob 已提交
142
			var material = new THREE.ShaderMaterial( {
M
Mr.doob 已提交
143

M
r72  
Mr.doob 已提交
144 145 146 147 148 149 150
				uniforms: {
					amplitude: { type: "f", value: 1.0 },
					color:     { type: "c", value: new THREE.Color( 0xffffff ) },
					texture:   { type: "t", value: THREE.ImageUtils.loadTexture( "textures/sprites/spark1.png" ) }
				},
				vertexShader:   document.getElementById( 'vertexshader' ).textContent,
				fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
M
Mr.doob 已提交
151

M
r72  
Mr.doob 已提交
152 153 154
				blending:       THREE.AdditiveBlending,
				depthTest:      false,
				transparent:    true
M
Mr.doob 已提交
155

M
r72  
Mr.doob 已提交
156
			});
M
Mr.doob 已提交
157

M
r72  
Mr.doob 已提交
158
			//
M
Mr.doob 已提交
159

M
r72  
Mr.doob 已提交
160
			sphere = new THREE.Points( geometry, material );
M
Mr.doob 已提交
161 162
			scene.add( sphere );

M
r72  
Mr.doob 已提交
163 164
			//

M
r65  
Mr.doob 已提交
165
			renderer = new THREE.WebGLRenderer();
M
r70  
Mr.doob 已提交
166
			renderer.setPixelRatio( window.devicePixelRatio );
M
Mr.doob 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
			renderer.setSize( WIDTH, HEIGHT );

			var container = document.getElementById( 'container' );
			container.appendChild( renderer.domElement );

			stats = new Stats();
			stats.domElement.style.position = 'absolute';
			stats.domElement.style.top = '0px';
			container.appendChild( stats.domElement );

			//

			window.addEventListener( 'resize', onWindowResize, false );

		}

		function onWindowResize() {

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

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

		}

		function animate() {

			requestAnimationFrame( animate );

			render();
			stats.update();

		}

		function render() {

			var time = Date.now() * 0.005;

			sphere.rotation.z = 0.01 * time;

M
r72  
Mr.doob 已提交
207 208
			var geometry = sphere.geometry;
			var attributes = geometry.attributes;
M
Mr.doob 已提交
209

M
r72  
Mr.doob 已提交
210
			for ( var i = 0; i < attributes.size.array.length; i++ ) {
M
Mr.doob 已提交
211

M
r72  
Mr.doob 已提交
212
				attributes.size.array[ i ] = 14 + 13 * Math.sin( 0.1 * i + time );
M
Mr.doob 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226

			}

			attributes.size.needsUpdate = true;

			renderer.render( scene, camera );

		}

	</script>

</body>

</html>