Привет )
Вобщем вопрос давольно простой и простой ответ я на него знаю, но хочется услышать мнения или другие варианты
Простая идея звучит следующем образом, на каждую модель есть свои матрицы и чтобы вывести две и более модели нам нужен массив матриц + позиция матрицы в вершине, звучит громозко
- отсечь не нужную геометрию
- если требуется перестройка батча пройтись по всем ( вот уже не нравится ) вершинам модели
- задать индекс матрицы
- залить обратно все в VBO ( вот тоже не нравится )
- при рендере передать массив матриц ( допустим ок )
других вариантов нету ?
вижу выход из этой ситуации только в статичном батчинге, но ведь и она будет отсекаться и получается палка с двумя концами ( либо выводить и игнорировать отсечение до полного вывода всего батча, либо перестраивать :( )
Вобщем решил поинтересоваться как делают люди и может есть более интересный вариант ?
ЗЫ да я понимаю что технически шейдеру нужно откудо то брать матрицу специально под нужную вершину и фактически не какого другого способа кроме индексации тут нету, но я люблю ошибаться )
ЗЫЫ инстанcинг не предлагать ;)
можно залить несколько моделей в 1 пару VBO (вертексы + индексы) и рисовать в несколько вызовов glDrawElementsBaseVertex (для каждого свои шейдеры / текстуры / матрицы)
Батчить статическую геометрию, а отсекать невидимые трианглы при тесселяции.
I
> позиция матрицы в вершине
Что это?
Executor
> Что это?
Привет )
это особая магия %), а если серьезно то при трансформации вершины в вершином шейдере мы же должны как то понять какой матрицей ее трансформировать, не конечно можно обсчитать все вершины на CPU и т/д/, но тут в силу вступают например параметры материала, можно попробовать заставить шейдер угадать, но боюсь результат будет не тот )
наверно я просто не так выразился, я иммел ввиду индекс матрицы в массиве матриц )
> Батчить статическую геометрию, а отсекать невидимые трианглы при тесселяции.
можно итак ) для ПС рендера сделаю, на мобильниках прийдется пока по другому выкручиваться )
> можно залить несколько моделей в 1 пару VBO (вертексы + индексы) и рисовать в
> несколько вызовов glDrawElementsBaseVertex (для каждого свои шейдеры / текстуры
> / матрицы)
спасибо, посмотрю ) правда этот вариант как и выше пойдет только в ПС версию рендера )
I
> не конечно можно обсчитать все вершины на CPU и т/д/, но тут в силу вступают
> например параметры материала,
Ты хочешь чтобы всё сразу и без инстансинга
innuendo
> Ты хочешь чтобы всё сразу и без инстансинга
Я просто тут выпал на энное количество времени и подумал, а вдруг умные дядьки придумали ), да и вообще не особо подкован в этом вопросе
ЗЫ про инстансинг то итак понятно, сделаю обязательно там где это возможно ( к сожалению не везде )
Я так понял ты хочешь аппаратный occlusion query?
Придумали conditional rendering, но как всегда поддержка вендорами оставляет желать лучшего.
I
> наверно я просто не так выразился, я иммел ввиду индекс матрицы в массиве матриц )
Я понял.
Можно передавать массив индексов. Размер массива будет соответствовать количеству вершин.
То есть будет типа так matrices[matIndices[VertexID]]
Но я бы подумал на твоём месте лучше о инстансинге. Есть такой хак, позволяющий инстансингом рендерить разную геометрию.
Какая шейдерная модель-то?
В ОГЛ разве нельзя несколько VBO сливать для шейдера? В одном можно было бы хранить вершины, а в другом - индексы матриц. Меньше данных пришлось бы гонять по шине.
Ты вообще уверен, что у тебя ботлнек именно в этом моменте и что именно он требует оптимизации?
MrShoor
> Я так понял ты хочешь аппаратный occlusion query?
> Придумали conditional rendering, но как всегда поддержка вендорами оставляет
> желать лучшего.
спасибо почитаю )
Executor
> Можно передавать массив индексов. Размер массива будет соответствовать
> количеству вершин.
> То есть будет типа так matrices[matIndices[VertexID]]
спасибо попробую
Executor
> Но я бы подумал на твоём месте лучше о инстансинге. Есть такой хак, позволяющий
> инстансингом рендерить разную геометрию.
Инстансинг будет 100%, так что конечно там где он будет батчинг будет сделан через него, кстати какой хак ? где почитать ? )
slava_mib
> Ты вообще уверен, что у тебя ботлнек именно в этом моменте и что именно он
> требует оптимизации?
Сейчас точно нету ботлнека, вопрос из разряда на ближайшее будущее, чтобы понимать как можно это сделать ( хотя может и сейчас сделаю в выключеном режиме )
slava_mib
> В ОГЛ разве нельзя несколько VBO сливать для шейдера? В одном можно было бы
> хранить вершины, а в другом - индексы матриц. Меньше данных пришлось бы гонять
> по шине.
да, я уже понял что это выход )
slava_mib
> Какая шейдерная модель-то?
120+
Executor
> Есть такой хак, позволяющий инстансингом рендерить разную геометрию.
Не разную, а одну и туже, но с разными, н-р, матрицами.
> Можно передавать массив индексов. Размер массива будет соответствовать количеству вершин.
> То есть будет типа так matrices[matIndices[VertexID]]
Да но как передать массив матриц? И размер массива матриц тогда тоже должен соответствовать количеству вершин. И смысл тогда в массиве индексов на матрицы.
Пока вижу решение такое в каждой вершине указывать индекс матрицы.
А массив матрицы передавать через константные буферы.
asvp
> Да но как передать массив матриц? И размер массива матриц тогда тоже должен
> соответствовать количеству вершин. И смысл тогда в массиве индексов на матрицы.
а почему нельзя в масиве индексах повторять индексы матриц ?
ну к примеру как я понял основную идею
a) (vec3(,,),vec3(,,),vec3(,,))
б) vec3(,,),vec3(,,),vec3(,,))
допустим а) это образно вершины первой модели, а б) второй, тогда индекс индексов будет такой
000111
так как вершин в примере 6 и три первых это первая модель, а три последних это вторая, соответственно индексы для второй модели указывают на вторую матрицу в массиве, а индексы первой на первую
а массив матриц передавать просто юниформами
uniform mat4[0] <- первая матрица для первой модели
uniform mat4[1] <- вторая матрица для второй модели
I
> а массив матриц передавать просто юниформами
> uniform mat4[0] <- первая матрица для первой модели
> uniform mat4[1] <- вторая матрица для второй модели
Это и есть передача через константные буферы. И это же не массив матриц.
Да как ты передашь массив вершин и массив индексов одновременно в шейдер?
asvp
> Да как ты передашь массив вершин и массив индексов одновременно в шейдер?
как отдельный атрибут, не ? при слиянии двух VBO он будет такой же как к примеру нормали
Тема в архиве.