OpenGL боковая выбраковка - PullRequest
1 голос
/ 07 июня 2011

Я рисую ряд кубиков рядом друг с другом и хочу отбросить все соприкасающиеся стороны, потому что они бесполезны.Проблема в том, что я не знаю, как отбраковывать стороны.Может кто-нибудь объяснить, как отбирать любые стороны куба, вызываемого с помощью вызовов glBegin () / glEnd ()?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

OpenGL не сделает этого за вас, вам придется отбирать их самостоятельно.

Я сделал следующее в недавнем проекте:

Из коллекции позиций куба, которую я добавилзаписи для каждого лица в словарь.Это нанесенное на карту лицо в центре, чтобы лицо было нормальным.Прежде чем добавить новую (позиция, нормальная) пара, я бы проверил наличие этой позиции.Если найдено: удалите существующую запись и выбросьте новую.В противном случае добавьте новый (позиция, нормаль).

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

Возможно, есть более эффективные способы сделать это, но этого было достаточно для моего приложенияи прост в реализации.

Редактировать:

PSEUDOCODE:

d = dictionary<vec3, vec3>

for each cube:
    for face 1..6:
        pos = faceCenterFor(cube, face)
        if pos in d:
            remove d[pos]
        else:
            d[pos] = normalFor(cube, face)

for each (pos, normal) in d:
    draw(vertsForFace(pos, normal))
    # or save verts to an array for drawing later
0 голосов
/ 06 августа 2012

Если вы убедитесь, что задали нормали граней для своих кубов, вы можете включить по крайней мере (glEnable()) отбор задней грани, но вполне вероятно, что для сторон куба вам придется отбирать вручную.

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

Укажите нормали для каждого лица, используя (например):

gl.glNormal3f(1, 0, 0);

Для отбраковки лицевой стороны:

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
...