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

Мой вопрос может быть глупым, но я не нашел хорошего примера использования треугольной полосы:

С такими вершинами:

A: -0.5f, -0.5f,  // Bottom left.
B: -0.5f,  0.5f,  // Top left.
C:  0.5f, -0.5f,  // Bottom Right.
D:  0.5f,  0.5f   // Top right.
----------------------------------
B--D
|\ |
| \|    
A--C    

Иногда в примерах мы можем найти эту конфигурацию:

  • A, B, C, C, B, D

или это:

  • A, B, C, D

Что правильно? Я пробовал и то и другое работает.

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

B--D    F--H    
|\ |    |\ |    
| \|    | \|    
A--C    E--G    

Вот что у меня есть:

ABCD + DEEF + EFGH

Но и здесь у меня иногда появляются артефакты.

2 ответа

Решение

Если вы используете отбраковку задней поверхности, две конфигурации не будут давать одинаковый результат. В случае ABCD BCD против часовой стрелки, тогда как в случае ABCCBD CBD против часовой стрелки. Правильный способ рисования двух квадов зависит от того, заботишься ли ты об ориентации. Я бы предложил ABCDDEEFGH.

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

Решение A: Отправьте две отдельные команды рисования треугольной полосы

drawElements(TRIANGLE_STRIP, [A, B, C, D]);
drawElements(TRIANGLE_STRIP, [E, F, G, H]);

Решение Б: Отправить GL_TRIANGLES команда с двумя отдельными патчами

drawElements(TRIANGLES, [A, B, C, 
                         C, B, D,
                         E, F, G,
                         G, F, H]);

Решение C: Решение Triangle Strip, о котором вы просили

drawElements(TRIANGLE_STRIP, [A, B, C, D, 
                              D, E,
                              E, F, G, H]);

Решение C рисует треугольники

.A B C
 C B D
.C D D - deg
 D D E - deg
.D E E - deg
 E E F - deg
.E F G
 G F H
Другие вопросы по тегам