This commit is contained in:
colinrubow 2026-06-21 02:04:40 +00:00 committed by GitHub
commit 3d375679cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 38 additions and 4 deletions

View file

@ -352,11 +352,17 @@ class OpenGLRenderer(Renderer, RendererProtocol):
gl.ONE,
)
def enable_depth(sub):
def enable_depth(sub) -> bool:
if sub.depth_test:
self.ctx.enable(gl.DEPTH_TEST)
if (sub.has_fill() and sub.get_fill_opacity() != 1.0) or (
sub.has_stroke() and sub.get_stroke_opacity() != 1.0
):
self.render_target_fbo.depth_mask = False
return True
else:
self.ctx.disable(gl.DEPTH_TEST)
return False
for sub in mob.family_members_with_points():
# TODO: review this renderer data optimization attempt
@ -382,7 +388,7 @@ class OpenGLRenderer(Renderer, RendererProtocol):
for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
uniforms["index"] = (counter + 1) / num_mobs / 2
uniforms["disable_stencil"] = float(True)
@ -399,11 +405,13 @@ class OpenGLRenderer(Renderer, RendererProtocol):
GLVMobjectManager.get_stroke_shader_data(sub),
np.array(range(len(sub.points))),
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True
for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
# uniforms['z_shift'] = counter/9
uniforms["index"] = (counter + 1) / num_mobs
@ -420,11 +428,13 @@ class OpenGLRenderer(Renderer, RendererProtocol):
GLVMobjectManager.get_fill_shader_data(sub),
sub.renderer_data.vert_indices,
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True
for counter, sub in enumerate(family):
if not isinstance(sub.renderer_data, GLRenderData):
return
enable_depth(sub)
reenable_depth_mask = enable_depth(sub)
uniforms = {}
uniforms["index"] = (counter + 1) / num_mobs
uniforms["disable_stencil"] = float(False)
@ -441,6 +451,8 @@ class OpenGLRenderer(Renderer, RendererProtocol):
GLVMobjectManager.get_stroke_shader_data(sub),
np.array(range(len(sub.points))),
)
if reenable_depth_mask:
self.render_target_fbo.depth_mask = True
def get_pixels(self) -> PixelArray:
raw = self.output_fbo.read(components=4, dtype="f1", clamp=True) # RGBA, floats

View file

@ -3,6 +3,8 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, Protocol, runtime_checkable
import numpy as np
from manim._config import logger
from manim.mobject.mobject import InvisibleMobject
from manim.mobject.opengl.opengl_mobject import OpenGLMobject
@ -35,8 +37,28 @@ class Renderer(ABC):
def render(self, state: SceneState) -> None:
self.pre_render(state.camera)
# seperate depth testing mobjects and otherwise
depth_testing: list[OpenGLVMobject] = []
non_depth_testing: list[OpenGLVMobject] = []
for mob in state.mobjects:
if mob.depth_test:
depth_testing.append(mob)
else:
non_depth_testing.append(mob)
# sort depth testing mobjects according to center distance from camera
depth_testing.sort(
key=lambda m: np.linalg.norm(
m.get_center() - state.camera.get_implied_camera_location()
),
reverse=True,
)
# render depth testing mobs followed by otherwise
for mob in depth_testing:
self.render_mobject(mob)
for mob in non_depth_testing:
self.render_mobject(mob)
self.post_render()
def render_mobject(self, mob: OpenGLMobject) -> None: