Skip to content

Commit f551d84

Browse files
committed
fix(rendering): isolate planar reflection camera in legacy flow for preview
Legacy ReflectionProbeFlow was calling renderPlanarReflection() for PREVIEW cameras, which overwrites the main probe camera state and can corrupt Scene View / Game View reflections. Switch to renderPreviewPlanarReflection() and pass the isolated reflection camera through the stage and queue chain.
1 parent fdaa3fc commit f551d84

3 files changed

Lines changed: 21 additions & 16 deletions

File tree

cocos/rendering/reflection-probe/reflection-probe-flow.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,11 @@ export class ReflectionProbeFlow extends RenderFlow {
6666
for (let i = 0; i < probes.length; i++) {
6767
if (probes[i].needRender) {
6868
if (probes[i].probeType === ProbeType.PLANAR) {
69+
let reflectionCamera: Camera | undefined;
6970
if (EDITOR && camera.cameraUsage === CameraUsage.PREVIEW) {
70-
probes[i].renderPlanarReflection(camera);
71+
reflectionCamera = probes[i].renderPreviewPlanarReflection(camera);
7172
}
72-
this._renderStage(camera, probes[i]);
73+
this._renderStage(camera, probes[i], reflectionCamera);
7374
} else if (EDITOR) {
7475
this._renderStage(camera, probes[i]);
7576
}
@@ -80,12 +81,12 @@ export class ReflectionProbeFlow extends RenderFlow {
8081
public destroy (): void {
8182
super.destroy();
8283
}
83-
private _renderStage (camera: Camera, probe: ReflectionProbe): void {
84+
private _renderStage (camera: Camera, probe: ReflectionProbe, reflectionCamera?: Camera): void {
8485
for (let i = 0; i < this._stages.length; i++) {
8586
const probeStage = this._stages[i] as ReflectionProbeStage;
8687
if (probe.probeType === ProbeType.PLANAR) {
8788
cclegacy.internal.reflectionProbeManager.updatePlanarMap(probe, null);
88-
probeStage.setUsageInfo(probe, probe.realtimePlanarTexture!.window!.framebuffer);
89+
probeStage.setUsageInfo(probe, probe.realtimePlanarTexture!.window!.framebuffer, reflectionCamera);
8990
probeStage.render(camera);
9091
cclegacy.internal.reflectionProbeManager.updatePlanarMap(probe, probe.realtimePlanarTexture!.getGFXTexture());
9192
} else {

cocos/rendering/reflection-probe/reflection-probe-stage.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export class ReflectionProbeStage extends RenderStage {
5555
private _frameBuffer: Framebuffer | null = null;
5656
private _renderArea = new Rect();
5757
private _probe: ReflectionProbe | null = null;
58+
private _reflectionCamera: Camera | null = null;
5859
private _probeRenderQueue!: RenderReflectionProbeQueue;
5960
private _rgbeColor = new Vec3();
6061

@@ -68,9 +69,10 @@ export class ReflectionProbeStage extends RenderStage {
6869
* @param probe
6970
* @param frameBuffer
7071
*/
71-
public setUsageInfo (probe: ReflectionProbe, frameBuffer: Framebuffer): void {
72+
public setUsageInfo (probe: ReflectionProbe, frameBuffer: Framebuffer, reflectionCamera?: Camera): void {
7273
this._probe = probe;
7374
this._frameBuffer = frameBuffer;
75+
this._reflectionCamera = reflectionCamera ?? null;
7476
}
7577

7678
public destroy (): void {
@@ -108,8 +110,9 @@ export class ReflectionProbeStage extends RenderStage {
108110
public render (camera: Camera): void {
109111
const pipeline = this._pipeline;
110112
const cmdBuff = pipeline.commandBuffers[0];
111-
this._probeRenderQueue.gatherRenderObjects(this._probe!, camera, cmdBuff);
112-
pipeline.pipelineUBO.updateCameraUBO(this._probe!.camera);
113+
const probeCamera = this._reflectionCamera ?? this._probe!.camera;
114+
this._probeRenderQueue.gatherRenderObjects(this._probe!, camera, cmdBuff, probeCamera);
115+
pipeline.pipelineUBO.updateCameraUBO(probeCamera);
113116

114117
this._renderArea.x = 0;
115118
this._renderArea.y = 0;
@@ -118,10 +121,10 @@ export class ReflectionProbeStage extends RenderStage {
118121

119122
const renderPass = this._frameBuffer!.renderPass;
120123

121-
if (this._probe!.camera.clearFlag & ClearFlagBit.COLOR) {
122-
this._rgbeColor.x = this._probe!.camera.clearColor.x;
123-
this._rgbeColor.y = this._probe!.camera.clearColor.y;
124-
this._rgbeColor.z = this._probe!.camera.clearColor.z;
124+
if (probeCamera.clearFlag & ClearFlagBit.COLOR) {
125+
this._rgbeColor.x = probeCamera.clearColor.x;
126+
this._rgbeColor.y = probeCamera.clearColor.y;
127+
this._rgbeColor.z = probeCamera.clearColor.z;
125128
const rgbe = packRGBE(this._rgbeColor);
126129
colors[0].x = rgbe.x;
127130
colors[0].y = rgbe.y;
@@ -134,8 +137,8 @@ export class ReflectionProbeStage extends RenderStage {
134137
this._frameBuffer!,
135138
this._renderArea,
136139
colors,
137-
this._probe!.camera.clearDepth,
138-
this._probe!.camera.clearStencil,
140+
probeCamera.clearDepth,
141+
probeCamera.clearStencil,
139142
);
140143
cmdBuff.bindDescriptorSet(SetIndex.GLOBAL, pipeline.descriptorSet);
141144

cocos/rendering/render-reflection-probe-queue.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,14 @@ export class RenderReflectionProbeQueue {
7979
public constructor (pipeline: PipelineRuntime) {
8080
this._pipeline = pipeline;
8181
}
82-
public gatherRenderObjects (probe: ReflectionProbe, camera: Camera, cmdBuff: CommandBuffer): void {
82+
public gatherRenderObjects (probe: ReflectionProbe, camera: Camera, cmdBuff: CommandBuffer, reflectionCamera?: Camera): void {
8383
this.clear();
8484
const scene = camera.scene!;
8585
const sceneData = this._pipeline.pipelineSceneData;
8686
const skybox = sceneData.skybox;
87+
const probeCamera = reflectionCamera ?? probe.camera;
8788

88-
if (skybox.enabled && skybox.model && (probe.camera.clearFlag & SkyBoxFlagValue.VALUE)) {
89+
if (skybox.enabled && skybox.model && (probeCamera.clearFlag & SkyBoxFlagValue.VALUE)) {
8990
this.add(skybox.model);
9091
}
9192

@@ -105,7 +106,7 @@ export class RenderReflectionProbeQueue {
105106
if (geometry.intersect.aabbWithAABB(model.worldBounds, probe.boundingBox!)) {
106107
this.add(model);
107108
}
108-
} else if (geometry.intersect.aabbFrustum(model.worldBounds, probe.camera.frustum)) {
109+
} else if (geometry.intersect.aabbFrustum(model.worldBounds, probeCamera.frustum)) {
109110
this.add(model);
110111
}
111112
}

0 commit comments

Comments
 (0)