Daniil Petrov
> А там хотя бы одна ссылка есть по существу?
Есть
Ребята.... вы все тут такие умные - прям вах! Однако забыли самый базовый принцип оптимизации рендеринга - это сортировка полигонов и рисование их от ближнего к дальнему, благодаря этому, полигон (а точнее пиксель), который перекрыт не пройдет проверку на глубину при растеризации и будет отброшен. Только с прозрачными полигонами так не выйдет - их нужно рисовать от дальнего к ближнему.
0xc0de
> Daniil Petrov
Рассказываю, как пользоваться интернетом :)
1. Переходишь по той ссылке
2. Сразу же в первых рядах вылезает википедия https://ru.wikipedia.org/wiki/BSP
3. Заходишь в раздел "В информатике":
Bulk synchronous parallel[en] — абстрактная модель параллельных вычислений
Business System Planning — методология разработки информационных систем.
Binary Space Partitioning — структура данных; используется, например, для отображения трёхмерной графики.
Business Server Pages - технология SAP для динамической генерации HTML.
Board Support Package — в операционных системах: код для поддержки конкретной аппаратной платформы.
4. Находишь слова "трехмерная графика"
Парни, вы его запутаете только) Короче BSP это формат уровней квейка. Просто и понятно.
mingw
> сортировка полигонов и рисование их от ближнего к дальнему
Полигоны сейчас никто не сортирует. Модели хранятся в памяти буферами и рисуются часто инстансингом. Для целей early-z test делают дополнительный проход в буфер глубины перед основной отрисовкой.
> Модели хранятся в памяти буферами
Как лучше хранить меши с небольшим (до 200) числом полигонов - каждому по буферу вершин и индексов или как-то можно объединять?
Вот такие размышлизмы:
Если запихивать модели с одним материалом в один вершинный буфер насколько там их уместится, то сократится число переключений вершинного буфера - не знаю насколько это повысит производительность движка. Тут возникает другая проблема - модели в одном буфере вершин могут быть расположены далеко друг от друга на сцене и часть моделей может быть не видна в камеру (причем видимые и невидимые меши могут чередоваться в буфере, что снижает пользу их нахождения в одном буфере).
Кто-нить слышал об adaptive BSP?
zavod3D
> Как лучше хранить меши с небольшим (до 200) числом полигонов - каждому по
> буферу вершин и индексов или как-то можно объединять?
Зависит от ситуации.
> Если запихивать модели с одним материалом в один вершинный буфер насколько там
> их уместится, то сократится число переключений вершинного буфера - не знаю
> насколько это повысит производительность движка.
Необязательно объекты могут иметь один материал, чтобы лежать в одном буфере. Ты можешь хоть все меши запелить в один буфер, а потом рисовать их с заданными оффсетами внутри буфера индексов.
> Тут возникает другая проблема
> - модели в одном буфере вершин могут быть расположены далеко друг от друга на
> сцене и часть моделей может быть не видна в камеру (причем видимые и невидимые
> меши могут чередоваться в буфере, что снижает пользу их нахождения в одном
> буфере).
Зачем рисовать сразу весь буфер, рисуй только те чанки буфера, которые видны.
0xc0de
>Зависит от ситуации.
Я, поэтому, и подумываю сделать в конвертере моделей возможность указания ID вершинного и индексного буфера. в которые нужно грузить меш.
> Необязательно объекты могут иметь один материал, чтобы лежать в одном буфере.
Ты про разные части одной модели, которым назначен разный материал (сабсеты в ID3DXMesh)?
Да, логично, напрмер, меши металлического кузова, резинового колеса и кожетканевой обшивки держать в одном месте (буфере), так как автомобиль обычно тестирую на видимость/невидимость целиком.
> Зачем рисовать сразу весь буфер
Хотел сократить число вызовов DrawIndexedPrimitive
> Ты можешь хоть все меши запелить в один буфер
Ну это вряд ли, емкость буфера ограничена 16 битным беззнаковым целым
zavod3D
> Хотел сократить число вызовов DrawIndexedPrimitive
Сократи через instancing.
> Ну это вряд ли, емкость буфера ограничена 16 битным беззнаковым целым
Индексы могут задаваться и как unsigned int.
0xc0de
> Сократи через instancing.
Я про разные меши в буфере
> Индексы могут задаваться и как unsigned int.
Если позволяет видеокарта
zavod3D
> Я про разные меши в буфере
Про indirect - буфер слышал?
0xc0de
> Про indirect - буфер слышал?
нет
zavod3D
> нет
Погугли, он как раз решает твою проблему. Грубо говоря, это буфер, хранящий смещения (позиции мешей) в твоем индексном буфере :) Заполняешь Indrect буфер, а потом одной командой отрисовываешь сразу все необходимые меши. Кроме того, можно завести еще отдельный буфер, хранящий матрицы трансформаций этих мешей, к нему при отрисовке обращаешься по instance id и получаешь необходимую матрицу для инстанса.
http://vbomesh.blogspot.com/2015/11/opengl-44-instancing-1.html
http://vbomesh.blogspot.com/2015/11/opengl-44-instancing-2.html
Тема в архиве.