Skip to content

Commit 086f899

Browse files
committed
feat: allow to scale the render target of an effect pass
1 parent 6518243 commit 086f899

File tree

4 files changed

+44
-11
lines changed

4 files changed

+44
-11
lines changed

lib/src/core/renderTarget.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import type { RenderTarget } from "../types";
22
import type { DataTextureParams } from "./texture";
33
import { fillTexture } from "./texture";
44

5+
export type RenderTargetParams = Partial<Omit<DataTextureParams, "data">>;
6+
57
export function createRenderTarget(
68
gl: WebGL2RenderingContext,
7-
params?: Omit<DataTextureParams, "data">,
9+
params?: RenderTargetParams,
810
): RenderTarget {
911
let _width = params?.width ?? gl.canvas.width;
1012
let _height = params?.height ?? gl.canvas.height;
@@ -14,10 +16,10 @@ export function createRenderTarget(
1416
let _texture = gl.createTexture()!;
1517
fillTexture(gl, _texture, {
1618
data: null,
17-
...params,
1819
width: _width,
1920
height: _height,
2021
generateMipmaps: false,
22+
...params,
2123
});
2224

2325
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
@@ -38,7 +40,6 @@ export function createRenderTarget(
3840
});
3941

4042
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
41-
gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, width, height);
4243
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, newTexture, 0);
4344

4445
gl.bindFramebuffer(gl.FRAMEBUFFER, null);

lib/src/hooks/useEffectPass.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,42 @@
1+
import type { RenderTargetParams } from "../core/renderTarget";
2+
import { createRenderTarget } from "../core/renderTarget";
13
import type { EffectPass, EffectUniforms } from "../types";
24
import type { QuadPassOptions } from "./useQuadRenderPass";
35
import { useQuadRenderPass } from "./useQuadRenderPass";
46

7+
type EffectPassOptions<U extends EffectUniforms> = Omit<QuadPassOptions<U>, "target"> & {
8+
/**
9+
* Allow to scale the render target texture based on size given to the pass.
10+
*/
11+
resolutionScale?: number;
12+
/**
13+
* Params to create the render target of the pass.
14+
*/
15+
target?: RenderTargetParams | null;
16+
};
17+
518
export function useEffectPass<U extends EffectUniforms>(
6-
options: QuadPassOptions<U>,
19+
options: EffectPassOptions<U>,
720
): EffectPass<U> {
8-
return useQuadRenderPass(undefined, options);
21+
const { target, resolutionScale = 1 } = options;
22+
23+
const renderPass = useQuadRenderPass(undefined, { ...options, target: null });
24+
25+
const renderPassSetSize = renderPass.setSize;
26+
renderPass.setSize = function ({ width, height }) {
27+
renderPassSetSize({
28+
width: Math.ceil(width * resolutionScale),
29+
height: Math.ceil(height * resolutionScale),
30+
});
31+
};
32+
33+
const renderPassInitialize = renderPass.initialize;
34+
renderPass.initialize = function (gl) {
35+
if (target != null && !("framebuffer" in target)) {
36+
renderPass.setTarget(createRenderTarget(gl, target));
37+
}
38+
renderPassInitialize(gl);
39+
};
40+
41+
return renderPass;
942
}

lib/src/hooks/useQuadRenderPass.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,12 @@ export function useQuadRenderPass<U extends Uniforms>(
4242
}
4343

4444
const quadVertexShaderSource = /*glsl*/ `#version 300 es
45-
4645
in vec2 aPosition;
4746
out vec2 vUv;
4847
4948
void main() {
50-
gl_Position = vec4(aPosition, 0.0, 1.0);
51-
vUv = (aPosition + 1.0) / 2.0;
49+
gl_Position = vec4(aPosition, 0.0, 1.0);
50+
vUv = (aPosition + 1.0) / 2.0;
5251
}
5352
`;
5453

lib/src/hooks/useRenderPass.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export function useRenderPass<U extends Uniforms>(
3737
transformFeedbackVaryings,
3838
}: RenderPassOptions<U>,
3939
): RenderPass<U> {
40-
/**
40+
/*
4141
* INIT
4242
*/
4343

@@ -77,7 +77,7 @@ export function useRenderPass<U extends Uniforms>(
7777
initialize(gl);
7878
}
7979

80-
/**
80+
/*
8181
* UPDATE
8282
*/
8383

@@ -96,7 +96,7 @@ export function useRenderPass<U extends Uniforms>(
9696
_target = target;
9797
}
9898

99-
/**
99+
/*
100100
* RENDER
101101
*/
102102

0 commit comments

Comments
 (0)