gpt4 book ai didi

c++ - OpenGL:如何使用深度排序的顶点数组设计高效的渲染系统?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:41 26 4
gpt4 key购买 nike

人们经常告诉我至少要使用顶点数组。但我认为这不是一个好主意,因为我使用 glPushMatrix()glTranslatef/glRotatef 在 3d 世界中定位对象。

那么,我是否应该停止使用 glPushMatrix() 并“手动”计算世界中旋转/移动的顶点位置,然后将它们的顶点数据推送到顶点数组中,然后一次渲染它?

但是,当我对屏幕上所有同样深度排序的对象使用不同的纹理表面时,所有这些都会变得更加困惑。

所以:

  1. 我还必须使用纹理表面 ID 存储每个对象。
  2. 我会按照 Z 轴位置对所有可见物体进行排序(游戏只能自上而下查看,所有物体都是平面的)。
  3. 我会遍历这个排序数组:
  4. 创建新缓冲区并仅将顶点/纹理坐标/颜色/法线复制到此缓冲区中:
  5. 每次纹理表面 ID 与之前的 ID 发生变化时,我都会绑定(bind)到正确的纹理 ID:
  6. 上传我收集的顶点数据。
  7. 释放用于临时顶点数组的缓冲区。
  8. 重复步骤 4-7,直到我处理完我首先排序的所有数据。
  9. 释放我排序的数组数据,并重复步骤 1-9。

我做对了吗?

此外,我应该如何为要排序的对象设计数据结构?比如用std::vector来存储每个对象的顶点数据好不好?或者有更好的选择吗?我在想存储所有这些数据的 std::vector 应该是这样的:

struct GameObject {
int TexID;
float z; // we will sort by this
vector<VTCNStruct> VertexData; // store each point of the object here (including color/normal/texcoord points).
};

vector<GameObject> GameObjectBuffer; // push all sortable objects here

此外,在第 4 步:在这种情况下是否可以使用已经存在的 std::vector?我有一个想法,我必须使用原始数组,比如 new float[100] 来将顶点数组发送到我的 GPU,或者我可以以某种方式使用我已经存在的排序 std: :vector 这里以某种方式(有效地)无需在每次纹理 ID 更改时创建新缓冲区?

最佳答案

现在放弃 glBegin/glEnd,它已被弃用并已从 OpenGL-4 中删除。您绝对应该使用顶点数组,如果您使用顶点缓冲区对象则更好。

使用立即模式 (glBegin/glEnd),OpenGL 驱动程序必须从函数调用中构建顶点数组。由于不清楚会到达多少个顶点,最终会多次重新分配内存(GPU直接执行glBegin/glEnd之间的调用的时间早就结束了)。

使用顶点数组的性能永远不会低于立即模式。可以将多个对象的几何图形放入单个顶点数组中,您可以通过顶点索引列表将它们分开。顶点索引列表也可以存储在缓冲区对象中。

然后在绘制对象之间调整模型 View 矩阵。

排序顺序应如下所示:

  1. 分为不透明和半透明物体。排序不透明
  2. 按 GL 对象(纹理、着色器、 Material 等)对操作问题进行排序,因为切换 GL 对象的成本最高。
  3. 对于每个不同的 GL 对象组从近到远排序并按该顺序绘制
  4. 将半透明体从远到近排序并按此顺序绘制

你不应该尝试摆弄缓冲区上传/下载。只需上传一次顶点数据,然后调整索引数组和提交顺序即可。无需担心可用的 OpenGL 内存,没有强制限制。如果您的数据不适合 GPU RAM,则驱动程序负责将其交换到系统内存——这也是您应该首先按 OpenGL 对象排序的原因,因为每次切换 OpenGL 对象(glBindTexture、glBindBuffer 等)时,驱动程序可能需要交换,因此您希望将这些交换操作保持在最低限度。以索引数组的形式发送到 GPU 的数据量至少比立即模式调用发送的数据量少得多:

  • 索引数组:每个顶点 16 位(16 位大小的索引性能最高)。

  • 立即模式调用:每个顶点 4*32 位

关于c++ - OpenGL:如何使用深度排序的顶点数组设计高效的渲染系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4424936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com