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.type = THREE.UnsignedIntType;
this.target.texture.internalFormat = "RGBA32UI";
this.target.scissorTest = true;
return true;
}
@@ -503,27 +504,21 @@ export class PackedSplats {
private saveRenderState(renderer: THREE.WebGLRenderer) {
return {
xrPresenting: renderer.xr.isPresenting,
xrEnabled: renderer.xr.enabled,
autoClear: renderer.autoClear,
scissorTest: renderer.getScissorTest(),
pixelRatio: renderer.getPixelRatio(),
};
}
private resetRenderState(
renderer: THREE.WebGLRenderer,
state: {
xrPresenting: boolean;
xrEnabled: boolean;
autoClear: boolean;
scissorTest: boolean;
pixelRatio: number;
},
) {
renderer.setRenderTarget(null);
renderer.setPixelRatio(state.pixelRatio);
renderer.xr.isPresenting = state.xrPresenting;
renderer.xr.enabled = state.xrEnabled;
renderer.autoClear = state.autoClear;
renderer.setScissorTest(state.scissorTest);
}
// 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
renderer.setPixelRatio(1);
renderer.setRenderTarget(this.target, layer);
renderer.xr.isPresenting = false;
renderer.autoClear = false;
renderer.setScissorTest(true);
renderer.setScissor(
this.target.scissor.set(
0,
layerYStart,
SPLAT_TEX_WIDTH,
layerYEnd - layerYStart,
);
renderer.setRenderTarget(this.target, layer);
renderer.xr.enabled = false;
renderer.autoClear = false;
renderer.render(PackedSplats.scene, PackedSplats.camera);
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.type = THREE.UnsignedByteType;
this.target.texture.internalFormat = "RGBA8";
this.target.scissorTest = true;
}
}
@@ -129,27 +130,21 @@ export class Readback {
private saveRenderState(renderer: THREE.WebGLRenderer) {
return {
xrPresenting: renderer.xr.isPresenting,
xrEnabled: renderer.xr.enabled,
autoClear: renderer.autoClear,
scissorTest: renderer.getScissorTest(),
pixelRatio: renderer.getPixelRatio(),
};
}
private resetRenderState(
renderer: THREE.WebGLRenderer,
state: {
xrPresenting: boolean;
xrEnabled: boolean;
autoClear: boolean;
scissorTest: boolean;
pixelRatio: number;
},
) {
renderer.setRenderTarget(null);
renderer.setPixelRatio(state.pixelRatio);
renderer.xr.isPresenting = state.xrPresenting;
renderer.xr.enabled = state.xrEnabled;
renderer.autoClear = state.autoClear;
renderer.setScissorTest(state.scissorTest);
}
private process({
@@ -182,12 +177,10 @@ export class Readback {
material.uniforms.targetLayer.value = 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.xr.isPresenting = false;
renderer.xr.enabled = false;
renderer.autoClear = false;
renderer.setScissorTest(true);
renderer.setScissor(0, 0, SPLAT_TEX_WIDTH, layerYEnd);
renderer.render(Readback.scene, Readback.camera);
baseIndex += SPLAT_TEX_WIDTH * layerYEnd;
@@ -234,7 +227,6 @@ export class Readback {
Math.ceil((this.count - layerBase) / SPLAT_TEX_WIDTH),
);
renderer.setPixelRatio(1);
renderer.setRenderTarget(this.target, layer);
// Compute the subarray that this layer of readback corresponds to