Opengl 将顶点和索引缓冲区上载到GPU
我正在创建一个地形引擎,目前我正在将整个地形VB(顶点缓冲区)和IB(索引缓冲区)一次性上传到GPU,因为地形不是很大。现在是256x256 现在,让我们假设我想创建一个程序地形,它使用柏林噪声来生成高度贴图 当然,我可以生成“补丁”,并将所有的VB和IB补丁一次上传到GPU,但随着播放器移动到很远的地方,必须生成新补丁,然后我必须生成新补丁并上传到GPU。我脑海中的困惑或问题是:Opengl 将顶点和索引缓冲区上载到GPU,opengl,gpu,terrain,vertex-buffer,Opengl,Gpu,Terrain,Vertex Buffer,我正在创建一个地形引擎,目前我正在将整个地形VB(顶点缓冲区)和IB(索引缓冲区)一次性上传到GPU,因为地形不是很大。现在是256x256 现在,让我们假设我想创建一个程序地形,它使用柏林噪声来生成高度贴图 当然,我可以生成“补丁”,并将所有的VB和IB补丁一次上传到GPU,但随着播放器移动到很远的地方,必须生成新补丁,然后我必须生成新补丁并上传到GPU。我脑海中的困惑或问题是: 将VB和IB上传到GPU是否很慢?当数据上传到GPU时,玩家会注意到闪烁吗 如果我将补丁的VB和IB逐渐上传到GP
谢谢 通常情况下,你会将地形分割成几个小块,玩家移动时,你会对这些小块进行流式处理。在我的地形引擎中,我从未将索引缓冲区放在缓冲区对象中,因为LOD机制会不断更改绘制的顶点,并且绘制的顺序会改善早期Z。256×256是一个合理的面片大小,特别是如果使用类似四叉树的结构 所以你能做的就是加载9个地形补丁,每个补丁的大小都是以某种方式选择的,可见范围在围绕中心补丁边界的某个地方结束
| |
---+---+---
| C |
---+---+---
| |
当玩家在C补丁中四处移动时,可见性范围确保他不能查看加载区域以外的区域。一旦玩家移动到另一个补丁,从另一侧缠绕补丁,即
A | |
---+---+---
B | X-> C
---+---+---
C | |
将瓷砖A、B、C重新映射到
| | A'
---+---+---
->C | B'
---+---+---
| | C'
其中A',B',C'循环使用A,B,C的内存,但用新内容填充它。由于玩家从远端进入新的C补丁,即只能看到新补丁的较近部分,因此可以在多个帧上加载A',B',C'的内容
要回答您的两个问题:
太棒了,今晚我会做一些测试,看看结果如何。谢谢你非常详细的回答。但是关于“加载地图本身需要多长时间”,让我们假设VB和IB已经准备好上传(缓存在vram上),上传到GPU时VB和IB的大小不是很重要吗,如果VB可能有1000x1000个顶点的补丁,那么我应该注意到一个快门,对吗?越少,上传到GPU的速度就越快?@raRaRa:你说的vram是什么意思?显卡上的RAM?这就是GPU内存,这就是缓冲区对象的意义所在。如果它已经加载到系统RAM中:是的,这个越大,上传所需的时间就越长。但最终重要的是上传的顶点总数,如果它们出现在多个小补丁或一个大补丁中,则没有太大区别。如果渲染的场景需要所有的视觉细节,那么在绘制任何东西之前,它们都必须以任何方式上传。我指的是系统ram。但是是的,我的意思是逐渐上传很多小补丁,而不是一次上传所有的小补丁。@raRaRa:逐渐上传也被称为流媒体,这很常见。例如,谷歌地球就是这样工作的。只要你上传/替换看不见的几何体,你就可以了。您不会看到闪烁,最糟糕的情况是帧率下降。但是只要你停留在40帧左右,没人会注意到,见鬼,大多数人直到低于20帧时才看到眼前的幻灯片。