Skip to content

Commit 6cb0c62

Browse files
Mugen87sunag
authored andcommitted
WebGPURenderer: Add debug.getRawShaderAsync(). (mrdoob#28997)
* WebGPURenderer: Add `debug.getRawShader()`. * Added getRawShaderAsync() --------- Co-authored-by: sunag <sunagbrasil@gmail.com>
1 parent f1ebe14 commit 6cb0c62

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

examples/webgpu_tsl_editor.html

+19-15
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@
5252

5353
import * as THREE from 'three';
5454

55-
import WebGPURenderer from '../src/renderers/webgpu/WebGPURenderer.js';
56-
import WGSLNodeBuilder from '../src/renderers/webgpu/nodes/WGSLNodeBuilder.js';
57-
import GLSLNodeBuilder from '../src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js';
58-
5955
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
6056

6157
init();
@@ -76,7 +72,7 @@
7672

7773
const rendererDOM = document.getElementById( 'renderer' );
7874

79-
const renderer = new WebGPURenderer( { antialias: true } );
75+
const renderer = new THREE.WebGPURenderer( { antialias: true } );
8076
renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
8177
renderer.setPixelRatio( window.devicePixelRatio );
8278
renderer.setSize( 200, 200 );
@@ -88,8 +84,14 @@
8884
const mesh = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1 ), material );
8985
scene.add( mesh );
9086

87+
//
88+
89+
let compiling = false;
90+
9191
renderer.setAnimationLoop( () => {
9292

93+
if ( compiling ) return;
94+
9395
renderer.render( scene, camera );
9496

9597
} );
@@ -108,7 +110,7 @@
108110
};
109111

110112
let timeout = null;
111-
let nodeBuilder = null;
113+
let rawShader = null;
112114

113115
const editorDOM = document.getElementById( 'source' );
114116
const resultDOM = document.getElementById( 'result' );
@@ -158,12 +160,14 @@
158160

159161
const showCode = () => {
160162

161-
result.setValue( nodeBuilder[ options.shader + 'Shader' ] );
163+
result.setValue( rawShader[ options.shader + 'Shader' ] );
162164
result.revealLine( 1 );
163165

164166
};
165167

166-
const build = () => {
168+
const webGLRenderer = new THREE.WebGPURenderer( { forceWebGL: true } );
169+
170+
const build = async () => {
167171

168172
try {
169173

@@ -173,20 +177,20 @@
173177
mesh.material.fragmentNode = nodes.output;
174178
mesh.material.needsUpdate = true;
175179

176-
let NodeBuilder;
180+
compiling = true;
177181

178182
if ( options.output === 'WGSL' ) {
179183

180-
NodeBuilder = WGSLNodeBuilder;
184+
rawShader = await renderer.debug.getRawShaderAsync( scene, camera, mesh );
185+
181186

182187
} else if ( options.output === 'GLSL ES 3.0' ) {
183188

184-
NodeBuilder = GLSLNodeBuilder;
189+
rawShader = await webGLRenderer.debug.getRawShaderAsync( scene, camera, mesh );
185190

186191
}
187192

188-
nodeBuilder = new NodeBuilder( mesh, renderer );
189-
nodeBuilder.build();
193+
compiling = false;
190194

191195
showCode();
192196

@@ -195,9 +199,9 @@
195199
/*const style = 'background-color: #333; color: white; font-style: italic; border: 2px solid #777; font-size: 22px;';
196200
197201
console.log( '%c [ WGSL ] Vertex Shader ', style );
198-
console.log( nodeBuilder.vertexShader );
202+
console.log( rawShader.vertexShader );
199203
console.log( '%c [ WGSL ] Fragment Shader ', style );
200-
console.log( nodeBuilder.fragmentShader );*/
204+
console.log( rawShader.fragmentShader );/**/
201205

202206
} catch ( e ) {
203207

src/renderers/common/Backend.js

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ class Backend {
9999

100100
hasFeature( /*name*/ ) { } // return Boolean
101101

102+
getRawShader( /*object*/ ) { } // return { vertexShader, fragmentShader }
103+
102104
getInstanceCount( renderObject ) {
103105

104106
const { object, geometry } = renderObject;

src/renderers/common/Renderer.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,23 @@ class Renderer {
147147

148148
this.debug = {
149149
checkShaderErrors: true,
150-
onShaderError: null
150+
onShaderError: null,
151+
getRawShaderAsync: async ( scene, camera, object ) => {
152+
153+
await this.compileAsync( scene, camera );
154+
155+
const renderList = this._renderLists.get( scene, camera );
156+
const renderContext = this._renderContexts.get( scene, camera, this._renderTarget );
157+
158+
const material = scene.overrideMaterial || object.material;
159+
160+
const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext );
161+
162+
const { fragmentShader, vertexShader } = renderObject.getNodeBuilderState();
163+
164+
return { fragmentShader, vertexShader };
165+
166+
}
151167
};
152168

153169
}

src/renderers/webgl-fallback/WebGLBackend.js

-1
Original file line numberDiff line numberDiff line change
@@ -1218,7 +1218,6 @@ class WebGLBackend extends Backend {
12181218

12191219
}
12201220

1221-
12221221
getMaxAnisotropy() {
12231222

12241223
return this.capabilities.getMaxAnisotropy();

0 commit comments

Comments
 (0)