Четох различни статии за това как да напиша GPU voxelizer. Доколкото разбирам, процесът протича така:
- Проверете триъгълниците поотделно и изберете оста, която показва триъгълника по най-голям начин. Наречете това доминираща ос.
- Изобразете триъгълника върху неговата доминираща ос и вземете проби от текселите, които излизат.
- Напишете тези текселни данни върху 3D текстура и след това направете каквото искате с данните
Като пренебрегна консервативното растеризиране, имам много въпроси относно този процес.
Стигнах до изобразяване на всеки триъгълник, избиране на доминираща ос и ортогонално проектиране. Какви трябва да бъдат стойностите на ортогоналната проекция? Трябва ли да е някаква стойност, базирана на размера на вокселите или колко голяма област трябва да покрива картата?
Какво трябва да направя във фрагментния шейдър? Как да пиша в моята 3D текстура, така че да съхранява вокселните данни? Доколкото разбирам, поради избора на доминиращата ос не можем да имаме повече от дълбочина от 1 воксел за всеки фрагмент. Въпреки това, тъй като проектирахме ортогонално, не виждам как това ще се отрази върху 3D текстурата.
И накрая, чудя се къде да съхранявам данните за текстурата. Знам, че е лоша идея да съхранявате данни от страна на процесора, тъй като трябва да ги предадете всички, за да ги използвате на графичния процесор, но изходният код, който донякъде следвам, избира да съхранява цялата си текстура от страна на процесора, като тези за светлинна карта. Моето предположение е, че данните, които ще се използват само на графичния процесор, трябва да се съхраняват там, а данните, използвани и на двете, трябва да се съхраняват от страна на процесора. И така, от това съхранявам данните си от страна на процесора. Вярно ли е?
Основните ми източници са: https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf OpenGL Insights https://github.com/otaku690/sparsevoxeloctree SVO, използващ вокселизатор. Проблемът е, че кодът на шейдъра не е в github.