что такое циферблат по часовой стрелке в openGL

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

Меня смущает эта техника с движением по часовой стрелке. Похоже, что при использовании этого метода порядок данных вершин, отправляемых на видеокарту, определяет, обращены ли они к камере или от нее. Я не понимаю, как это имеет смысл, потому что камера может смотреть в любом направлении, как если бы данные вершин должны были измениться в зависимости от положения камеры, а это явно не делается на ЦП.

Как я могу это понять?


person Dan Webster    schedule 23.02.2013    source источник
comment
связанный вопрос по math.SE: math.stackexchange.com/questions/297588/   -  person luser droog    schedule 25.02.2013


Ответы (3)


Это один треугольник, если смотреть с противоположных сторон:

по часовой стрелке или против часовой стрелки

3 точки в трехмерном пространстве определяют треугольник. Кроме того, если эти точки упорядочены (как здесь), они также определяют две стороны (грани) треугольника: по часовой стрелке и против часовой стрелки (они определяются порядком, в котором часы, помещенные внутри грани, будут указывать на ее вершины)

В приведенном выше примере треугольник текстурирован против часовой стрелки.

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

текстурированная коробка CCW

Если вы бросите кости (или повернете камеру вокруг него), наш треугольник из CCW станет CW, и мы больше не хотим, чтобы он был текстурирован.

На самом деле этот кубик будет состоять из 12 таких треугольников, и если мы правильно расположим их, мы будем текстурировать только 6, обращенных в камеру одновременно.

person fsw    schedule 23.02.2013
comment
Просто хочу добавить, что это также известно как хиральность или хиральность, и что хиральность системы координат также определяет направление, в котором указывает нормаль, в зависимости от порядка, в котором вы помещаете векторы в векторном произведении. Утверждение a×b = -b×a выполняется всегда, но переворачивание хиральности имеет тот же эффект. - person datenwolf; 23.02.2013
comment
поэтому порядок, по часовой стрелке или против часовой стрелки, сообщает графическому процессору, какая сторона является передней, но я не понимаю, как это возможно, поскольку ориентация камеры решает, обращены ли лица вперед или в сторону. - person Dan Webster; 23.02.2013
comment
точно. в этом вся суть. на левой стороне изображения выше камера находится «позади» треугольника, а на правой стороне — «перед» ним. и вы хотите текстурировать только одну сторону. - person fsw; 23.02.2013
comment
добавлено дополнительное изображение для вас. - person fsw; 23.02.2013

Я покажу вам это на примере четырехугольника:

  (0,0)-------(1,0)
    |           |
    |     X     |
    |           |
  (0,1)-------(1,1)

Предположим, мы начинаем с (0,0). Теперь, если вы завершите (пропустите) вершины в порядке «по часовой стрелке», следующими будут (1,0), (1,1) и (0,1). (1,0) лежит более или менее на 2 часа, (1,1) на 4 и так далее.

Таким образом, данные в памяти GPU: 0,0, 1,0, 1,1, 0,1.

Когда вы соотносите направление намотки с вашей настройкой, вы можете легко отличить, что "спереди" и "сзади" - чтобы представить это лучше, вы можете нарисовать это на чем-то прозрачном, а затем посмотреть с другой стороны - направление намотки будет перевернутый.

Таким образом, указание направления намотки состоит лишь в том, чтобы сообщить GPU, какая сторона передняя, ​​а какая задняя, ​​так как он не может сделать это сам по себе — обе стороны треугольника одинаково хороши, и вектор нормали данного многоугольника может будь то N или -N. Однако GPU может проверить, какой из них соответствует правильному порядку развертывания.

В главе 2 (Старой) Красной книги есть несколько хороших пояснений, касающихся специфики OpenGL, которые по-прежнему актуальны и сегодня.

person Bartek Banachewicz    schedule 23.02.2013
comment
поэтому порядок, по часовой стрелке или против часовой стрелки, сообщает графическому процессору, какая сторона является передней, но я не понимаю, как это возможно, поскольку ориентация камеры решает, обращены ли лица вперед или в сторону. - person Dan Webster; 23.02.2013
comment
В этом-то и дело. Если вы смотрите на лица сзади, то их можно просто не учитывать при рисовании, т.к. они обязательно будут затенены передними гранями (исключение составляют прозрачные модели - в этом случае приходится рисовать и переднюю, и заднюю грани) . - person Bartek Banachewicz; 23.02.2013

В том-то и дело: порядок вершин не имеет отношения к ориентации камеры изначально, когда вы создаете/рисуете лицо! Обратите внимание, что камера — это просто преобразование, а не что-то само по себе, распознаваемое openGL.
Итак, при рендеринге, после того как вы «наблюдаете» через камеру, openGL просто проверяет (если включено отсечение) новый порядок вершины лица, теперь в соответствии с новой ориентацией (после применения всех преобразований), отображать лицо или нет.

person mireazma    schedule 15.03.2014