Функции glMultiDraw и gl_InstanceID - PullRequest
0 голосов
/ 06 июня 2018

Когда я смотрю на документацию glMultiDrawElementsIndirect (или в Wiki ), он говорит, что один вызов glMultiDrawElementsIndirect эквивалентен повторному вызову glDrawElementsIndirect (просто с другими параметрами).

Означает ли это, что gl_InstanceID будет сбрасываться для каждого из этих "внутренних" вызовов?И если да, то как я могу различать все эти вызовы отдельно в моем вершинном шейдере?

Справочная информация: Я пытаюсь нарисовать все свои разные сетки одновременно.Но мне нужен какой-то способ узнать, к какой сетке принадлежит вершина, которую я обрабатываю в моем вершинном шейдере.

1 Ответ

0 голосов
/ 06 июня 2018

В документации сказано "аналогично".«Эквивалент» - это не одно и то же.Это также указывает на glDrawElementsInstancedBaseVertexBaseInstance, а не glDrawElementsInstanced.

Но да, gl_InstanceId для любого розыгрыша начнется с нуля, независимо от того, какой базовый экземпляр вы предоставляете.Вот как gl_InstanceId работает , к сожалению.

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

И если да, то как я могу отличить все эти вызовы в моемвершинный шейдер?

Если у вас нет OpenGL 4.6 или ARB_shader_draw_parameters, вы не можете.Ну, не напрямую.

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

Типичным решением pre-shader_draw_parameters было бы использование уникального базового экземпляра.на каждом из отдельных розыгрышей.Конечно, поскольку gl_InstanceId не отслеживает базовый экземпляр (как было сказано ранее), вам нужно будет использовать экземпляры массивов вместо .Таким образом, вы получите индекс сетки из этого.

Конечно, 4.6 / shader_draw_parameters дает вам gl_DrawId, который просто говорит вам, что индекс находится в команде multidraw.Он также динамически однороден, поэтому вы можете использовать его для доступа к массивам непрозрачных типов в шейдерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...