Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 将顶点和索引缓冲区上载到GPU_Opengl_Gpu_Terrain_Vertex Buffer - Fatal编程技术网

Opengl 将顶点和索引缓冲区上载到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

我正在创建一个地形引擎,目前我正在将整个地形VB(顶点缓冲区)和IB(索引缓冲区)一次性上传到GPU,因为地形不是很大。现在是256x256

现在,让我们假设我想创建一个程序地形,它使用柏林噪声来生成高度贴图

当然,我可以生成“补丁”,并将所有的VB和IB补丁一次上传到GPU,但随着播放器移动到很远的地方,必须生成新补丁,然后我必须生成新补丁并上传到GPU。我脑海中的困惑或问题是:

  • 将VB和IB上传到GPU是否很慢?当数据上传到GPU时,玩家会注意到闪烁吗

  • 如果我将补丁的VB和IB逐渐上传到GPU,而不是一次将它们全部上传到GPU,性能会更好吗?基本上我是在问VB和IB的大小是否重要

  • 如能提供有关这一概念的任何信息,将不胜感激


    谢谢

    通常情况下,你会将地形分割成几个小块,玩家移动时,你会对这些小块进行流式处理。在我的地形引擎中,我从未将索引缓冲区放在缓冲区对象中,因为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帧时才看到眼前的幻灯片。