您不需要額外的偏移緩衝區和偏移量索引,只需傳遞紋理座標即可。這裏是你應該在一個頂點程序做什麼:
1)計算從模型視圖矩陣粒子基礎:
vec3 X = vec3(ModelView[0][0], ModelView[1][0], ModelView[2][0]);
vec3 Y = vec3(ModelView[0][1], ModelView[1][1], ModelView[2][1]);
2)計算基於粒度角點(可以是均勻或屬性):
vec3 A1 = -X*SizeX - Y*SizeY;
vec3 B1 = X*SizeX - Y*SizeY;
vec3 C1 = X*SizeX + Y*SizeY;
vec3 D1 = -X*SizeX + Y*SizeY;
3)將中心點到適當的角:
if (TexCoord == vec2(0.0, 0.0)) Position += A1;
if (TexCoord == vec2(1.0, 0.0)) Position += B1;
if (TexCoord == vec2(1.0, 1.0)) Position += C1;
if (TexCoord == vec2(0.0, 1.0)) Position += D1;
或更高效的無網點代碼:
vec3 O1 = (1.0 - TexCoord.y) * (A1 * (1.0 - TexCoord.x) + B1 * TexCoord.x);
vec3 O2 = TexCoord.y * (C1 * TexCoord.x + D1 * (1.0 - TexCoord.x));
Position += O1 + O2;
謝爾蓋,不幸的是偏移量緩衝區是必要的,讓我解釋爲什麼。這些點被分離到集羣中,並且集羣中心被存儲在空間分區數據結構中。當需要更好的LOD時,偏移保持代表實際點。我不完全確定你的解決方案。你能否詳細說明你的答案。 – Ram
然後,只需將Position = center + OffSetBuffer [偏移索引]添加到我的代碼的開頭。 –