webgl_custom_attributes_points.html 4.6 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
				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>

M
r76  
Mr.doob 已提交
34
		<script src="../build/three.js"></script>
M
Mr.doob 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

		<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 );

M
r74  
Mr.doob 已提交
53
				gl_PointSize = size * ( 300.0 / -mvPosition.z );
M
Mr.doob 已提交
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

				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 已提交
84
		var sphere;
M
Mr.doob 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

		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 已提交
101 102
			var amount = 100000;
			var radius = 200;
M
Mr.doob 已提交
103

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

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

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

M
r72  
Mr.doob 已提交
113 114 115 116
				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 已提交
117

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

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

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

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

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

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

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

			}

M
r72  
Mr.doob 已提交
134 135 136 137 138 139
			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 已提交
140

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

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

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

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

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

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

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

M
r65  
Mr.doob 已提交
164
			renderer = new THREE.WebGLRenderer();
M
r70  
Mr.doob 已提交
165
			renderer.setPixelRatio( window.devicePixelRatio );
M
Mr.doob 已提交
166 167 168 169 170 171
			renderer.setSize( WIDTH, HEIGHT );

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

			stats = new Stats();
M
r76  
Mr.doob 已提交
172
			container.appendChild( stats.dom );
M
Mr.doob 已提交
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

			//

			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 已提交
204 205
			var geometry = sphere.geometry;
			var attributes = geometry.attributes;
M
Mr.doob 已提交
206

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

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

			}

			attributes.size.needsUpdate = true;

			renderer.render( scene, camera );

		}

	</script>

</body>

</html>