Use RenderTarget properties to reduce manual render state tracking (#80)

This commit is contained in:
Noeri Huisman
2025-07-01 07:26:17 +02:00
committed by GitHub
parent f95eb494f0
commit fe3430000d
2 changed files with 14 additions and 29 deletions
+8 -15
View File
@@ -357,6 +357,7 @@ export class PackedSplats {
this.target.texture.format = THREE.RGBAIntegerFormat; this.target.texture.format = THREE.RGBAIntegerFormat;
this.target.texture.type = THREE.UnsignedIntType; this.target.texture.type = THREE.UnsignedIntType;
this.target.texture.internalFormat = "RGBA32UI"; this.target.texture.internalFormat = "RGBA32UI";
this.target.scissorTest = true;
return true; return true;
} }
@@ -503,27 +504,21 @@ export class PackedSplats {
private saveRenderState(renderer: THREE.WebGLRenderer) { private saveRenderState(renderer: THREE.WebGLRenderer) {
return { return {
xrPresenting: renderer.xr.isPresenting, xrEnabled: renderer.xr.enabled,
autoClear: renderer.autoClear, autoClear: renderer.autoClear,
scissorTest: renderer.getScissorTest(),
pixelRatio: renderer.getPixelRatio(),
}; };
} }
private resetRenderState( private resetRenderState(
renderer: THREE.WebGLRenderer, renderer: THREE.WebGLRenderer,
state: { state: {
xrPresenting: boolean; xrEnabled: boolean;
autoClear: boolean; autoClear: boolean;
scissorTest: boolean;
pixelRatio: number;
}, },
) { ) {
renderer.setRenderTarget(null); renderer.setRenderTarget(null);
renderer.setPixelRatio(state.pixelRatio); renderer.xr.enabled = state.xrEnabled;
renderer.xr.isPresenting = state.xrPresenting;
renderer.autoClear = state.autoClear; renderer.autoClear = state.autoClear;
renderer.setScissorTest(state.scissorTest);
} }
// Executes a dyno program specified by generator which is any DynoBlock that // Executes a dyno program specified by generator which is any DynoBlock that
@@ -575,17 +570,15 @@ export class PackedSplats {
); );
// Render the desired portion of the layer // Render the desired portion of the layer
renderer.setPixelRatio(1); this.target.scissor.set(
renderer.setRenderTarget(this.target, layer);
renderer.xr.isPresenting = false;
renderer.autoClear = false;
renderer.setScissorTest(true);
renderer.setScissor(
0, 0,
layerYStart, layerYStart,
SPLAT_TEX_WIDTH, SPLAT_TEX_WIDTH,
layerYEnd - layerYStart, layerYEnd - layerYStart,
); );
renderer.setRenderTarget(this.target, layer);
renderer.xr.enabled = false;
renderer.autoClear = false;
renderer.render(PackedSplats.scene, PackedSplats.camera); renderer.render(PackedSplats.scene, PackedSplats.camera);
base += SPLAT_TEX_WIDTH * (layerYEnd - layerYStart); base += SPLAT_TEX_WIDTH * (layerYEnd - layerYStart);
+6 -14
View File
@@ -84,6 +84,7 @@ export class Readback {
this.target.texture.format = THREE.RGBAFormat; this.target.texture.format = THREE.RGBAFormat;
this.target.texture.type = THREE.UnsignedByteType; this.target.texture.type = THREE.UnsignedByteType;
this.target.texture.internalFormat = "RGBA8"; this.target.texture.internalFormat = "RGBA8";
this.target.scissorTest = true;
} }
} }
@@ -129,27 +130,21 @@ export class Readback {
private saveRenderState(renderer: THREE.WebGLRenderer) { private saveRenderState(renderer: THREE.WebGLRenderer) {
return { return {
xrPresenting: renderer.xr.isPresenting, xrEnabled: renderer.xr.enabled,
autoClear: renderer.autoClear, autoClear: renderer.autoClear,
scissorTest: renderer.getScissorTest(),
pixelRatio: renderer.getPixelRatio(),
}; };
} }
private resetRenderState( private resetRenderState(
renderer: THREE.WebGLRenderer, renderer: THREE.WebGLRenderer,
state: { state: {
xrPresenting: boolean; xrEnabled: boolean;
autoClear: boolean; autoClear: boolean;
scissorTest: boolean;
pixelRatio: number;
}, },
) { ) {
renderer.setRenderTarget(null); renderer.setRenderTarget(null);
renderer.setPixelRatio(state.pixelRatio); renderer.xr.enabled = state.xrEnabled;
renderer.xr.isPresenting = state.xrPresenting;
renderer.autoClear = state.autoClear; renderer.autoClear = state.autoClear;
renderer.setScissorTest(state.scissorTest);
} }
private process({ private process({
@@ -182,12 +177,10 @@ export class Readback {
material.uniforms.targetLayer.value = layer; material.uniforms.targetLayer.value = layer;
// Render the desired portion of the layer // Render the desired portion of the layer
renderer.setPixelRatio(1); this.target.scissor.set(0, 0, SPLAT_TEX_WIDTH, layerYEnd);
renderer.setRenderTarget(this.target, layer); renderer.setRenderTarget(this.target, layer);
renderer.xr.isPresenting = false; renderer.xr.enabled = false;
renderer.autoClear = false; renderer.autoClear = false;
renderer.setScissorTest(true);
renderer.setScissor(0, 0, SPLAT_TEX_WIDTH, layerYEnd);
renderer.render(Readback.scene, Readback.camera); renderer.render(Readback.scene, Readback.camera);
baseIndex += SPLAT_TEX_WIDTH * layerYEnd; baseIndex += SPLAT_TEX_WIDTH * layerYEnd;
@@ -234,7 +227,6 @@ export class Readback {
Math.ceil((this.count - layerBase) / SPLAT_TEX_WIDTH), Math.ceil((this.count - layerBase) / SPLAT_TEX_WIDTH),
); );
renderer.setPixelRatio(1);
renderer.setRenderTarget(this.target, layer); renderer.setRenderTarget(this.target, layer);
// Compute the subarray that this layer of readback corresponds to // Compute the subarray that this layer of readback corresponds to