Стандарт OpenGL определяется тем, что все будет вести себя «как если бы» все выполнялось в определенном порядке.Как таковой, он определяет жесткий порядок для почти всего.
Когда дело доходит до вершин и примитивов в команде рендеринга, да, порядок есть.В частности, все берется в том порядке, в котором вы предоставляете данные.Каждая вершина берется по очереди от первой к последней в вызове glDrawArrays/Elements
.И поскольку вершины преобразуются в примитивы, эта сборка упорядочивает сгенерированные примитивы.Примитивы генерируются в порядке, в котором встречаются их инцидентные вершины.
Или, скорее, OpenGL ведет себя «как если бы» следовал порядку отправки.Однако дело в том, что единственное место, где вы можете сказать , является ли что-либо из этого истинным, находится в том порядке, в котором их фрагменты помещаются в кадровый буфер.Таким образом, реализации могут обрабатывать примитивы асинхронно, но затем выполнять смешивание данных отдельных пикселей из этих примитивов на основе порядка отправки.
Но это детали реализации.Дело в том, что если вы отрисовываете 2 линии в одном и том же вызове отрисовки, и они перекрываются, и у вас включено смешивание, OpenGL гарантирует , что они будут отрисованы, как если бы линия образовалась из первых двух вершин вмассив был полностью отрисован, затем отрисована линия, образованная из более поздней вершины (льдов).И, таким образом, они будут смешаны в этом порядке.
Единственные операции рендеринга, которые явно неупорядочены в OpenGL, - это некогерентные обращения к памяти и порядок примитивов, сгенерированных тесселяция .И последний только позволяет им быть неупорядоченными в этом патче;все примитивы из одного мозаичного патча должны быть визуализированы (как будто) перед любыми примитивами из более позднего.