Skip to content

Commit b19b10c

Browse files
committed
WebGLBackend: Support render target textures in copyTextureToTexture().
1 parent 50aab4c commit b19b10c

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

examples/jsm/tsl/display/TRAAPassNode.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class TRAAPassNode extends PassNode {
140140
renderer.clear();
141141
renderer.render( scene, camera );
142142

143+
renderer.setRenderTarget( null );
143144
renderer.setMRT( null );
144145

145146
// every time when the dimensions change we need fresh history data. Copy the sample
@@ -154,6 +155,11 @@ class TRAAPassNode extends PassNode {
154155
renderer.setRenderTarget( this._historyRenderTarget );
155156
renderer.clear();
156157

158+
renderer.setRenderTarget( this.renderTarget );
159+
renderer.clear();
160+
161+
renderer.setRenderTarget( null );
162+
157163
renderer.copyTextureToTexture( this._sampleRenderTarget.texture, this._historyRenderTarget.texture );
158164
renderer.copyTextureToTexture( this._sampleRenderTarget.texture, this.renderTarget.texture );
159165

@@ -164,6 +170,7 @@ class TRAAPassNode extends PassNode {
164170
renderer.setRenderTarget( this.renderTarget );
165171
_quadMesh.material = this._resolveMaterial;
166172
_quadMesh.render( renderer );
173+
renderer.setRenderTarget( null );
167174

168175
// update history
169176

examples/webgpu_postprocessing_traa.html

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import * as THREE from 'three';
2727
import { mrt, output, velocity } from 'three/tsl';
2828
import { traaPass } from 'three/addons/tsl/display/TRAAPassNode.js';
29-
import WebGPU from 'three/addons/capabilities/WebGPU.js';
3029

3130
import Stats from 'three/addons/libs/stats.module.js';
3231

@@ -38,15 +37,7 @@
3837

3938
function init() {
4039

41-
if ( WebGPU.isAvailable() === false ) {
42-
43-
document.body.appendChild( WebGPU.getErrorMessage() );
44-
45-
throw new Error( 'No WebGPU support' );
46-
47-
}
48-
49-
renderer = new THREE.WebGPURenderer();
40+
renderer = new THREE.WebGPURenderer( { forceWebGL: true } );
5041
renderer.setPixelRatio( window.devicePixelRatio );
5142
renderer.setSize( window.innerWidth, window.innerHeight );
5243
renderer.setAnimationLoop( animate );

src/renderers/webgl-fallback/WebGLBackend.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,9 +1281,9 @@ class WebGLBackend extends Backend {
12811281

12821282
}
12831283

1284-
copyTextureToTexture( position, srcTexture, dstTexture, level ) {
1284+
copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, level ) {
12851285

1286-
this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
1286+
this.textureUtils.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, level );
12871287

12881288
}
12891289

@@ -1355,6 +1355,7 @@ class WebGLBackend extends Backend {
13551355
const texture = textures[ i ];
13561356
const textureData = this.get( texture );
13571357
textureData.renderTarget = descriptor.renderTarget;
1358+
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
13581359

13591360
const attachment = gl.COLOR_ATTACHMENT0 + i;
13601361

@@ -1370,6 +1371,8 @@ class WebGLBackend extends Backend {
13701371

13711372
const textureData = this.get( descriptor.depthTexture );
13721373
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1374+
textureData.renderTarget = descriptor.renderTarget;
1375+
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
13731376

13741377
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
13751378

src/renderers/webgl-fallback/utils/WebGLTextureUtils.js

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -659,20 +659,46 @@ class WebGLTextureUtils {
659659
gl.pixelStorei( gl.UNPACK_SKIP_PIXELS, minX );
660660
gl.pixelStorei( gl.UNPACK_SKIP_ROWS, minY );
661661

662+
if ( srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture ) {
662663

663-
if ( srcTexture.isDataTexture ) {
664+
const srcTextureData = backend.get( srcTexture );
665+
const dstTextureData = backend.get( dstTexture );
664666

665-
gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
667+
const srcRenderContextData = backend.get( srcTextureData.renderTarget );
668+
const dstRenderContextData = backend.get( dstTextureData.renderTarget );
669+
670+
const srcFramebuffer = srcRenderContextData.framebuffers[ srcTextureData.cacheKey ];
671+
const dstFramebuffer = dstRenderContextData.framebuffers[ dstTextureData.cacheKey ];
672+
673+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffer );
674+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, dstFramebuffer );
675+
676+
let mask = gl.COLOR_BUFFER_BIT;
677+
678+
if ( srcTexture.isDepthTexture ) mask = gl.DEPTH_BUFFER_BIT;
679+
680+
gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, mask, gl.NEAREST );
681+
682+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, null );
683+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );
666684

667685
} else {
668686

669-
if ( srcTexture.isCompressedTexture ) {
687+
if ( srcTexture.isDataTexture ) {
670688

671-
gl.compressedTexSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
689+
gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
672690

673691
} else {
674692

675-
gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
693+
if ( srcTexture.isCompressedTexture ) {
694+
695+
gl.compressedTexSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
696+
697+
} else {
698+
699+
gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
700+
701+
}
676702

677703
}
678704

0 commit comments

Comments
 (0)