Как да започна с GPU voxelizer?

Четох различни статии за това как да напиша GPU voxelizer. Доколкото разбирам, процесът протича така:

  1. Проверете триъгълниците поотделно и изберете оста, която показва триъгълника по най-голям начин. Наречете това доминираща ос.
  2. Изобразете триъгълника върху неговата доминираща ос и вземете проби от текселите, които излизат.
  3. Напишете тези текселни данни върху 3D текстура и след това направете каквото искате с данните

Като пренебрегна консервативното растеризиране, имам много въпроси относно този процес.

Стигнах до изобразяване на всеки триъгълник, избиране на доминираща ос и ортогонално проектиране. Какви трябва да бъдат стойностите на ортогоналната проекция? Трябва ли да е някаква стойност, базирана на размера на вокселите или колко голяма област трябва да покрива картата?

Какво трябва да направя във фрагментния шейдър? Как да пиша в моята 3D текстура, така че да съхранява вокселните данни? Доколкото разбирам, поради избора на доминиращата ос не можем да имаме повече от дълбочина от 1 воксел за всеки фрагмент. Въпреки това, тъй като проектирахме ортогонално, не виждам как това ще се отрази върху 3D текстурата.

И накрая, чудя се къде да съхранявам данните за текстурата. Знам, че е лоша идея да съхранявате данни от страна на процесора, тъй като трябва да ги предадете всички, за да ги използвате на графичния процесор, но изходният код, който донякъде следвам, избира да съхранява цялата си текстура от страна на процесора, като тези за светлинна карта. Моето предположение е, че данните, които ще се използват само на графичния процесор, трябва да се съхраняват там, а данните, използвани и на двете, трябва да се съхраняват от страна на процесора. И така, от това съхранявам данните си от страна на процесора. Вярно ли е?

Основните ми източници са: https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf OpenGL Insights https://github.com/otaku690/sparsevoxeloctree SVO, използващ вокселизатор. Проблемът е, че кодът на шейдъра не е в github.


person user975989    schedule 29.06.2015    source източник
comment
Можете да погледнете този CUDA voxelizer, който написах: github.com/Forceflow/cuda_voxelizer   -  person Jeroen Baert    schedule 01.06.2016


Отговори (1)


В моето собствено изпълнение цялата сцена е позиционирана и мащабирана в един куб, центриран върху произхода на света. Тогава матриците modelview-project са ясни. И прозорецът за изглед е просто желаната резолюция на воксел.

Използвам двупроходен подход за извеждане на тези вокселни фрагменти: 1-вото преминаване изчислява броя на изходните вокселни фрагменти чрез натрупване на една променлива с помощта на атомен брояч. След това използвам информацията, за да разпределя линеен буфер.

При второто преминаване растеризираните вокселни фрагменти се съхраняват в разпределения линеен буфер, като се използва атомен брояч, за да се избегне конфликт при запис.

person Cheng-Tso Lin    schedule 30.06.2015