Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Текстурирование и инстансинг OPENGL

Текстурирование и инстансинг OPENGL

Поделиться
IvashkaПользовательwww10 ноя. 201721:28#0
Собственно работая над проЭктом дошёл до стадии требующей непременной оптимизации. И так суть сегодняшней работы сократить количество drawcall'ов. Есть тысячи обьектов, естественно все сразу не рендеряться а проходят фильтрацию по попаданию во фрустум и уловому размеру в пикселях, но один хрен количество рисуемых обьектов велико. Есть ещё одно обстоятельство в 99 процентах эти обьекты являются либо точками от одного до двух пикселей либо сферами, и естественно сей факт сурово указывает на применение инстансинга (имхо). Ну собственно начнём с точек, точки это обьекты находящиеся далеко от камеры и имеющий угловой размер в пикселях не более 2, ну т.е. я вычесляю размер обьекта в пикселях и если размер менее 2 пикселей я просто кидаю координаты обьекта в массив с остальными подобными обьектами, точный размер кидаю в отдельный массив атрибутов. В шейдере по атрибуту (размер в пикселях) вычисляю яркость точки ну и собственно рисую сразу все точки одним вызовом, тут нормально. Теперь перехожу к обьектам а точнее к сферам (обьекты неправильной формы типа уникальных астеройдов приходится рисовать отдельными дравколами но их обычно одновременно в экране один или несколько штук, т.е. в принципе не критично, но на кольцах сатурна в принципе это критично но такие кольца пока не делаю). И так сферы, ну вот значит отбираю я обьекты (планеты,спутники) рендерящиеся в виде сфер (а именно собираю их координаты и диаметр) в массив по принципу звёзд а в качестве геометрии использую один VBO с залитой в него сферой. Ну и собственно надо отрисовать инстансингом эту сферу несколько раз например в системе Юпитера саму планету и спутники. Вот тут и трабла у каждого шарика своя текстурка и вроде надо просто передавать в шейдер массив с указателями на id текстуры и в шейдере по id применять но читаю сёдня весь вечер в сети разные статьи и сайты нету внятной инфы по такой технике, ну или я просто косой. Ну собственно суть Инстансинг и Масив Текстур.
gkv311Постоялецwww10 ноя. 201722:47#2
Вот тут и трабла у каждого шарика своя текстурка и вроде надо просто передавать в шейдер массив с указателями на id текстуры и в шейдере по id применять но читаю сёдня весь вечер в сети разные статьи и сайты нету внятной инфы по такой технике, ну или я просто косой. Ну собственно суть Инстансинг и Масив Текстур.

Bindless textures существуют, но они до сих пор не везде поддерживаются (привет, Intel).

Но если говорить об инстансинге, то, наверное, разрешение текстур должно быть ограничено и текстуры должны быть одинакового размера - тогда напрашивается создание текстурного атласа или простого texture array.

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

Вопрос то в чём?

IvashkaПользовательwww10 ноя. 201722:58#3
Собственно ограничен версией 3.2 glMultiDrawElementsIndirect нету. Трабла в общем в передачи в шейдер массива текстур не фиксированой длины. Текстуры одинакового размера, текстурный атлас создавать не вариант (только  наверное процедурно), ведь количество обьектов постоянно меняется. Вот работа с texture array наверное есть суть топика.
IvashkaПользовательwww10 ноя. 201723:05#4
nonamezerox
Понял с texture array разобрался.
nonamezerox
gkv311
Благодарствую.

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр