首页 > 解决方案 > 关于实例化、实例化数组和缓冲区更新的问题

问题描述

在我之前的一个问题(如何为多个对象使用不同的转换进行实例绘制)中,我询问了如何使用不同的转换进行实例绘制,有人回答说正确的方法是使用实​​例化数组。

这让我看到了他们通过 VAO 发送转换数据的教程,这正是我想要的。

但是新的问题出现了。由于我的对象是动态的(我想移动它们),我如何通过它们的转换来更新缓冲区?

我见过的大多数教程通常只渲染实例对象一次,因此它们不需要更新缓冲区。事实上,我什至不知道如何更新缓冲区,因为我在开始时使用网格声明 VAO,并且它在程序运行时不会更改。

我认为我应该做的事情:将 CPU 端的转换存储在某个数组中,当我做一些导致更改特定转换的事情时,我将更新这个数组,然后更新转换缓冲区。

可能是实际问题: 如何在程序运行时更新缓冲区?

标签: opengl

解决方案


只需用于glBufferSubData更新 GPU 上的相应数据,着色器从中获取每个实例的转换(例如,除数设置为 1 的顶点缓冲区glVertexAttribDivisor(idx, 1))。

另一种可能性是使用glMapBufferglMapBufferRange更新该缓冲区。


推荐阅读