2013-08-01 3 views
5

Я пытаюсь прояснить некоторые несоответствия, которые я вижу в направлении намотки вершин треугольной полосы (по часовой стрелке и против часовой стрелки). Я рисую трапецию, повернутую на 90 градусов против часовой стрелки в OpenGL. Вот соответствующий код:Ли направление намотки в треугольной полосе OpenGL чередуется от треугольника до треугольника?

unsigned char mIndices[] = { 0, 1, 2, 3, 4, 5 }; 
signed short mVertices[] = { 
           -50, 100, 0, // A 
           -85, 65, 0,  // B 
           -50, 65, 0,  // C 
           -85, -65, 0, // D 
           -50, -65, 0, // E 
           -50, -100, 0, // F 
}; 

... 

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_SHORT, 0, mVertices); 

... 

glDrawElements(GL_TRIANGLE_STRIP, sizeof(mVertices)/sizeof(mVertices[0]), GL_UNSIGNED_BYTE, mIndices); 

Из того, что я прочитал here, по умолчанию передней стороны в OpenGL это против часовой стрелки, что означает, что первый треугольник в моей полосе должен иметь это вершину упорядоченной против часовой стрелки. Кроме того, при рисовании треугольной полосы обмотка переключает направления между против часовой стрелки и по часовой стрелке от треугольника до треугольника, поэтому мои вершины упорядочены таким образом. Поэтому из моего кода первым треугольником будет ABC, второй - BCD, третий CDE и четвертый DEF. Однако статья this (в цитате из Руководства по программированию OpenGL) говорит, что она будет рисовать их как ABC, CBD, CDE, EDF (при условии, что v0 - A, v1 - B и т. Д.), Что означает, что все они действуют одинаково против часовой стрелки направление.

Если я правильно понимаю A/B-нотацию из спецификации OpenGL, треугольники будут проходить в одном направлении, но я видел переменную обмотку в нескольких разных местах. Я предполагаю, что это просто проблема семантики, поскольку результирующая фигура такая же, но каков фактический порядок намотки?

ответ

7

Итак, из моего кода первым треугольником будет ABC, вторым будет BCD, третий CDE и четвертый DEF. Однако в этой статье (в цитате из Руководства по программированию OpenGL) говорится, что она будет рисовать их как ABC, CBD, CDE, EDF (при условии, что v0 - A, v1 - B и т. Д.), Что означает, что все они действуют одинаково против часовой стрелки направление.

То, что они оба сказали, верно. С определенной точки зрения;)

В данном учебном пособии речь идет об этом с точки зрения порядка, в котором вершины предоставили растеризатору. Это точно так же, как указано. Растеризатор видит один поток ABCDEF ... vertcies. Поэтому с этой точки зрения растеризатор должен переключать свой внутренний порядок намотки на каждый другой треугольник, чтобы соответствовать намерению пользователя.

Книга, которую вы цитировали, говорит об этом с точки зрения того, как вы подумайте о порядке этих треугольников. Пока вы предоставляете их в таком порядке, вы хотите, чтобы обмотка работала как ABC, CBD, CDE и т. Д. И для этого вы предоставляете их в ABCDEF ... порядке.

4

Будьте уверены, что треугольники, образующиеся из треугольной полосы, все раны в одном порядке (иначе это был бы полный беспорядок, и вы не могли бы использовать простые вещи, такие как отбрасывание на лицевой стороне или двусторонний рендеринг вообще) , это часть магии полосы треугольника и почему просто рисование простого треугольника, начинающегося с каждой последовательной вершины, не будет работать (ну, это было бы, но это привело бы к чередующимся извилистым ордерам, которые никогда не были когда-либо (когда-либо) хорошим идея). Итак, вторая статья (из руководства по программированию OpenGL) верна, и первая статья либо неверна, либо ее семантика испортилась, либо была неверно истолкована вами (хотя, я думаю, последняя, ​​учитывая качество этого учебника, но, возможно, Николь Болас сам может пролить свет на него).

EDIT: Хорошо, глядя в конце первой статьи:

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

Однако OpenGL довольно умен. Треугольные полосы делают лицо отбраковывается по-разному. Для каждого второго треугольника тот, у кого порядок намотки противоположный порядку первого треугольника, обмотка порядок считается обратным для отбраковки.

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

Это на самом деле говорит, что в то время как порядок намотки будет теоретически чередуя, OpenGL учитывает, что и «исправление» его для треугольных полосок, в результате чего в обмотке порядка практически (для всех стоящих соображений, как выбраковка или gl_FrontFacing фрагмента shader variable) для каждого треугольника одинаково. Итак, обе статьи верны, и вы просто не читали первый до конца. Хотя в статье можно было бы сделать более понятным, что это делается не только для отбраковки, но и для всех целей и, следовательно, для вас практически незаметно.

Смежные вопросы