2013-12-20 4 views
0

Я ищу хороший способ привлечь цилиндр на OpenGL, я попытался сделать несколько круговDraw цилиндр в 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 Я понимаю, что вы имеете в виду. Я буду придерживаться слова цилиндра, чтобы избежать путаницы. благодаря –

Смежные вопросы