-
-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix clear flag of internal render target #2444
Changes from 8 commits
e252e1b
26b9060
e3197ff
3a03f44
51dda0f
a7e8f9d
9b6d01b
5904f62
680d378
4c630df
0968bca
1aba368
89a163f
fc8bc87
862db67
549e0a9
b07f64c
c45b295
5d4e3f7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/** | ||
* @title Multi camera no clear | ||
* @category Advance | ||
*/ | ||
import { | ||
BlinnPhongMaterial, | ||
Camera, | ||
CameraClearFlags, | ||
Color, | ||
Engine, | ||
Layer, | ||
Logger, | ||
MeshRenderer, | ||
PrimitiveMesh, | ||
Scene, | ||
WebGLEngine | ||
} from "@galacean/engine"; | ||
import { initScreenshot, updateForE2E } from "./.mockForE2E"; | ||
|
||
Logger.enable(); | ||
WebGLEngine.create({ canvas: "canvas" }).then((engine) => { | ||
engine.canvas.resizeByClientSize(); | ||
|
||
initFirstScene(engine); | ||
engine.run(); | ||
}); | ||
|
||
function initFirstScene(engine: Engine): Scene { | ||
const scene = engine.sceneManager.scenes[0]; | ||
const rootEntity = scene.createRootEntity(); | ||
|
||
// Create full screen camera | ||
const cameraEntity = rootEntity.createChild("fullscreen-camera"); | ||
const camera = cameraEntity.addComponent(Camera); | ||
camera.cullingMask = Layer.Layer0; | ||
cameraEntity.transform.setPosition(0, 0, 20); | ||
|
||
// Create cube | ||
const cubeEntity = rootEntity.createChild("cube"); | ||
cubeEntity.transform.setPosition(-3, 0, 3); | ||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||
renderer.mesh = PrimitiveMesh.createSphere(engine, 2, 24); | ||
const material = new BlinnPhongMaterial(engine); | ||
material.baseColor = new Color(1, 0, 0, 1); | ||
renderer.setMaterial(material); | ||
|
||
{ | ||
const cameraEntity = rootEntity.createChild("window-camera"); | ||
const camera2 = cameraEntity.addComponent(Camera); | ||
camera2.cullingMask = Layer.Layer1; | ||
camera2.enablePostProcess = true; | ||
camera2.enableHDR = true; | ||
camera2.clearFlags = CameraClearFlags.None; | ||
// camera.msaaSamples = 4; | ||
|
||
// @ts-ignore | ||
const bloomEffect = scene._postProcessManager._bloomEffect; | ||
// @ts-ignore | ||
const tonemappingEffect = scene._postProcessManager._tonemappingEffect; | ||
GuoLei1990 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
bloomEffect.enabled = true; | ||
tonemappingEffect.enabled = true; | ||
bloomEffect.threshold = 0.1; | ||
bloomEffect.intensity = 2; | ||
cameraEntity.transform.setPosition(0, 0, 20); | ||
|
||
// Create cube | ||
const cubeEntity = rootEntity.createChild("cube"); | ||
cubeEntity.layer = Layer.Layer1; | ||
cubeEntity.transform.setPosition(-2, 0, 3); | ||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||
renderer.mesh = PrimitiveMesh.createSphere(engine, 2, 24); | ||
const material = new BlinnPhongMaterial(engine); | ||
material.baseColor = new Color(1, 0, 0, 1); | ||
material.emissiveColor.set(1, 0, 0, 1); | ||
renderer.setMaterial(material); | ||
|
||
updateForE2E(engine); | ||
initScreenshot(engine, [camera, camera2]); | ||
} | ||
|
||
return scene; | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,85 @@ | ||||||||||||||||||||||||
/** | ||||||||||||||||||||||||
* @title Multi scene clear | ||||||||||||||||||||||||
* @category Advance | ||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||
import { | ||||||||||||||||||||||||
BlinnPhongMaterial, | ||||||||||||||||||||||||
Camera, | ||||||||||||||||||||||||
CameraClearFlags, | ||||||||||||||||||||||||
Color, | ||||||||||||||||||||||||
Engine, | ||||||||||||||||||||||||
Logger, | ||||||||||||||||||||||||
MeshRenderer, | ||||||||||||||||||||||||
PrimitiveMesh, | ||||||||||||||||||||||||
Scene, | ||||||||||||||||||||||||
WebGLEngine | ||||||||||||||||||||||||
} from "@galacean/engine"; | ||||||||||||||||||||||||
import { initScreenshot, updateForE2E } from "./.mockForE2E"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Logger.enable(); | ||||||||||||||||||||||||
WebGLEngine.create({ canvas: "canvas" }).then((engine) => { | ||||||||||||||||||||||||
engine.canvas.resizeByClientSize(); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const firstCamera = initFirstScene(engine); | ||||||||||||||||||||||||
const secondCamera = initSecondScene(engine); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
updateForE2E(engine); | ||||||||||||||||||||||||
initScreenshot(engine, [firstCamera, secondCamera]); | ||||||||||||||||||||||||
// initScreenshot(engine, [secondCamera, firstCamera]); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
function initFirstScene(engine: Engine): Camera { | ||||||||||||||||||||||||
const scene = engine.sceneManager.scenes[0]; | ||||||||||||||||||||||||
const rootEntity = scene.createRootEntity(); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Create full screen camera | ||||||||||||||||||||||||
const cameraEntity = rootEntity.createChild("fullscreen-camera"); | ||||||||||||||||||||||||
const camera = cameraEntity.addComponent(Camera); | ||||||||||||||||||||||||
cameraEntity.transform.setPosition(0, 0, 20); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Create cube | ||||||||||||||||||||||||
const cubeEntity = rootEntity.createChild("cube"); | ||||||||||||||||||||||||
cubeEntity.transform.setPosition(-2, 0, 3); | ||||||||||||||||||||||||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||||||||||||||||||||||||
renderer.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2); | ||||||||||||||||||||||||
const material = new BlinnPhongMaterial(engine); | ||||||||||||||||||||||||
material.baseColor = new Color(1, 0, 0, 1); | ||||||||||||||||||||||||
renderer.setMaterial(material); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
return camera; | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
function initSecondScene(engine: Engine): Camera { | ||||||||||||||||||||||||
// Init window camera | ||||||||||||||||||||||||
const scene = new Scene(engine); | ||||||||||||||||||||||||
engine.sceneManager.addScene(scene); | ||||||||||||||||||||||||
const rootEntity = scene.createRootEntity(); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const cameraEntity = rootEntity.createChild("window-camera"); | ||||||||||||||||||||||||
const camera = cameraEntity.addComponent(Camera); | ||||||||||||||||||||||||
camera.enablePostProcess = true; | ||||||||||||||||||||||||
// camera.clearFlags = CameraClearFlags.None; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// @ts-ignore | ||||||||||||||||||||||||
const bloomEffect = scene._postProcessManager._bloomEffect; | ||||||||||||||||||||||||
// @ts-ignore | ||||||||||||||||||||||||
const tonemappingEffect = scene._postProcessManager._tonemappingEffect; | ||||||||||||||||||||||||
Comment on lines
+63
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid direct access to internal post-process manager properties. Using @ts-ignore to access internal properties is risky and could break with future engine updates. Consider adding proper public APIs for accessing these effects if they're needed for testing. Consider one of these approaches:
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
bloomEffect.enabled = true; | ||||||||||||||||||||||||
tonemappingEffect.enabled = true; | ||||||||||||||||||||||||
bloomEffect.threshold = 0.1; | ||||||||||||||||||||||||
bloomEffect.intensity = 2; | ||||||||||||||||||||||||
Comment on lines
+68
to
+71
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for post-processing effects. The code assumes the effects exist and are enabled successfully. Consider adding checks to validate the effects are available and properly initialized. +if (!bloomEffect || !tonemappingEffect) {
+ throw new Error("Required post-processing effects are not available");
+}
bloomEffect.enabled = true;
tonemappingEffect.enabled = true;
bloomEffect.threshold = 0.1;
bloomEffect.intensity = 2; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||
cameraEntity.transform.setPosition(0, 0, 20); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Create cube | ||||||||||||||||||||||||
const cubeEntity = rootEntity.createChild("cube"); | ||||||||||||||||||||||||
cubeEntity.transform.setPosition(2, 0, 3); | ||||||||||||||||||||||||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||||||||||||||||||||||||
renderer.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2); | ||||||||||||||||||||||||
const material = new BlinnPhongMaterial(engine); | ||||||||||||||||||||||||
material.baseColor = new Color(1, 0, 0, 1); | ||||||||||||||||||||||||
material.emissiveColor.set(1, 0, 0, 1); | ||||||||||||||||||||||||
renderer.setMaterial(material); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
return camera; | ||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
/** | ||
* @title Multi scene no clear | ||
* @category Advance | ||
*/ | ||
import { | ||
BlinnPhongMaterial, | ||
Camera, | ||
CameraClearFlags, | ||
Color, | ||
Engine, | ||
Logger, | ||
MeshRenderer, | ||
PrimitiveMesh, | ||
Scene, | ||
WebGLEngine | ||
} from "@galacean/engine"; | ||
import { initScreenshot, updateForE2E } from "./.mockForE2E"; | ||
|
||
Logger.enable(); | ||
WebGLEngine.create({ canvas: "canvas" }).then((engine) => { | ||
engine.canvas.resizeByClientSize(); | ||
|
||
const firstCamera = initFirstScene(engine); | ||
const secondCamera = initSecondScene(engine); | ||
|
||
updateForE2E(engine); | ||
initScreenshot(engine, [firstCamera, secondCamera]); | ||
// initScreenshot(engine, [secondCamera, firstCamera]); | ||
}); | ||
|
||
function initFirstScene(engine: Engine): Camera { | ||
const scene = engine.sceneManager.scenes[0]; | ||
const rootEntity = scene.createRootEntity(); | ||
|
||
// Create full screen camera | ||
const cameraEntity = rootEntity.createChild("fullscreen-camera"); | ||
const camera = cameraEntity.addComponent(Camera); | ||
cameraEntity.transform.setPosition(0, 0, 20); | ||
|
||
// Create cube | ||
const cubeEntity = rootEntity.createChild("cube"); | ||
cubeEntity.transform.setPosition(-2, 0, 3); | ||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||
renderer.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2); | ||
const material = new BlinnPhongMaterial(engine); | ||
material.baseColor = new Color(1, 0, 0, 1); | ||
renderer.setMaterial(material); | ||
|
||
return camera; | ||
} | ||
|
||
function initSecondScene(engine: Engine): Camera { | ||
// Init window camera | ||
const scene = new Scene(engine); | ||
engine.sceneManager.addScene(scene); | ||
const rootEntity = scene.createRootEntity(); | ||
|
||
const cameraEntity = rootEntity.createChild("window-camera"); | ||
const camera = cameraEntity.addComponent(Camera); | ||
camera.enablePostProcess = true; | ||
camera.clearFlags = CameraClearFlags.None; | ||
|
||
// @ts-ignore | ||
const bloomEffect = scene._postProcessManager._bloomEffect; | ||
// @ts-ignore | ||
const tonemappingEffect = scene._postProcessManager._tonemappingEffect; | ||
Comment on lines
+69
to
+72
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid accessing internal properties with @ts-ignore. Direct access to internal properties ( Consider:
|
||
|
||
bloomEffect.enabled = true; | ||
tonemappingEffect.enabled = true; | ||
bloomEffect.threshold = 0.1; | ||
bloomEffect.intensity = 2; | ||
cameraEntity.transform.setPosition(0, 0, 20); | ||
|
||
// Create cube | ||
const cubeEntity = rootEntity.createChild("cube"); | ||
cubeEntity.transform.setPosition(2, 0, 3); | ||
const renderer = cubeEntity.addComponent(MeshRenderer); | ||
renderer.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2); | ||
const material = new BlinnPhongMaterial(engine); | ||
material.baseColor = new Color(1, 0, 0, 1); | ||
material.emissiveColor.set(1, 0, 0, 1); | ||
renderer.setMaterial(material); | ||
|
||
return camera; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add error handling and cleanup
The engine creation promise lacks error handling and resource cleanup. Consider adding: