Optimize water reflection rendering with time-based updates
This commit is contained in:
@@ -3055,6 +3055,7 @@ export class ViewportHost {
|
||||
}
|
||||
|
||||
const reflectionMode = this.getWaterReflectionMode();
|
||||
const now = performance.now();
|
||||
|
||||
for (const binding of this.viewportWaterSurfaceBindings) {
|
||||
if (
|
||||
@@ -3085,6 +3086,11 @@ export class ViewportHost {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (binding.reflectionTextureUniform.value !== null && now - binding.lastReflectionUpdateTime < WATER_REFLECTION_UPDATE_INTERVAL_MS) {
|
||||
binding.reflectionEnabledUniform.value = 0.36;
|
||||
continue;
|
||||
}
|
||||
|
||||
const hiddenObjects: Array<{ object: Object3D; visible: boolean }> = [];
|
||||
const hideObject = (object: Object3D | null | undefined) => {
|
||||
if (object === null || object === undefined) {
|
||||
@@ -3131,19 +3137,23 @@ export class ViewportHost {
|
||||
|
||||
const previousAutoClear = this.renderer.autoClear;
|
||||
const previousRenderTarget = this.renderer.getRenderTarget();
|
||||
this.renderer.autoClear = true;
|
||||
this.renderer.setRenderTarget(binding.reflectionRenderTarget);
|
||||
this.renderer.clear();
|
||||
this.renderer.render(this.scene, this.waterReflectionCamera);
|
||||
this.renderer.setRenderTarget(previousRenderTarget);
|
||||
this.renderer.autoClear = previousAutoClear;
|
||||
try {
|
||||
this.renderer.autoClear = true;
|
||||
this.renderer.setRenderTarget(binding.reflectionRenderTarget);
|
||||
this.renderer.clear();
|
||||
this.renderer.render(this.scene, this.waterReflectionCamera);
|
||||
} finally {
|
||||
this.renderer.setRenderTarget(previousRenderTarget);
|
||||
this.renderer.autoClear = previousAutoClear;
|
||||
|
||||
for (const hiddenObject of hiddenObjects) {
|
||||
hiddenObject.object.visible = hiddenObject.visible;
|
||||
for (const hiddenObject of hiddenObjects) {
|
||||
hiddenObject.object.visible = hiddenObject.visible;
|
||||
}
|
||||
}
|
||||
|
||||
binding.reflectionTextureUniform.value = binding.reflectionRenderTarget.texture;
|
||||
binding.reflectionEnabledUniform.value = 0.36;
|
||||
binding.lastReflectionUpdateTime = now;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user