OpenGL with python 渲染加速

在Python的OpenGL环境中,作者构建了一个加载gltf动画的框架,发现在渲染过程中存在性能问题。通过将关节矩阵数据传输方式从uniform改为UBO进行优化,实现了速度提升。优化思路是预先分配内存,每次更新内容后整体上传,利用ctypes.memmove函数实现高效内存操作。
摘要由CSDN通过智能技术生成

在python的OpenGL环境下搭了一个简易的加载gltf动画的框架。测试的时候发现渲染很耗时,做了一些零碎的优化,现在的速度还算令人满意。印象比较深的一个优化是针对joint matrix的数据传输方式的改变,在此做个记录。

优化之前

之前因为骨骼关节数量超过了单个shader支持的uniform,所以把骨骼部分的数据改成了UBO(TODO:UBO相关博客)。
按理这一堆joint matrices和joint normal matrices是可以打包一块传上去,只传一次,这样效率会高很多。
如果用c++写,可以先开一块连续内存,然后每次更新这块内存,再一次打包传给ubo就行。但不知道python要怎么处理,所以一开始写成了这种扣扣搜搜的方式。

class Skin:
    def __init__(self, skin: GLTFSkin):
        ...
        
    def update_ubo(self):
        glBindBuffer(GL_UNIFORM_BUFFER, self.ubo_id)
        # 逐个更新joint matrix
        for i, m in enumerate(self.joint_matrices):
            glBufferSubData(GL_UNIFORM_BUFFER, i * glm.sizeof(glm.mat4), glm.sizeof(glm.mat4), glm.value_ptr(m))
        offset = len(self.joint_matrices)
        # 逐个更新joint normal matrix
        for i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值