diff --git a/examples/webgpu_tsl_editor.html b/examples/webgpu_tsl_editor.html index 7a8d6600f3ec69..1aaa83bef2efac 100644 --- a/examples/webgpu_tsl_editor.html +++ b/examples/webgpu_tsl_editor.html @@ -52,10 +52,6 @@ import * as THREE from 'three'; - import WebGPURenderer from '../src/renderers/webgpu/WebGPURenderer.js'; - import WGSLNodeBuilder from '../src/renderers/webgpu/nodes/WGSLNodeBuilder.js'; - import GLSLNodeBuilder from '../src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js'; - import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; init(); @@ -76,7 +72,7 @@ const rendererDOM = document.getElementById( 'renderer' ); - const renderer = new WebGPURenderer( { antialias: true } ); + const renderer = new THREE.WebGPURenderer( { antialias: true } ); renderer.outputColorSpace = THREE.LinearSRGBColorSpace; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( 200, 200 ); @@ -88,8 +84,14 @@ const mesh = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1 ), material ); scene.add( mesh ); + // + + let compiling = false; + renderer.setAnimationLoop( () => { + if ( compiling ) return; + renderer.render( scene, camera ); } ); @@ -108,7 +110,7 @@ }; let timeout = null; - let nodeBuilder = null; + let rawShader = null; const editorDOM = document.getElementById( 'source' ); const resultDOM = document.getElementById( 'result' ); @@ -158,12 +160,14 @@ const showCode = () => { - result.setValue( nodeBuilder[ options.shader + 'Shader' ] ); + result.setValue( rawShader[ options.shader + 'Shader' ] ); result.revealLine( 1 ); }; - const build = () => { + const webGLRenderer = new THREE.WebGPURenderer( { forceWebGL: true } ); + + const build = async () => { try { @@ -173,20 +177,20 @@ mesh.material.fragmentNode = nodes.output; mesh.material.needsUpdate = true; - let NodeBuilder; + compiling = true; if ( options.output === 'WGSL' ) { - NodeBuilder = WGSLNodeBuilder; + rawShader = await renderer.debug.getRawShaderAsync( scene, camera, mesh ); + } else if ( options.output === 'GLSL ES 3.0' ) { - NodeBuilder = GLSLNodeBuilder; + rawShader = await webGLRenderer.debug.getRawShaderAsync( scene, camera, mesh ); } - nodeBuilder = new NodeBuilder( mesh, renderer ); - nodeBuilder.build(); + compiling = false; showCode(); @@ -195,9 +199,9 @@ /*const style = 'background-color: #333; color: white; font-style: italic; border: 2px solid #777; font-size: 22px;'; console.log( '%c [ WGSL ] Vertex Shader ', style ); - console.log( nodeBuilder.vertexShader ); + console.log( rawShader.vertexShader ); console.log( '%c [ WGSL ] Fragment Shader ', style ); - console.log( nodeBuilder.fragmentShader );*/ + console.log( rawShader.fragmentShader );/**/ } catch ( e ) { diff --git a/src/renderers/common/Backend.js b/src/renderers/common/Backend.js index d0c5ae4a1f3ca2..9dde1c8f77f51f 100644 --- a/src/renderers/common/Backend.js +++ b/src/renderers/common/Backend.js @@ -99,6 +99,8 @@ class Backend { hasFeature( /*name*/ ) { } // return Boolean + getRawShader( /*object*/ ) { } // return { vertexShader, fragmentShader } + getInstanceCount( renderObject ) { const { object, geometry } = renderObject; diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 41a2a4be917144..174a2c003f3e44 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -147,7 +147,23 @@ class Renderer { this.debug = { checkShaderErrors: true, - onShaderError: null + onShaderError: null, + getRawShaderAsync: async ( scene, camera, object ) => { + + await this.compileAsync( scene, camera ); + + const renderList = this._renderLists.get( scene, camera ); + const renderContext = this._renderContexts.get( scene, camera, this._renderTarget ); + + const material = scene.overrideMaterial || object.material; + + const renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext ); + + const { fragmentShader, vertexShader } = renderObject.getNodeBuilderState(); + + return { fragmentShader, vertexShader }; + + } }; } diff --git a/src/renderers/webgl-fallback/WebGLBackend.js b/src/renderers/webgl-fallback/WebGLBackend.js index 50f8e4521fc080..5c769c62bec341 100644 --- a/src/renderers/webgl-fallback/WebGLBackend.js +++ b/src/renderers/webgl-fallback/WebGLBackend.js @@ -1218,7 +1218,6 @@ class WebGLBackend extends Backend { } - getMaxAnisotropy() { return this.capabilities.getMaxAnisotropy();