Skip to content

Commit faa6007

Browse files
authored
Example: Restore webgpu_compute_audio (#30139)
* cleanup * restore * optional read-only
1 parent d7b6a32 commit faa6007

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

examples/webgpu_compute_audio.html

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
3636

3737
let camera, scene, renderer;
38-
let computeNode, computeResetNode;
38+
let computeNode;
3939
let waveBuffer, sampleRate;
40-
let waveArray, originalWaveBuffer;
40+
let waveArray;
4141
let currentAudio, currentAnalyser;
4242
const analyserBuffer = new Uint8Array( 1024 );
4343
let analyserTexture;
@@ -49,9 +49,10 @@
4949

5050
if ( currentAudio ) currentAudio.stop();
5151

52-
await renderer.computeAsync( computeResetNode );
5352
// compute audio
53+
5454
await renderer.computeAsync( computeNode );
55+
5556
const wave = new Float32Array( await renderer.getArrayBufferAsync( waveArray.value ) );
5657

5758
// play result
@@ -93,18 +94,21 @@
9394

9495
// adding extra silence to delay and pitch
9596
waveBuffer = new Float32Array( [ ...waveBuffer, ...new Float32Array( 200000 ) ] );
96-
originalWaveBuffer = waveBuffer.slice();
97-
97+
9898
sampleRate = audioBuffer.sampleRate / audioBuffer.numberOfChannels;
9999

100100
// create webgpu buffers
101101

102102
waveArray = instancedArray( waveBuffer );
103-
const originalWave = instancedArray( originalWaveBuffer ).toReadOnly();
103+
104+
// read-only buffer
105+
106+
const originalWave = instancedArray( waveBuffer ).toReadOnly();
104107

105108
// The Pixel Buffer Object (PBO) is required to get the GPU computed data to the CPU in the WebGL2 fallback.
106109
// As used in `renderer.getArrayBufferAsync( waveArray.value )`.
107110

111+
originalWave.setPBO( true );
108112
waveArray.setPBO( true );
109113

110114
// params
@@ -114,24 +118,24 @@
114118
const delayOffset = uniform( .55 );
115119

116120

117-
// compute
121+
// compute (shader-node)
118122

119-
computeNode = Fn( () => {
123+
const computeShaderFn = Fn( () => {
120124

121125
const index = float( instanceIndex );
122126

123127
// pitch
124128

125129
const time = index.mul( pitch );
126130

127-
let wave = waveArray.element( time );
131+
let wave = originalWave.element( time );
128132

129133

130134
// delay
131135

132136
for ( let i = 1; i < 7; i ++ ) {
133137

134-
const waveOffset = waveArray.element( index.sub( delayOffset.mul( sampleRate ).mul( i ) ).mul( pitch ) );
138+
const waveOffset = originalWave.element( index.sub( delayOffset.mul( sampleRate ).mul( i ) ).mul( pitch ) );
135139
const waveOffsetVolume = waveOffset.mul( delayVolume.div( i * i ) );
136140

137141
wave = wave.add( waveOffsetVolume );
@@ -145,14 +149,12 @@
145149

146150
waveStorageElementNode.assign( wave );
147151

148-
} )().compute( waveBuffer.length );
152+
} );
149153

150-
computeResetNode = Fn( () => {
151154

152-
waveArray.element( instanceIndex ).assign( originalWave.element( instanceIndex ) );
153-
154-
} )().compute( waveBuffer.length );
155+
// compute
155156

157+
computeNode = computeShaderFn().compute( waveBuffer.length );
156158

157159

158160
// gui
@@ -194,12 +196,10 @@
194196
container.appendChild( renderer.domElement );
195197

196198
window.addEventListener( 'resize', onWindowResize );
199+
document.addEventListener( 'click', playAudioBuffer );
197200

198201
playAudioBuffer();
199202

200-
// on click replay
201-
renderer.domElement.addEventListener( 'click', playAudioBuffer );
202-
203203
}
204204

205205
function onWindowResize() {

src/renderers/webgpu/utils/WebGPUAttributeUtils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,13 @@ class WebGPUAttributeUtils {
231231
const size = bufferGPU.size;
232232

233233
const readBufferGPU = device.createBuffer( {
234-
label: `${attribute.name}_readback`,
234+
label: `${ attribute.name }_readback`,
235235
size,
236236
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
237237
} );
238238

239239
const cmdEncoder = device.createCommandEncoder( {
240-
label: `readback_encoder_${attribute.name}`
240+
label: `readback_encoder_${ attribute.name }`
241241
} );
242242

243243
cmdEncoder.copyBufferToBuffer(

0 commit comments

Comments
 (0)