我使用渲染循環如下;各種頂點格式和vbo
- 孤立數據並映射緩衝區。
- 記錄命令並將生成的頂點寫入緩衝區。
- 取消映射緩衝區。
- 迭代可以改變狀態,綁定紋理或繪製的命令。
此刻我使用了一個交叉點頂點格式(SoA),它具有我的任何着色器可以使用的所有屬性。
struct OneSizeFitAllVertex
{
float pos[3];
float uv0[2];
float uv1[2];
float col[4];
};
當使用簡單的着色器僅使用位置和顏色,例如,我只寫我在乎的映射內存和shader代碼會簡單地忽略所有未使用的屬性的屬性。
因爲這感覺很浪費,所以我正在考慮對每個着色器使用不同的頂點格式。
struct SimpleVertex
{
float pos[3];
float col[4];
};
而另一些人,多紋理對象,將使用多紋理着色器進行渲染和使用MultitextureVertex:使用簡單的着色器將使用SimpleVertex呈現
簡單對象
struct MultitextureVertex
{
float pos[3];
float uv0[2];
float uv1[2];
};
我應該如何處理這些不同的格式?
我應該在繪製前將所有不同格式的頂點寫入同一個映射緩衝區並更改我的AttribPointers嗎?這將節省一些空間。
我應該爲每個頂點格式映射不同的緩衝區嗎?也許更有效率。
或者我應該保持'一個尺寸適合所有'頂點格式?這很容易。
我很想知道什麼是這種情況下的最佳做法。 謝謝。
除了我最喜歡的建議「任何讓你的生活變得最簡單,並且能夠最快地完成工作」,如果移動到多個頂點結構會導致你重複數據(例如,你會使用相同的位置值兩個單獨的數組),那會很糟糕。有一點不清楚的是,如果您對相同的數據使用不同的着色器(例如,如果您有對象,並通過切換着色器在不同的外觀之間切換),或者每個着色器都有自己的數據。但是,如果所有着色器都使用來自同一陣列的數據,則您的方法是最簡單的。 – radical7