我使用如下渲染循环;
- 孤立数据并映射缓冲区。
- 记录命令并将生成的顶点写入缓冲区。
- 取消映射缓冲区。
- 迭代可以更改状态、绑定纹理或绘制的命令。
目前,我使用单一交错顶点格式 (SoA),它具有我的任何着色器都可以使用的所有属性。
struct OneSizeFitAllVertex
{
float pos[3];
float uv0[2];
float uv1[2];
float col[4];
};
例如,当使用仅使用位置和颜色的更简单的着色器时,我只会在映射内存中写入我关心的属性,并且着色器代码会简单地忽略所有未使用的属性。
因为这感觉很浪费,我正在考虑为我的每个着色器使用不同的顶点格式。
使用简单着色器渲染的简单对象将使用 SimpleVertex:
struct SimpleVertex
{
float pos[3];
float col[4];
};
而其他多纹理对象将使用多纹理着色器并使用 MultitextureVertex 进行渲染:
struct MultitextureVertex
{
float pos[3];
float uv0[2];
float uv1[2];
};
我应该如何处理这些不同的格式?
我应该在同一个映射缓冲区中写入所有不同格式的顶点并在绘制之前更改我的 AttribPointers 吗?这样可以节省一些空间。
我应该为每种顶点格式映射不同的缓冲区吗?或许更有效率。
还是我应该保持“一刀切”的顶点格式?这更容易。
我很想知道在这种情况下最好的做法是什么。谢谢。