【发布时间】:2017-06-02 22:12:43
【问题描述】:
我使用如下渲染循环;
- 孤立数据并映射缓冲区。
- 记录命令并将生成的顶点写入缓冲区。
- 取消映射缓冲区。
- 迭代可以更改状态、绑定纹理或绘制的命令。
目前我使用单一交错顶点格式 (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?这样可以节省一些空间。
我应该为每种顶点格式映射不同的缓冲区吗?也许效率更高。
或者我应该保持“一刀切”的顶点格式吗?这更容易。
我很想知道在这种情况下什么是最佳做法。 谢谢。
【问题讨论】:
-
除了我最喜欢的“让你的生活最轻松,并且最快地完成工作”的建议之外,如果移动到多个顶点结构会导致你重复数据(例如,你会使用两个单独的数组中的相同位置值),那会很糟糕。不清楚的一件事是您是否在相同数据上使用不同的着色器(例如,如果您有一个对象,并通过切换着色器在不同外观之间切换),或者每个着色器都有自己的数据。但是,如果所有着色器都使用同一个数组中的数据,那么您的方法是最简单的。
标签: opengl vbo vertex-attributes