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