В документации сказано "аналогично".«Эквивалент» - это не одно и то же.Это также указывает на 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.Он также динамически однороден, поэтому вы можете использовать его для доступа к массивам непрозрачных типов в шейдерах.