2012-09-19 47 views
2

OpenGL 3渲染點:點存儲在空間分區樹內。該樹具有顏色和正常信息屬性的點。渲染點(粒子)與OpenGL 3+

點信息及其屬性存儲爲一組緩衝區。

  1. 偏移量緩衝區是一個向量數組。

  2. 點存儲在內存中作爲中心和偏移索引。偏移索引指向偏移緩衝區Point = center + OffSetBuffer[offset index]

  3. 法線存儲在正常緩衝區中,每個點保存正常緩衝區的索引。

  4. 顏色存儲在顏色緩衝區中,每個點保存顏色緩衝區的索引。

我有一些空間來改變緩衝區佈局,但如上所述持有信息可減少重複或冗餘信息。

我的問題是如何有效地使用OpenGL 3+ API來渲染上述點?

回答

1

您不需要額外的偏移緩衝區和偏移量索引,只需傳遞紋理座標即可。這裏是你應該在一個頂點程序做什麼:

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; 
+0

謝爾蓋,不幸的是偏移量緩衝區是必要的,讓我解釋爲什麼。這些點被分離到集羣中,並且集羣中心被存儲在空間分區數據結構中。當需要更好的LOD時,偏移保持代表實際點。我不完全確定你的解決方案。你能否詳細說明你的答案。 – Ram

+0

然後,只需將Position = center + OffSetBuffer [偏移索引]添加到我的代碼的開頭。 –