В каком порядке я должен отправлять свои вершины в OpenGL для отбраковки - PullRequest
27 голосов
/ 16 ноября 2011

Я изучаю пятно 3d opengl, и оно идет довольно хорошо, у меня есть хорошая камера, которая движется, и несколько простых кубических объектов, в данный момент. В настоящее время я использую массивы вершин, но я довольно быстро перехожу к VBO. Я просто пытаюсь включить отбраковку, однако я не уверен, в каком порядке я должен указать свои вершины, сейчас я делаю вот что:

void cube::update_verts(){
GLushort cur=0;

///back face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;

///right face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;

///top face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;

///front face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;

///bottom face
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;

///left face
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;


}

///Drawing Code:

glVertexPointer(3,GL_FLOAT,0,object.verts);
glColorPointer(3,GL_UNSIGNED_BYTE,0,object.colors);
glDrawArrays(GL_QUADS,0,6*4);

Однако это определенно неправильно, потому что когда я glEnable(GL_CULL_FACE);, мои кубы не показывают правильные грани (как показано ниже).

Нормальный Regular View From Top

Проблемный ребенок View From Side

С обоими этими изображениями выборка включена.

В каком порядке я должен указывать вершины?


(РЕДАКТИРОВАТЬ) Обновленная рабочая функция:

void cube::update_verts(){
GLushort cur=0;

///top face
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;


///bottom face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;

///left face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;

///right face
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;

///front face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;


///back face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;

}

Ответы [ 2 ]

109 голосов
/ 16 ноября 2011

по умолчанию? В направлении против часовой стрелки.

Рассмотрим треугольник, обращенный к камере:

A
|\
| \
|  \
B---C

A-> B-> C будет обращен вперед (против часовой стрелки), A-> C-> B будет направлен назад (по часовой стрелке).

Вы можете изменить способ, которым OpenGL считает «переднюю сторону», с помощью glFrontFace():

Говорят, что проекция многоугольника на координаты окна имеет по часовой стрелке, если воображаемый объект следует по пути от его первая вершина, вторая вершина и т. д. до последней вершины и наконец, вернуться к своей первой вершине, движется по часовой стрелке около интерьер многоугольника. Обмотка многоугольника называется против часовой стрелки, если воображаемый объект движется по тому же пути в направлении против часовой стрелки относительно внутренней части многоугольника. glFrontFace указывает, будут ли полигоны с намоткой по часовой стрелке координаты окна или намотка против часовой стрелки в координатах окна, взяты на фронт. Передача GL_CCW в mode выбирает многоугольники против часовой стрелки как фронтальные; GL_CW выбирает по часовой стрелке полигоны как фронтальная.

По умолчанию многоугольники против часовой стрелки считаются фронтальными.

Для упорядочения ваших вершин рассмотрим идеальный куб:

  6---7
 /|  /|
2---3 |
| 4-|-5
|/  |/ 
0---1

Для каждого лица мысленно поверните его лицом к камере (своим разумом):

Sides:
2---3  3---7  7---6  6---2
|   |  |   |  |   |  |   |
|   |  |   |  |   |  |   |
0---1  1---5  5---4  4---0

Bottom/Top
0---1  6---7
|   |  |   |
|   |  |   |
4---5  2---3

Тогда вы можете просто визуально считывать пары квадратов или треугольников в правильном порядке против часовой стрелки:

2---3                3         2---3 
|   |  becomes      /|   and   |  / 
|   |             /  |         |/ 
0---1            0---1         0 

Triangles 0-1-3 and 0-3-2
Quad 0-1-3-2
6 голосов
/ 22 мая 2013

Я выучил еще одно эмпирическое правило (буквально) для определения порядка вершин, известное как «правило правой руки».
Представьте, что ваша открытая рука (правая) внутри куба, а большой палец направлен к центру куба.Если вы затем свернете руку в кулак, ваши пальцы пройдут вершины в правильном порядке.Поскольку для этого вы используете правую руку, это называется «правилом правой руки».

И наоборот, если вы начинаете с левой руки и указываете большим пальцем в сторону от центра куба, ваши пальцы снова будутразверните вершины в правильном порядке.Это называется «правилом левой руки» (сюрприз).

Оба метода работают для упорядочения против часовой стрелки.Для заказа по часовой стрелке просто используйте противоположную руку.

...