2013-11-26 2 views
-1

вот код, который рисует цилиндр примитив:Vertex Перекрытие в OpenGL

glBegin(GL_TRIANGLE_FAN); 
glVertex3f(0, height/2.0f, 0); 
for (int i = 0; i < SIDENUMS +1; i++) 
{ 
    glVertex3f(radius * cos(i * 2 * PI/SIDENUMS), height/2.0f, radius * sin(i * 2 * PI/SIDENUMS)); 
} 
glEnd(); 

glBegin(GL_QUADS); 
for (int i = 0; i < SIDENUMS + 1;i++) 
{ 
    glVertex3f(radius * cos(i * 2 * PI/SIDENUMS), height/2.0f, radius * sin(i * 2 * PI/SIDENUMS)); 
    glVertex3f(radius * cos(i * 2 * PI/SIDENUMS), -height/2.0f, radius * sin(i * 2 * PI/SIDENUMS)); 
    glVertex3f(radius * cos((i+1) * 2 * PI/SIDENUMS), -height/2.0f, radius * sin((i+1) * 2 * PI/SIDENUMS)); 
    glVertex3f(radius * cos((i+1) * 2 * PI/SIDENUMS), height/2.0f, radius * sin((i+1) * 2 * PI/SIDENUMS));  
} 
glEnd(); 

glBegin(GL_TRIANGLE_FAN); 
glVertex3f(0, -height/2.0f, 0); 
for (int i = 0; i < SIDENUMS + 1; i++) 
{ 
    glVertex3f(radius * cos(i * 2 * PI/SIDENUMS), -height/2.0f, radius * sin(i * 2 * PI/SIDENUMS)); 
} 
glEnd(); 

И выход нечто вроде изображения ниже:

enter image description here

Сейчас в картине, обратите внимание на точки A.

Этот пункт нарисован два раза, один в TRIANGLE_FAN и второй в GL_QUADS. Мой вопрос в том, что это два разных точки w автоматически состыковываются друг с другом, чтобы сделать одну точку? или они на вершине друг друга? Вкратце, сколько очков есть? один или два ? как я могу исправить, если они не свариваются друг с другом?

ответ

0

это два разных точки, приваренных друг к другу, чтобы сделать одну точку?

Nope.

или они находятся друг на друге?

Да.

Сколько предметов? один или два ?

Два.

Вам нужно будет закрепить вершины на стороне клиента, если это важно для вас. В OpenGL нет волшебного объединения.

+0

можно привести пример, чтобы сплавить и сварить их! как я могу их приварить? –

+1

@ S.A.Parkhid: Это ничего, что OpenGL делает OpenGL просто наносит точки, линии и треугольники на экран, а затем забывает о том, как они появились. В OpenGL нет такой вещи, как «сцена» или модели. «слияние» или «слияние» точек - это то, что происходит в структурах данных вашей программы. Однако для фигуры, которую вы показали, фактически не имеет смысла для * общей * вершины, так как * нормали * нарисованных граней различны. – datenwolf

+0

Я думаю, что на этой диаграмме больше точек, чем три вершины. Есть пара квадов, которые имеют вершину в этом месте и пару раздутых треугольников. Раздутые треугольники повторно используют одну вершину, но квадратики создают две различные вершины. –

0

Приоритеты треугольных вентиляторов повторно используют «точки» при создании треугольников, но для каждого квадрата каждый вызов glVertex3f (...) генерирует одну «точку».

Чтобы поставить этот другой путь:

При использовании вентиляторов треугольника, то первый треугольник требует 3 вершины, которые будут трансформировано, каждый следующий треугольник требует только 1 новой вершины (и повторно 2). Это имеет значение для эффективности, которая представляет собой концепцию, в которой вы в конечном итоге оказались в своем вопросе.

При использовании вершинных массивов и glDrawElements (...) или примитивных режимов, разделяющих вершины (например, вентиляторы и полосы), вы можете избежать необходимости трансформировать одну и ту же точку несколько раз. Однако, если вы использовали больше атрибутов per-vertex, чем в своем примере, это может оказаться неприемлемым. То есть, если каждая из сторон объекта, который вы рисуете, имеет другой набор координат текстуры или нормалей для одного и того же пространственного местоположения.

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