Предположим, у меня есть три сетки A, B, C в одном VBO, и я использую glMultiDrawElementsIndirect
со счетчиком экземпляров, установленным на 1, 0 и 1 для A, B и C соответственно, и счетчиком отрисовки, установленным на 3. Каково будет значение gl_DrawID в вершинном шейдере? Будет ли это 0 для (вершин) A, 1 для B, 2 для C или он пропустит B и присвоит 1 C?
На справочном веб-сайте указано, что это «эквивалентно» вызову нескольких glDrawElementsInstancedBaseVertexBaseInstance
, равных количеству розыгрышей, поэтому ответом должен быть первый случай.
«Ничьи» — это не примеры. Конкретный розыгрыш в мультитираже может иметь экземпляры, но это разные вещи. Экземпляр — это повторение одной и той же сетки с другим индексом экземпляра (и/или входными данными VS для каждого мгновения). При отрисовке используется другая сетка (это может быть та же самая сетка, но это не обязательно).
Идентификатор розыгрыша для A
будет равен 0, для B
будет 1 и для C
будет 2. Но поскольку вы установили количество экземпляров равным 0, B
не будет отрисовываться вообще. Однако он по-прежнему считается вызовом отрисовки, поэтому на идентификатор отрисовки не повлияет тот факт, что он не был отрисован.
@GeraldoChristiano: если вы пишете косвенные команды и знаете, что B не будет виден... не вызывайте для него вызов отрисовки и не помещайте параметры для его рендеринга в буфер, который использует шейдер будет доступ для получения матриц и прочего. То есть, если сетка видна, увеличьте атомарное значение и запишите параметры для вызова отрисовки по этому индексу в массиве вызовов отрисовки. Эта атомарная переменная сообщит вам, сколько вызовов отрисовки необходимо сделать.
Как бы я получил матрицы моделей для A и C, если бы я поместил матрицы моделей для всех сеток в массив в UBO (или SSBO)? Нужно ли мне создавать новый буфер, который будет заполнен вычислительным шейдером?
Неважно. Я только что прочитала этот пост.
Итак, если я выполняю отсечение усеченного конуса на графическом процессоре с помощью вычислительного шейдера и мне нужно нарисовать только A и C, тогда я бы установил количество экземпляров B равным 0. Это «стандартный» способ сделать это?