Расчет и применение нормалей к треугольной сетке

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

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

 1_2
 |/|    Supposedly a square where the numbers represent the vertex number in a            
 3 4    triangle strip.

Я знаю, что вам нужно вычислить перекрестное произведение двух векторов, принадлежащих плоскости, чтобы получить нормаль к плоскости. Итак, в этом примере нормаль верхнего треугольника может быть вычислена путем выполнения (2-1) x (3-1), а второго - путем выполнения (2-4) x (3-4). Как затем применить нормали при рисовании полосы треугольников в непосредственном режиме?

Что я делал, так это устанавливал первую нормаль, когда установлен vtx 1, вторую, когда установлен vtx 4, третью, когда установлен vtx 5, и т.д. вершины треугольника (когда все они должны быть одинаковыми). Например, треугольник | 2,3,4 | будет иметь только вершину 4 с правильной нормалью (поскольку для вершин 2 и 3 нормаль будет одной из первого треугольника).

Так как же это сделать? Есть ли способ или мне нужно перейти на GL_TRIANGLES? (Я не хочу пока прекращать использование немедленного режима, потому что у меня нет времени).


person Zepee    schedule 30.11.2010    source источник


Ответы (1)


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

person Bart    schedule 30.11.2010
comment
Это верно для интерполированного затенения вершин. Если вы хотите иметь плоское затенение, вам необходимо продублировать общие вершины, чтобы каждый набор точек на грани имел уникальные нормали, а не средние значения. - person Ron Warholic; 30.11.2010
comment
Верно. Взвешенная сумма (с весом, являющимся площадью треугольника) также хорошо работает AFAIK. См. Мой пост по этому поводу: stackoverflow.com/questions/4247994/ - person Kos; 30.11.2010
comment
@ Рон Уорхолик: А, теперь я понимаю, как плакат мог это означать. Спасибо за комментарий. - person Bart; 30.11.2010
comment
Спасибо, именно этого я и хотел. @ Рон Уорхолик: Из любопытства, что вы имеете в виду под дублированием вершин и как бы вы нарисовали полосу треугольника, если бы у вас было более одной вершины в одной и той же позиции (я предполагаю, что это то, что вы имеете в виду под повторяющимися вершинами) - person Zepee; 01.12.2010
comment
@Zepee: вы не можете использовать треугольные полосы для плоского затенения (по крайней мере, не так, чтобы они все еще функционировали как треугольные полосы); вы бы просто использовали GL_TRIANGLES. Примечательно, что полосы треугольников действительно поддерживают дублирование вершин (обычно для создания вырожденных треугольников). Это полезно для создания сеток, у которых есть функции, которые в противном случае запретили бы использование треугольных полос. - person Ron Warholic; 01.12.2010