opengl - 关于实例化、实例化数组和缓冲区更新的问题
问题描述
在我之前的一个问题(如何为多个对象使用不同的转换进行实例绘制)中,我询问了如何使用不同的转换进行实例绘制,有人回答说正确的方法是使用实例化数组。
这让我看到了他们通过 VAO 发送转换数据的教程,这正是我想要的。
但是新的问题出现了。由于我的对象是动态的(我想移动它们),我如何通过它们的转换来更新缓冲区?
我见过的大多数教程通常只渲染实例对象一次,因此它们不需要更新缓冲区。事实上,我什至不知道如何更新缓冲区,因为我在开始时使用网格声明 VAO,并且它在程序运行时不会更改。
我认为我应该做的事情:将 CPU 端的转换存储在某个数组中,当我做一些导致更改特定转换的事情时,我将更新这个数组,然后更新转换缓冲区。
可能是实际问题: 如何在程序运行时更新缓冲区?
解决方案
只需用于glBufferSubData
更新 GPU 上的相应数据,着色器从中获取每个实例的转换(例如,除数设置为 1 的顶点缓冲区glVertexAttribDivisor(idx, 1)
)。
另一种可能性是使用glMapBuffer
或glMapBufferRange
更新该缓冲区。
推荐阅读
- python - 无法从其他文件导入函数
- reactjs - react-native 开始给出 Invalid 正则表达式无效错误
- jquery - 如何使用 jquery 添加拖放 div?
- .net - 当组件同时包含在剃刀页面和布局页面中时,Blazor 服务器 SignalR 断开连接
- ionic3 - 地理位置 - 如果我从启用 GPS 开始,Ionic 3 天气应用程序可以正常工作
- python - mpiexec + python + ^C: __del__ 方法未执行(并且没有回溯)
- mysql - 如何处理 SQL (mySQL) 中的非标准日期格式?
- c# - 为什么 EF Core 不自动生成 id 字段?
- c# - 使用 C#、.NET Core 3 和 GTK# 进行跨平台编程(和替代方案)
- r - 如何根据 R 中的多个条件正确定义新列