Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Software rendering/ occlusion culling (2 стр)

Software rendering/ occlusion culling (2 стр)

Advanced: Тема повышенной сложности или важная.
Страницы: 1 2 3 Следующая »
BernsПостоялецwww1 авг. 201818:56#15
оказалось, код растеризатора топорный, буду переписывать. ибо такую чепуху с трисами вытворяет при некоторых условиях
eDmkУчастникwww2 авг. 201818:14#16
Здесь можно посмотреть:
https://habr.com/post/248159/

Вот писал по хабравским урокам:
https://yadi.sk/i/R2eitAvY3SJRKH

BernsПостоялецwww2 авг. 201818:23#17
Наконец-то сделал. Нужно было вершины по всем координатам свопить.  Что там дальше? Backface culling? Матрицы?

Изображение

FordPerfectПостоялецwww2 авг. 201820:55#18
Berns
おめでとう!

А можно озвучить ТТХ исходной задачи, из-за которой occlusion culling?
От этого зависит приоритет что когда оптимизировать.

BernsПостоялецwww2 авг. 201822:00#19
Конечно. Я планировал добавить в свой движок оптимизацию, чтобы избежать "швов" от переходов между открытым миром и помещениями, а помещения в свою очередь обильнее обставлять высокополигональным интерьером. Frustum culling тут недостаточно. Сортировка по расстоянию при некоторых обстоятельствах облегчает влияние bandwidth, остается цена за DIP и за полигоны, особенно на анимированные, где на вертекс 13 умножений матриц . Дома и стены - хорошие окклюдеры, по идее можно даже колизионный меш отрисовывать. К слову, уже сыро проделывал такой алгоритм на GPU - брал буфер индекса из G буфера и маппил, но остался недоволен скоростью операции, ибо даже текстура 1x1 роняла фреймрейт до 120 кадров. А тут софтверный 400 кадров/сек рисует, на процессоре 2011 года без многопоточки и полной оптимизации.
FordPerfectПостоялецwww3 авг. 20180:01#20
Berns
> А тут софтверный 400 кадров/сек рисует
В каком разрешении?
HolyDelПостоялецwww3 авг. 20180:31#21
FordPerfect
> В каком разрешении?

нульпост:
Berns
> Разрешение наверное 256x128

FordPerfectПостоялецwww3 авг. 20180:52#22
Ну вот и интересно, разрешение то же самое что и предполагалось, или сменил?

Та демка от Intel что выше была - они вообще в fullscreen рендерят, и им помогает. Но у них 20 тредов.
Та статья, которая с сайта, вроде тоже в fullscreen более-менее тянет.

Правка: 3 авг. 2018 0:52

BernsПостоялецwww3 авг. 201813:54#23
Для финального occlusion culling планировал примерно 256x128, ну или разрешение экрана деленное на 8. 400 кадров/сек - это на картинку, которую скинул сверху, там около 1200 треугольников, разрешение примерно 900x400. Разве что отключаю вывод изображения на экран, ибо все равно пишется в оперируемый массив, а API много кушает. Уже кстати меньше выдает, ибо внедряю матрицы и добавляю фиксы и плюшки, вроде clamp.
eDmkУчастникwww3 авг. 201817:03#24
№1. 1.1 млн полигонов: https://yadi.sk/i/rS9EZpni3ZsPuu
№2. 488 тысяч полигонов: https://yadi.sk/i/p1jDdZy43ZsQ2Q

Разрешение 1024x768.
Включен Blending.
FaceCulling включен.
Почти без оптимизации.
1 поток (ядро).
Delphi XE6 Prof.

С оптимизацией и 20 потоков №1 ~50 fps в разрешении 2560x1600
С оптимизацией и 20 потоков №2 ~60 fps в разрешении 2560x1600

Правка: 3 авг. 2018 17:06

FordPerfectПостоялецwww3 авг. 201819:56#25
eDmk
Fillrate? Сколько типично пикселей в кадре рисуется?
eDmkУчастникwww3 авг. 201820:15#26
>Fillrate? Сколько типично пикселей в кадре рисуется?
Каждый обсчитывается. Как филрейт считается - не знаю.
Это же от пропускной способности памяти зависит.
У меня 15 Гб/с всего. ЦПУ много не выдаст в отличие от видюхи.
Поэтому многопоточность не особо помогает. Шина забита данными по максимуму.

Правка: 3 авг. 2018 20:16

BernsПостоялецwww5 авг. 201814:53#27
Итак, продолжаю бодаться с матрицами. Беру вершины, множу 4-мерный вектор (x, y, z, 1.f) на матрицу, затем делю нормализатор w на 255 (пока подгоняю),
затем делю трансформированные вершины вот так:
  pout_A.x / pout_A.w, pout_A.y / pout_A.w, pout_A.z / pout_A.w,
  pout_B.x / pout_B.w, pout_B.y / pout_B.w, pout_B.z / pout_B.w,
  pout_C.x / pout_C.w, pout_C.y / pout_C.w, pout_C.z / pout_C.w

не могу раскусить суть рендера Directx. Там пространство представлено в виде float в диапазоне 0...1, софтверный же рендер требует целых чисел, но я не могу уловить, на какой стадии и в каком порядке это подгонять. Умножать скринспейсные координаты x и y на разрешение рендера перед отправкой треугольника в растеризатор?

FordPerfectПостоялецwww5 авг. 201817:57#28
Berns
> затем делю нормализатор w на 255
Это вообще нафига?

Есть у нас исходная вершина (4-вектор).
Умножаем её на ModelView матрицу. Получаем координаты в eye-space.
Умножаем её на Projection матрицу. Получаем координаты в clip-space.
Проводим отсечение: -w<=x,y,z<=+w для OpenGL, -w<=x,y<=+w, 0<=z<=+w для DirectX.
Делим на w. Получаем координаты в NDC-space. -1<=X,Y,Z<=+1 для OpenGL, -1<=X,Y<=+1, 0<=Z<=+1 для DirectX.
Применяем Viewport трансформацию. Получаем экранные координаты. 0<=x<=width, 0<=y<=height, 0<=z<=1.
Приводим к целочисленным координатам. Обычно subpixel (4 или 8 бит subpixel), но для occlusion culling можно и забить.
Растеризуем.
https://www.khronos.org/registry/OpenGL/specs/gl/glspec21.pdf (2.11, 2.13, 3.*)
https://docs.microsoft.com/en-us/windows/desktop/direct3d11/d3d10… tting-started
https://docs.microsoft.com/en-us/windows/desktop/direct3d11/d3d10… r-stage-rules

BernsПостоялецwww5 авг. 201818:34#29
Чтобы подогнать clip-space в целочисленные координаты скринспейса. С этим пока и задачка, не могу подружить размеры цели рендера с углом обзора.

Потом провожу отсечение по нормализатору, иначе модель рисуется с обеих сторон:

if ((pout_A.w > 0.f) && (pout_B.w > 0.f) && (pout_C.w > 0.f)) continue;


Потом проверяю на clamp все три стороны треугольника, если все они за пределом пространаства экрана - треугольник не растеризуется.

Страницы: 1 2 3 Следующая »

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

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