2013-12-20 75 views
0

我找上繪製的OpenGL缸的好辦法,我試圖繪製多個圓畫缸基於OpenGL的着色器

for (GLuint m = 0; m <= segments; ++m) { 
    for (GLuint n = 0; n <= segments; ++n) { 
     GLfloat const t = 2 * M_PI * (float) n/(float) segments; 
     //position 
     points[num++] = x + sin(t) * r; 
     points[num++] = .0005 * m; 
     points[num++] = y + cos(t) * r; 
     //color 
     points[num++] = 1; 
     points[num++] = 1; 
     points[num++] = 1; 
     //texture 
     points[num++] = sin(t) * 0.5 + 0.5; 
     points[num++] = cos(t) * 0.5 + 0.5; 
    } 
} 

和顯示功能

GLuint pointer = 0; 
for (GLuint i = 0; i <= segments; ++i) { 
glDrawArrays(GL_TRIANGLE_FAN, pointer, segments + 1); 
pointer += segments + 1; 
} 

我詢問是否有直接的方法來繪製這個圓柱體

+1

這個問題對我來說不是很清楚。通過「直接」繪製圓柱,你的意思是什麼?如果您問是否可以讓OpenGL繪製圓形等基本圖形而不將其分解爲三角形,則答案通常爲「否」。 – aardvarkk

+0

你還需要一個三角形的地幔條,你可以重新使用外部圓盤的位置,你現在有 –

+0

如果你的圓柱體已經分解成三角形,我建議你只用索引頂點來繪製它(看看'glDrawElements')。您只需創建所有頂點的列表(不重複),然後通過提供相關索引來繪製三角形。 – aardvarkk

回答

1

繪製很多光盤一個在另一個之上是太慢了(除非你真的想畫圓柱體作爲片光盤)

你應該畫出圓柱體的兩側。例如一個四邊形網格將是

// for (GLuint m = 0; m <= segments; ++m) 
float const bottom = .0005f * 0.f; 
float const top = .0005f * (segments-1.f); 
for(GLuint n = 0; n <= segments; ++n) 
{ 
    GLfloat const t0 = 2 * M_PI * (float)n/(float)segments; 
    GLfloat const t1 = 2 * M_PI * (float)(n+1)/(float)segments; 
    //quad vertex 0 
    points[num++] = x + sin(t0) * r; 
    points[num++] = bottom; 
    points[num++] = y + cos(t0) * r; 
    //quad vertex 1 
    points[num++] = x + sin(t1) * r; 
    points[num++] = bottom; 
    points[num++] = y + cos(t1) * r; 
    //quad vertex 2 
    points[num++] = x + sin(t1) * r; 
    points[num++] = top; 
    points[num++] = y + cos(t1) * r; 
    //quad vertex 3 
    points[num++] = x + sin(t0) * r; 
    points[num++] = top; 
    points[num++] = y + cos(t0) * r; 
} 

您可以添加2個磁盤(底座)關閉圓柱體。

您可以使用頂點+索引緩衝區減少從頂點存儲頂點。 在OGL的新版本中,您可以通過索引網格來消除頂點內存的使用gl_VertexID

+0

「圓柱體的離散版本」使其聽起來像所有多面體都是圓柱體形狀。這就像說多邊形是一個圓圈的離散版本;雖然在某些情況下可能是對的,但大多數多邊形看起來並不特別圓。 – bcrist

+0

@bcrist我明白你的意思了。爲了避免混淆,我會堅持使用圓柱體。謝謝 –