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