Skip to content

Commit 4d0e1db

Browse files
BrianCraigmrdoob
authored andcommitted
Webgl BufferGeometry Instance Billboard Example GPU Boost (mrdoob#8965)
* First functional change * Better HSL to RGB function * Correct Padding * HSL to RGB bad colors generation, fixed
1 parent c36044a commit 4d0e1db

File tree

1 file changed

+27
-55
lines changed

1 file changed

+27
-55
lines changed

examples/webgl_buffergeometry_instancing_billboards.html

Lines changed: 27 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -55,52 +55,60 @@
5555
precision highp float;
5656
uniform mat4 modelViewMatrix;
5757
uniform mat4 projectionMatrix;
58+
uniform float time;
5859

5960
attribute vec3 position;
6061
attribute vec2 uv;
61-
attribute vec3 normal;
62-
6362
attribute vec3 translate;
64-
attribute float scale;
65-
attribute vec3 color;
6663

6764
varying vec2 vUv;
68-
varying vec3 vColor;
65+
varying float vScale;
6966

7067
void main() {
7168

7269
vec4 mvPosition = modelViewMatrix * vec4( translate, 1.0 );
73-
70+
vec3 trTime = vec3(translate.x + time,translate.y + time,translate.z + time);
71+
float scale = sin( trTime.x * 2.1 ) + sin( trTime.y * 3.2 ) + sin( trTime.z * 4.3 );
72+
vScale = scale;
73+
scale = scale * 10.0 + 10.0;
7474
mvPosition.xyz += position * scale;
75-
7675
vUv = uv;
77-
vColor = color;
78-
7976
gl_Position = projectionMatrix * mvPosition;
8077

8178
}
82-
8379
</script>
8480
<script id="fshader" type="x-shader/x-fragment">
8581
precision highp float;
8682

8783
uniform sampler2D map;
8884

8985
varying vec2 vUv;
90-
varying vec3 vColor;
86+
varying float vScale;
87+
88+
// HSL to RGB Convertion helpers
89+
vec3 HUEtoRGB(float H){
90+
H = mod(H,1.0);
91+
float R = abs(H * 6.0 - 3.0) - 1.0;
92+
float G = 2.0 - abs(H * 6.0 - 2.0);
93+
float B = 2.0 - abs(H * 6.0 - 4.0);
94+
return clamp(vec3(R,G,B),0.0,1.0);
95+
}
9196

92-
void main() {
97+
vec3 HSLtoRGB(vec3 HSL){
98+
vec3 RGB = HUEtoRGB(HSL.x);
99+
float C = (1.0 - abs(2.0 * HSL.z - 1.0)) * HSL.y;
100+
return (RGB - 0.5) * C + HSL.z;
101+
}
93102

103+
void main() {
94104
vec4 diffuseColor = texture2D( map, vUv );
95-
gl_FragColor = vec4( diffuseColor.xyz * vColor, diffuseColor.w );
105+
gl_FragColor = vec4( diffuseColor.xyz * HSLtoRGB(vec3(vScale/5.0, 1.0, 0.5)), diffuseColor.w );
96106

97107
if ( diffuseColor.w < 0.5 ) discard;
98-
99108
}
100109
</script>
101110

102111
<script>
103-
104112
var container, stats;
105113

106114
var camera, scene, renderer;
@@ -136,8 +144,6 @@
136144
var particleCount = 75000;
137145

138146
var translateArray = new Float32Array( particleCount * 3 );
139-
var scaleArray = new Float32Array( particleCount );
140-
var colorsArray = new Float32Array( particleCount * 3 );
141147

142148
for ( var i = 0, i3 = 0, l = particleCount; i < l; i ++, i3 += 3 ) {
143149

@@ -148,12 +154,11 @@
148154
}
149155

150156
geometry.addAttribute( "translate", new THREE.InstancedBufferAttribute( translateArray, 3, 1 ) );
151-
geometry.addAttribute( "scale", new THREE.InstancedBufferAttribute( scaleArray, 1, 1 ).setDynamic( true ) );
152-
geometry.addAttribute( "color", new THREE.InstancedBufferAttribute( colorsArray, 3, 1 ).setDynamic( true ) );
153157

154158
material = new THREE.RawShaderMaterial( {
155159
uniforms: {
156-
map: { type: "t", value: new THREE.TextureLoader().load( "textures/sprites/circle.png" ) }
160+
map: { type: "t", value: new THREE.TextureLoader().load( "textures/sprites/circle.png" ) },
161+
time: { type: "f", value: 0.0 }
157162
},
158163
vertexShader: document.getElementById( 'vshader' ).textContent,
159164
fragmentShader: document.getElementById( 'fshader' ).textContent,
@@ -169,8 +174,6 @@
169174
renderer.setSize( window.innerWidth, window.innerHeight );
170175
container.appendChild( renderer.domElement );
171176

172-
//
173-
174177
stats = new Stats();
175178
container.appendChild( stats.dom );
176179

@@ -189,8 +192,6 @@
189192

190193
}
191194

192-
//
193-
194195
function animate() {
195196

196197
requestAnimationFrame( animate );
@@ -204,40 +205,11 @@
204205

205206
var time = performance.now() * 0.0005;
206207

208+
material.uniforms.time.value = time;
209+
207210
mesh.rotation.x = time * 0.2;
208211
mesh.rotation.y = time * 0.4;
209212

210-
var translates = geometry.getAttribute( 'translate' );
211-
var translatesArray = translates.array;
212-
213-
var scales = geometry.getAttribute( 'scale' );
214-
var scalesArray = scales.array;
215-
216-
var colors = geometry.getAttribute( 'color' );
217-
var colorsArray = colors.array;
218-
219-
var color = new THREE.Color( 0xffffff );
220-
221-
for ( var i = 0, i3 = 0, l = scalesArray.length; i < l; i ++, i3 += 3 ) {
222-
223-
var x = translatesArray[ i3 + 0 ] + time;
224-
var y = translatesArray[ i3 + 1 ] + time;
225-
var z = translatesArray[ i3 + 2 ] + time;
226-
var scale = Math.sin( x * 2.1 ) + Math.sin( y * 3.2 ) + Math.sin( z * 4.3 );
227-
228-
scalesArray[ i ] = scale * 10 + 10;
229-
230-
color.setHSL( scale / 5, 1, 0.5 );
231-
232-
colorsArray[ i3 + 0 ] = color.r;
233-
colorsArray[ i3 + 1 ] = color.g;
234-
colorsArray[ i3 + 2 ] = color.b;
235-
236-
}
237-
238-
scales.needsUpdate = true;
239-
colors.needsUpdate = true;
240-
241213
renderer.render( scene, camera );
242214

243215
}

0 commit comments

Comments
 (0)