A little refactoring and performance improvement

This commit is contained in:
Grant Sanderson 2020-06-28 12:14:46 -07:00
parent 8af879236e
commit 279f66ceaf
2 changed files with 36 additions and 27 deletions

View file

@ -167,6 +167,7 @@ class Camera(object):
self.init_shaders() self.init_shaders()
self.init_textures() self.init_textures()
self.init_light_source() self.init_light_source()
self.refresh_perspective_uniforms()
self.static_mobjects_to_shader_info_list = {} self.static_mobjects_to_shader_info_list = {}
def init_frame(self): def init_frame(self):
@ -328,42 +329,48 @@ class Camera(object):
self.render(shader_info) self.render(shader_info)
def render(self, shader_info): def render(self, shader_info):
shader, vert_format = self.get_shader(shader_info) cached_buffers = "render_group" in shader_info
if shader is None: if cached_buffers:
return vbo, vao, shader = shader_info["render_group"]
else:
vbo, vao, shader = self.get_render_group(shader_info)
self.set_shader_uniforms(shader, shader_info)
if shader_info["depth_test"]: if shader_info["depth_test"]:
self.ctx.enable(moderngl.DEPTH_TEST) self.ctx.enable(moderngl.DEPTH_TEST)
else: else:
self.ctx.disable(moderngl.DEPTH_TEST) self.ctx.disable(moderngl.DEPTH_TEST)
if "vbo" in shader_info: vao.render(int(shader_info["render_primative"]))
vbo = shader_info["vbo"]
else:
raw_data = shader_info["raw_data"]
vbo = self.ctx.buffer(raw_data)
if not cached_buffers:
vbo.release()
vao.release()
def get_render_group(self, shader_info):
shader, vert_format = self.get_shader(shader_info)
vbo = self.ctx.buffer(shader_info["raw_data"])
vao = self.ctx.vertex_array( vao = self.ctx.vertex_array(
program=shader, program=shader,
content=[(vbo, vert_format, *shader_info["attributes"])] content=[(vbo, vert_format, *shader_info["attributes"])]
) )
vao.render(int(shader_info["render_primative"])) return (vbo, vao, shader)
vao.release()
if "vbo" not in shader_info:
vbo.release()
def set_mobjects_as_static(self, *mobjects): def set_mobjects_as_static(self, *mobjects):
# Create vbo's holding each mobjects shader data # Create buffer and array objects holding each mobjects shader data
for mob in mobjects: for mob in mobjects:
info_list = mob.get_shader_info_list() info_list = mob.get_shader_info_list()
for info in info_list: for info in info_list:
info["vbo"] = self.ctx.buffer(info["raw_data"]) info["render_group"] = self.get_render_group(info)
self.static_mobjects_to_shader_info_list[id(mob)] = info_list self.static_mobjects_to_shader_info_list[id(mob)] = info_list
def release_static_mobjects(self): def release_static_mobjects(self):
for mob, info_list in self.static_mobjects_to_shader_info_list.items(): for mob, info_list in self.static_mobjects_to_shader_info_list.items():
for info in info_list: for info in info_list:
info["vbo"].release() vbo, vao, shader = info["render_group"]
vbo.release()
vao.release()
self.static_mobjects_to_shader_info_list = {} self.static_mobjects_to_shader_info_list = {}
# Shaders # Shaders
@ -380,19 +387,16 @@ class Camera(object):
vert_format = moderngl.detect_format(program, shader_info["attributes"]) vert_format = moderngl.detect_format(program, shader_info["attributes"])
self.id_to_shader[sid] = (program, vert_format) self.id_to_shader[sid] = (program, vert_format)
program, vert_format = self.id_to_shader[sid] program, vert_format = self.id_to_shader[sid]
# Set uniforms self.set_shader_uniforms(program, shader_info)
self.set_perspective_uniforms(program)
for name, path in shader_info["texture_paths"].items():
tid = self.get_texture_id(path)
program[name].value = tid
for name, value in shader_info["uniforms"].items():
program[name].value = value
return program, vert_format return program, vert_format
def set_perspective_uniforms(self, shader): def set_shader_uniforms(self, shader, shader_info):
for key, value in self.perspective_uniforms.items(): for name, path in shader_info["texture_paths"].items():
tid = self.get_texture_id(path)
shader[name].value = tid
for name, value in it.chain(shader_info["uniforms"].items(), self.perspective_uniforms.items()):
try: try:
shader[key].value = value shader[name].value = value
except KeyError: except KeyError:
pass pass

View file

@ -70,6 +70,7 @@ def get_shader_info(raw_data=None,
"render_primative": str(render_primative), "render_primative": str(render_primative),
} }
result["id"] = create_shader_info_id(result) result["id"] = create_shader_info_id(result)
result["prog_id"] = create_shader_info_program_id(result)
return result return result
@ -86,6 +87,10 @@ def shader_info_to_id(shader_info):
return shader_info["id"] return shader_info["id"]
def shader_info_program_id(shader_info):
return shader_info["prog_id"]
def create_shader_info_id(shader_info): def create_shader_info_id(shader_info):
# A unique id for a shader # A unique id for a shader
return "|".join([str(shader_info[key]) for key in SHADER_KEYS_FOR_ID]) return "|".join([str(shader_info[key]) for key in SHADER_KEYS_FOR_ID])
@ -95,7 +100,7 @@ def refresh_shader_info_id(shader_info):
shader_info["id"] = create_shader_info_id(shader_info) shader_info["id"] = create_shader_info_id(shader_info)
def shader_info_program_id(shader_info): def create_shader_info_program_id(shader_info):
return "|".join([str(shader_info[key]) for key in ["vert", "geom", "frag"]]) return "|".join([str(shader_info[key]) for key in ["vert", "geom", "frag"]])