Объемный рендеринг больших данных упаковкой текстуры

Я хочу реализовать рендеринг объемного рендеринга лучей на основе графических процессоров больших наборов данных, которые больше, чем память GPU. Я пытаюсь сделать так:

(1) Сначала я делю объем на кирпичи одинакового размера.

(2) Затем я решаю, является ли каждый кирпич прозрачным или нет в соответствии с передаточной функцией.

(3) Затем я сохраняю непрозрачный кирпич в "упакованной текстуре". Для выборки во время рендеринга с использованием лучей я создаю еще одну текстуру под названием "индекс-текстура", в которой индекс кирпича хранится в упакованной текстуре.

Когда я делаю выборку во время рендеринга в шейдере, сначала я вычисляю, в каком кирпиче находится точка выборки. И затем я получаю доступ к Index-Texture, чтобы получить значение точки выборки. Но по умолчанию это значение после интерполяции и не правильно указатель кирпича в упакованной текстуре.

Итак, мой вопрос: когда делать выборку во время рендеринга приведения лучей, как правильно получить индекс кирпича (в котором находится точка выборки) в Packed-Texture из Index-Texture?

1 ответ

Это на самом деле не проблема, скажем, ваш куб объема идет от [0, 1]³, и вы разбиваете его, скажем, на 8 блоков в каждом направлении. Затем умножьте дробную координату на 8 (или что угодно) и округлите до ближайшего целого числа, которое даст вам индекс. После округления вниз вычитаете индекс из масштабированной дробной координаты, которая дает вам дробную позицию в подблоке, т.е.

volcube_pos = volcube_frac_pos * volcube_blocks;
volcube_index = (int)floor(volcube_pos);
subblock_pos = volcube_pos - volcube_index;

Теперь все эти блоки должны где-то храниться. Чтобы поместить их в обычную упакованную трехмерную текстуру, необходимо отключить фильтрацию, позаботиться о проблеме забора ( /questions/18983224/teksturnyie-koordinatyi-opengl-v-prostranstve-pikselej/18983234#18983234) и выполнить всю фильтрацию интерполяции самостоятельно.

Другой подход вместо упакованных текстур, я собираюсь разобраться в себе - как это происходит, я сейчас работаю над объемным рендерингом - использовать бесконечные текстуры NVidia.

Другие вопросы по тегам