Войти
ПрограммированиеФорумГрафика

Батчинг геометрии, вопрос о подходе

Страницы: 1 2 Следующая »
#0
18:40, 13 фев 2014

Привет )

Вобщем вопрос давольно простой и простой ответ я на него знаю, но хочется услышать мнения или другие варианты

Простая идея звучит следующем образом, на каждую модель есть свои матрицы и чтобы вывести две и более модели нам нужен массив матриц + позиция матрицы в вершине, звучит громозко
- отсечь не нужную геометрию
- если требуется перестройка батча пройтись по всем ( вот уже не нравится ) вершинам модели
- задать индекс матрицы
- залить обратно все в VBO ( вот тоже не нравится )
- при рендере передать массив матриц ( допустим ок )

других вариантов нету ?

вижу выход из этой ситуации только в статичном батчинге, но ведь и она будет отсекаться и получается палка с двумя концами ( либо выводить и игнорировать отсечение до полного вывода всего батча, либо перестраивать :( )

Вобщем решил поинтересоваться как делают люди и может есть более интересный вариант ?

ЗЫ да я понимаю что технически шейдеру нужно откудо то брать матрицу специально под нужную вершину и фактически не какого другого способа кроме индексации тут нету, но я люблю ошибаться )

ЗЫЫ инстанcинг не предлагать ;)

#1
18:49, 13 фев 2014

можно залить несколько моделей в 1 пару VBO (вертексы + индексы) и рисовать в несколько вызовов glDrawElementsBaseVertex (для каждого свои шейдеры / текстуры / матрицы)

#2
23:22, 13 фев 2014

Батчить статическую геометрию, а отсекать невидимые трианглы при тесселяции.

#3
12:58, 14 фев 2014

I
> позиция матрицы в вершине

Что это?

#4
13:04, 14 фев 2014

Executor
> Что это?
Привет )
это особая магия %), а если серьезно то при трансформации вершины в вершином шейдере мы же должны как то понять какой матрицей ее трансформировать, не конечно можно обсчитать все вершины на CPU и т/д/, но тут в силу вступают например параметры материала, можно попробовать заставить шейдер угадать, но боюсь результат будет не тот )

наверно я просто не так выразился, я иммел ввиду индекс матрицы в массиве матриц )

> Батчить статическую геометрию, а отсекать невидимые трианглы при тесселяции.
можно итак ) для ПС рендера сделаю, на мобильниках прийдется пока по другому выкручиваться )


> можно залить несколько моделей в 1 пару VBO (вертексы + индексы) и рисовать в
> несколько вызовов glDrawElementsBaseVertex (для каждого свои шейдеры / текстуры
> / матрицы)

спасибо, посмотрю ) правда этот вариант как и выше пойдет только в ПС версию рендера )

#5
13:07, 14 фев 2014

I
> не конечно можно обсчитать все вершины на CPU и т/д/, но тут в силу вступают
> например параметры материала,

Ты хочешь чтобы всё сразу и без инстансинга

#6
13:10, 14 фев 2014

innuendo
> Ты хочешь чтобы всё сразу и без инстансинга

Я просто тут выпал на энное количество времени и подумал, а вдруг умные дядьки придумали ), да и вообще не особо подкован в этом вопросе


ЗЫ про инстансинг то итак понятно, сделаю обязательно там где это возможно ( к сожалению не везде )

#7
13:48, 14 фев 2014

Я так понял ты хочешь аппаратный occlusion query?
Придумали conditional rendering, но как всегда поддержка вендорами оставляет желать лучшего.

#8
13:55, 14 фев 2014

I
> наверно я просто не так выразился, я иммел ввиду индекс матрицы в массиве матриц )

Я понял.
Можно передавать массив индексов. Размер массива будет соответствовать количеству вершин.
То есть будет типа так matrices[matIndices[VertexID]]
Но я бы подумал на твоём месте лучше о инстансинге. Есть такой хак, позволяющий инстансингом рендерить разную геометрию.

#9
13:55, 14 фев 2014

Какая шейдерная модель-то?

В ОГЛ разве нельзя несколько VBO сливать для шейдера? В одном можно было бы хранить вершины, а в другом - индексы матриц. Меньше данных пришлось бы гонять по шине.

Ты вообще уверен, что у тебя ботлнек именно в этом моменте и что именно он требует оптимизации?

#10
14:15, 14 фев 2014

MrShoor
> Я так понял ты хочешь аппаратный occlusion query?
> Придумали conditional rendering, но как всегда поддержка вендорами оставляет
> желать лучшего.

спасибо почитаю )

Executor
> Можно передавать массив индексов. Размер массива будет соответствовать
> количеству вершин.
> То есть будет типа так matrices[matIndices[VertexID]]

спасибо попробую

Executor
> Но я бы подумал на твоём месте лучше о инстансинге. Есть такой хак, позволяющий
> инстансингом рендерить разную геометрию.
Инстансинг будет 100%, так что конечно там где он будет батчинг будет сделан через него, кстати какой хак ? где почитать ? )

slava_mib
> Ты вообще уверен, что у тебя ботлнек именно в этом моменте и что именно он
> требует оптимизации?
Сейчас точно нету ботлнека, вопрос из разряда на ближайшее будущее, чтобы понимать как можно это сделать ( хотя может и сейчас сделаю в выключеном режиме )

slava_mib
> В ОГЛ разве нельзя несколько VBO сливать для шейдера? В одном можно было бы
> хранить вершины, а в другом - индексы матриц. Меньше данных пришлось бы гонять
> по шине.
да, я уже понял что это выход )

slava_mib
> Какая шейдерная модель-то?
120+

#11
14:30, 14 фев 2014

Executor
> Есть такой хак, позволяющий инстансингом рендерить разную геометрию.
Не разную, а одну и туже, но с разными, н-р, матрицами.

> Можно передавать массив индексов. Размер массива будет соответствовать количеству вершин.
> То есть будет типа так matrices[matIndices[VertexID]]
Да но как передать массив матриц? И размер массива матриц тогда тоже должен соответствовать количеству вершин. И смысл тогда в массиве индексов на матрицы.

Пока вижу решение такое в каждой вершине указывать индекс матрицы.
А массив матрицы передавать через константные буферы.

#12
14:39, 14 фев 2014

asvp
> Да но как передать массив матриц? И размер массива матриц тогда тоже должен
> соответствовать количеству вершин. И смысл тогда в массиве индексов на матрицы.
а почему нельзя в масиве индексах повторять индексы матриц ?

ну к примеру как я понял основную идею
a) (vec3(,,),vec3(,,),vec3(,,))
б) vec3(,,),vec3(,,),vec3(,,))

допустим а) это образно вершины первой модели, а б) второй, тогда индекс индексов будет такой
000111
так как вершин в примере 6 и три первых это первая модель, а три последних это вторая, соответственно индексы для второй модели указывают на вторую матрицу в массиве, а индексы первой на первую

а массив матриц передавать просто юниформами
uniform mat4[0] <- первая матрица для первой модели
uniform mat4[1] <- вторая матрица для второй модели

#13
14:49, 14 фев 2014

I
> а массив матриц передавать просто юниформами
> uniform mat4[0] <- первая матрица для первой модели
> uniform mat4[1] <- вторая матрица для второй модели
Это и есть передача через константные буферы. И это же не массив матриц.

Да как ты передашь массив вершин и массив индексов одновременно в шейдер?

#14
14:51, 14 фев 2014

asvp
> Да как ты передашь массив вершин и массив индексов одновременно в шейдер?
как отдельный атрибут, не ? при слиянии двух VBO он будет такой же как к примеру нормали

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.