Skip to content

Commit 199cfc3

Browse files
committed
fix: fix msaa
1 parent e9576aa commit 199cfc3

File tree

6 files changed

+48
-76
lines changed

6 files changed

+48
-76
lines changed

manim3/rendering/framebuffers/framebuffer.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ def __init__(
6565
)
6666
self._flag: ContextFlag = flag
6767

68+
def get_attachment(
69+
self: Self,
70+
name: str
71+
) -> moderngl.Texture:
72+
return self._named_attachments[name]
73+
6874
def clear(
6975
self: Self,
7076
color: tuple[float, float, float, float] | None = None
@@ -94,12 +100,3 @@ def render(
94100
Toplevel._get_context().set_blendings(self._blendings)
95101
Toplevel._get_context().set_flag(self._flag)
96102
vertex_array_info.vertex_array.render()
97-
98-
def copy_from(
99-
self: Self,
100-
framebuffer: Framebuffer
101-
) -> None:
102-
Toplevel._get_context().copy_framebuffer(
103-
dst=self._framebuffer,
104-
src=framebuffer._framebuffer
105-
)

manim3/rendering/framebuffers/oit_framebuffer.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,3 @@ def __init__(
4343
samples=samples,
4444
flag=ContextFlag.BLEND
4545
)
46-
47-
@property
48-
def accum_attachment(
49-
self: Self
50-
) -> moderngl.Texture:
51-
return self._named_attachments["accum"]
52-
53-
@property
54-
def revealage_attachment(
55-
self: Self
56-
) -> moderngl.Texture:
57-
return self._named_attachments["revealage"]

manim3/shaders/oit_compose.glsl

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1+
#if MSAA_SAMPLES
2+
uniform sampler2DMS t_accum_map;
3+
uniform sampler2DMS t_revealage_map;
4+
#else
15
uniform sampler2D t_accum_map;
26
uniform sampler2D t_revealage_map;
7+
#endif
38

49

510
/***********************/
611
#if defined VERTEX_SHADER
712
/***********************/
813

914

10-
in vec3 in_position;
11-
in vec2 in_uv;
12-
13-
out VS_FS {
14-
vec2 uv;
15-
} vs_out;
15+
in vec2 in_coordinates;
1616

1717

1818
void main() {
19-
vs_out.uv = in_uv;
20-
gl_Position = vec4(in_position, 1.0);
19+
gl_Position = vec4(in_coordinates, 0.0, 1.0);
2120
}
2221

2322

@@ -26,24 +25,30 @@ void main() {
2625
/***************************/
2726

2827

29-
in VS_FS {
30-
vec2 uv;
31-
} fs_in;
28+
layout (pixel_center_integer) in vec4 gl_FragCoord;
3229

3330
out vec4 frag_color;
3431

3532

33+
vec4 get_frag_color(vec4 accum, float revealage) {
34+
return accum.a == 0.0 || revealage == 0.0 ? vec4(0.0) : vec4(accum.rgb / accum.a, isinf(revealage) ? 1.0 : 1.0 - exp2(revealage));
35+
}
36+
37+
3638
void main() {
3739
// Inspired from `https://casual-effects.blogspot.com/2015/03/implemented-weighted-blended-order.html`.
3840
// `accum = sum(w * a * rgb, w * a)`
3941
// `revealage = sum(w * log2(1 - a))`
40-
float revealage = texture(t_revealage_map, fs_in.uv).x;
41-
if (revealage == 0.0) {
42-
// Save the blending and color texture fetch cost.
43-
discard;
42+
ivec2 coords = ivec2(gl_FragCoord);
43+
#if MSAA_SAMPLES
44+
frag_color = vec4(0.0);
45+
for (int i = 0; i < MSAA_SAMPLES; ++i) {
46+
frag_color += get_frag_color(texelFetch(t_accum_map, coords, i), texelFetch(t_revealage_map, coords, i).x);
4447
}
45-
vec4 accum = texture(t_accum_map, fs_in.uv);
46-
frag_color = vec4(accum.rgb / accum.a, 1.0 - exp2(revealage));
48+
frag_color /= MSAA_SAMPLES;
49+
#else
50+
frag_color = get_frag_color(texelFetch(t_accum_map, coords, 0), texelFetch(t_revealage_map, coords, 0).x);
51+
#endif
4752
}
4853

4954

manim3/toplevel/context.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,6 @@ def scope(
156156
uniform_buffers=uniform_buffers
157157
)
158158

159-
def copy_framebuffer(
160-
self: Self,
161-
*,
162-
dst: moderngl.Framebuffer,
163-
src: moderngl.Framebuffer
164-
) -> None:
165-
self._mgl_context.copy_framebuffer(
166-
dst=dst,
167-
src=src
168-
)
169-
170159
def blit_framebuffer(
171160
self: Self,
172161
*,

manim3/toplevel/renderer.py

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,8 @@ def record_frame(
223223

224224
class Renderer(ToplevelResource):
225225
__slots__ = (
226-
"_use_msaa",
227226
"_final_framebuffer",
228227
"_oit_framebuffer",
229-
"_oit_msaa_framebuffer",
230228
"_oit_compose_vertex_array",
231229
"_livestreamer",
232230
"_video_recorder",
@@ -239,50 +237,42 @@ def __init__(
239237
super().__init__()
240238

241239
msaa_samples = Toplevel._get_config().msaa_samples
242-
use_msaa = bool(msaa_samples)
243240
final_framebuffer = FinalFramebuffer()
244-
oit_framebuffer = OITFramebuffer()
245-
oit_msaa_framebuffer = OITFramebuffer(samples=msaa_samples) if use_msaa else oit_framebuffer
241+
oit_framebuffer = OITFramebuffer(samples=msaa_samples)
246242
oit_compose_vertex_array = VertexArray(
247243
shader_filename="oit_compose.glsl",
244+
custom_macros=(
245+
f"#define MSAA_SAMPLES {msaa_samples}",
246+
),
248247
texture_buffers=(
249248
TextureBuffer(
250249
name="t_accum_map",
251-
textures=oit_framebuffer.accum_attachment
250+
textures=oit_framebuffer.get_attachment("accum")
252251
),
253252
TextureBuffer(
254253
name="t_revealage_map",
255-
textures=oit_framebuffer.revealage_attachment
254+
textures=oit_framebuffer.get_attachment("revealage")
256255
)
257256
),
258257
attributes_buffer=AttributesBuffer(
259258
field_declarations=(
260-
"vec3 in_position",
261-
"vec2 in_uv"
259+
"vec2 in_coordinates",
262260
),
263261
data_dict={
264-
"in_position": np.array((
265-
(-1.0, -1.0, 0.0),
266-
(1.0, -1.0, 0.0),
267-
(1.0, 1.0, 0.0),
268-
(-1.0, 1.0, 0.0)
269-
)),
270-
"in_uv": np.array((
271-
(0.0, 0.0),
272-
(1.0, 0.0),
262+
"in_coordinates": np.array((
263+
(-1.0, -1.0),
264+
(1.0, -1.0),
273265
(1.0, 1.0),
274-
(0.0, 1.0)
266+
(-1.0, 1.0)
275267
))
276268
},
277269
primitive_mode=PrimitiveMode.TRIANGLE_FAN,
278270
vertices_count=4
279271
)
280272
)
281273

282-
self._use_msaa: bool = use_msaa
283274
self._final_framebuffer: FinalFramebuffer = final_framebuffer
284275
self._oit_framebuffer: OITFramebuffer = oit_framebuffer
285-
self._oit_msaa_framebuffer: OITFramebuffer = oit_msaa_framebuffer
286276
self._oit_compose_vertex_array: VertexArray = oit_compose_vertex_array
287277
self._livestreamer: Livestreamer = Livestreamer()
288278
self._video_recorder: VideoRecorder = VideoRecorder()
@@ -302,12 +292,10 @@ def _render_frame(
302292
) -> None:
303293
scene = Toplevel._get_scene()
304294

305-
self._oit_msaa_framebuffer.clear()
295+
self._oit_framebuffer.clear()
306296
for mobject in scene._root_mobject.iter_descendants():
307297
for vertex_array in mobject._iter_vertex_arrays():
308-
self._oit_msaa_framebuffer.render(vertex_array)
309-
if self._use_msaa:
310-
self._oit_framebuffer.copy_from(self._oit_msaa_framebuffer) # TODO: resolve in final fbo, using sampler2DMS, texelFetch.
298+
self._oit_framebuffer.render(vertex_array)
311299

312300
self._final_framebuffer.clear(color=(*scene._background_color, scene._background_opacity))
313301
self._final_framebuffer.render(self._oit_compose_vertex_array)

pyproject.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@ classifiers = [
1616
"Programming Language :: Python"
1717
]
1818
dependencies = [
19+
"attrs",
20+
"cairocffi",
1921
"colour",
22+
"ffmpeg-python",
2023
"mapbox-earcut",
2124
"moderngl",
2225
"numpy",
26+
"pangocairocffi",
27+
"pangocffi",
2328
"pillow",
29+
"pyclipr",
2430
"pyglet",
25-
"pyopengl",
31+
"rich",
2632
"scipy",
27-
"shapely",
2833
"svgelements"
2934
]

0 commit comments

Comments
 (0)