Как начать работу с графическим вокселизатором?

Я читал различные статьи о том, как написать вокселизатор GPU. Насколько я понимаю, процесс выглядит так:

  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, использующий вокселизатор. Проблема в том, что кода шейдера нет на гитхабе.


person user975989    schedule 29.06.2015    source источник
comment
Вы можете взглянуть на этот вокселизатор CUDA, который я написал: github.com/Forceflow/cuda_voxelizer   -  person Jeroen Baert    schedule 01.06.2016


Ответы (1)


В моей собственной реализации вся сцена позиционируется и масштабируется в один единичный куб с центром в начале координат мира. Матрицы модели-проекта тогда просты. А вьюпорт — это просто желаемое воксельное разрешение.

Я использую двухпроходный подход для вывода этих фрагментов вокселей: 1-й проход вычисляет количество выходных фрагментов вокселей путем накопления одной переменной с использованием атомарного счетчика. Затем я использую информацию для выделения линейного буфера.

Во 2-м проходе растеризованные фрагменты вокселей сохраняются в выделенном линейном буфере с использованием атомарного счетчика, чтобы избежать конфликта записи.

person Cheng-Tso Lin    schedule 30.06.2015