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

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

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

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

(3) Затем я сохраняю непрозрачный кирпич в «Упакованной текстуре». Чтобы сделать выборку во время рендеринга raycasting, я создаю другую текстуру, называемую «Индексная текстура», которая хранит индекс кирпича в упакованной текстуре.

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

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


person XiaJun    schedule 24.10.2012    source источник


Ответы (1)


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

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

Теперь все эти блоки нужно где-то хранить. Помещение их в обычную упакованную 3D-текстуру требует, чтобы вы отключили фильтрацию, позаботились о проблеме с забором ( https://stackoverflow.com/a/5879551/524368 ) и выполнить всю интерполяцию фильтрации самостоятельно.

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

person datenwolf    schedule 24.10.2012
comment
Большое спасибо. Я рассчитываю индексы блоков и дробную позицию в подблоке, как вы сказали, и сохраняю их в Packed-Texture. Я хочу получить индексы блоков из Index-Texture и использовать их для доступа к Packed-Texture. Не могли бы вы сказать мне, какие функции я могу использовать, чтобы сделать всю интерполяцию фильтрации самостоятельно? - person XiaJun; 25.10.2012