Skip to content

Commit 4c23a83

Browse files
committed
feat: allow to render without clearing the canvas
1 parent 9753b7d commit 4c23a83

File tree

4 files changed

+15
-8
lines changed

4 files changed

+15
-8
lines changed

lib/src/core/renderTarget.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,18 @@ export function createRenderTarget(
6464
};
6565
}
6666

67-
export function setRenderTarget(gl: WebGL2RenderingContext, target: RenderTarget | null) {
67+
export function setRenderTarget(
68+
gl: WebGL2RenderingContext,
69+
target: RenderTarget | null,
70+
clear = true,
71+
) {
6872
const framebuffer = target?.framebuffer || null;
6973
const { width, height } = target || gl.canvas;
7074

7175
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
72-
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
7376
gl.viewport(0, 0, width, height);
77+
78+
if (clear) {
79+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
80+
}
7481
}

lib/src/hooks/useCompositor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ export function useCompositor(
5050

5151
const allPasses = [renderPass, ...effects];
5252

53-
function render() {
53+
function render({ clear }: { clear?: boolean } = {}) {
5454
executeBeforeRenderCallbacks();
55-
for (const pass of allPasses) {
56-
pass.render();
55+
for (const [index, pass] of allPasses.entries()) {
56+
pass.render(index === 0 ? { clear } : {});
5757
}
5858
executeAfterRenderCallbacks();
5959
}

lib/src/hooks/useRenderPass.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ export function useRenderPass<U extends Uniforms>(
117117
const [onBeforeRender, executeBeforeRenderCallbacks] = useHook<RenderCallback<U>>();
118118
const [onAfterRender, executeAfterRenderCallbacks] = useHook<RenderCallback<U>>();
119119

120-
function render({ target }: { target?: RenderTarget | null } = {}) {
120+
function render({ target, clear }: { target?: RenderTarget | null; clear?: boolean } = {}) {
121121
if (_gl == undefined) {
122122
throw new Error("The render pass must be initialized before calling the render function");
123123
}
124124

125-
setRenderTarget(_gl, target ?? _target);
125+
setRenderTarget(_gl, target ?? _target, clear);
126126
_gl.useProgram(_program);
127127

128128
if (transparent) {

lib/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface RenderTarget {
4343
}
4444

4545
export interface RenderPass<U extends Uniforms = Record<string, never>> extends Resizable {
46-
render: (opts?: { target?: RenderTarget | null }) => void;
46+
render: (opts?: { target?: RenderTarget | null; clear?: boolean }) => void;
4747
target: RenderTarget | null;
4848
setTarget: (target: RenderTarget | null) => void;
4949
uniforms: U;

0 commit comments

Comments
 (0)