Объемный рендеринг: путаница с компоновкой от начала до конца

#math #graphics #rendering #volume #composite

#математика #графика #рендеринг #объем #композитный

Вопрос:

Например, в GPU Gems уравнение компоновки «от начала до конца» (для цвета) равно

C ‘i = (1 — A’i-1)C i C ‘i-1

где C ‘i — накопленное значение цвета на выходе; A’i-1 — накопленное значение альфа (непрозрачности) до предыдущего вокселя; C i — значение цвета для текущего вокселя; и C ‘i-1 — накопленное значение цвета до предыдущего вокселя.

Эта формулировка вызывает у меня два вопроса:

  1. Завершение от начала до конца происходит, как только накопленная непрозрачность достигает примерно 1. Что же тогда делать с цветовыми каналами (RGB), которые превышают максимум до достижения предела непрозрачности? Вы просто фиксируете значения между 0 .. 255 (например, 500,1000,2000 станет 255,255,255), или смотрите на соотношение между каналами (например, 500,1000,2000 станет 64,128,255).

  2. Ответ на предыдущий вопрос, возможно, связан с этим. Цветопередача текущего вокселя зависит от единицы минус накопленная непрозрачность. Что, если накопленная непрозрачность равна нулю, а непрозрачность текущего вокселя равна нулю? — на выходе получается полностью непрозрачный воксел, поскольку (1 — A’i-1) = 1, хотя предположительно это прозрачный воксел!?

Любые подсказки высоко ценятся.

Комментарии:

1. формула рекурсивна, как вы получаете ‘_0 и C’_0?

2. @Eugeny89: хороший вопрос! Я понятия не имею и не могу найти ссылки, чтобы рассказать мне! Я предполагаю, что 0 для обоих (т. Е. Прозрачный черный).

3. Может быть важно знать, умножены ли цвета (или должны быть) предварительно на альфа. Если предварительно умножить, то они не должны достигать максимума до тех пор, пока не будет достигнута непрозрачность.

4. @Adrian: А, это интересно. Я обнаружил, что все начинает обретать смысл, если я умножаю непрозрачность текущего вокселя, а также на единицу минус накопленную непрозрачность. Однако ни одна из документации, которую я нашел, не делает этого таким образом,

5. Да, обычно вы начинаете с A (0) = 0 и C (0) = 0. Я знаю другую ссылку, которая дает уравнение в виде C ‘ (i) = (1-A’ (i-1)) * C (i) * A (i) C’ (i-1), что было бы неумноженной альфа-версией. Я нахожу, что версия без предварительного умножения более интуитивно понятна; она говорит, что в луч попадает столько воксельного цвета, сколько присутствует материала.

Ответ №1:

  1. Значения A и C должны быть в диапазоне 0-1. (Если вы используете байты без знака в качестве представления, разделите на 255,0, но учтите, что для некоторых областей приложений объемного рендеринга это даст вам недостаточный контроль над небольшими областями альфа / низкой непрозрачности, чтобы действительно быть удовлетворительным. В наши дни, как правило, проще вычислять, используя значения с плавающей точкой с самого начала). Оказывается, что значения alpha и color никогда не смогут выйти за пределы этого диапазона, используя ваши формулы.

  2. Последовательность для альфа-луча A’ равна A'(i) = (1-A'(i-1)).A (i) A’ (i-1) (где A (i) — альфа вокселя), поэтому, если ваш накопленный луч начинается с ‘ нуля и проходит через прозрачный воксель (ноль A), луч теперь имеет’ = (1-0)*0 0, который по-прежнему равен нулю, как и ожидалось.

Комментарии:

1. Спасибо за ответ, кажется, в основном проясняет ситуацию. Хотя по пункту (2): из вашего ответа кажется, что вы накапливаете альфа-значение перед цветом, затем используете ‘(i), а не’ (i-1) при вычислении вклада цвета текущего вокселя?

2. Э-э, извините … не понимаю, что вы имеете в виду. С выражением в ‘2’ выше я бы использовал, скажем, C’ (i) = (1-A'(i-1)) * C (i) * A (i) C'(i-1), (см. Комментарий к вашему вопросу), поэтому я не вижу, где в нем присутствует A'(i)? Величины, заполненные «‘», представляют собой лучевые интегралы, незагрунтованные A amp; C — это значения вокселей из набора данных volume.

3. Ах, я, кажется, неправильно истолковал ваш ответ (прочитайте «как C»). Итак, я прав, говоря, что формула в моем первоначальном вопросе работает, только если вы предполагаете предварительно умноженную альфа-версию? Уверен, что это не упоминается в GPU Gems, что является жестким.

Ответ №2:

A и C должны быть между 0 и 1. Используйте предварительно умноженный альфа-код; у вас не возникнет проблем с переполнением.

Комментарии:

1. Что именно вы подразумеваете под предварительно умноженной альфой? Вы имеете в виду умножить все воксели на их соответствующее альфа-значение, прежде чем продолжить композицию? Это было бы эквивалентно комментарию timday, формулирующему уравнение как: C ‘ (i) = (1-A'(i-1))*C(i)*A(i) C'(i-1) .

2. Да, по сути. Чтобы перейти от обычного 4-канального цветового формата (C) к предварительно умноженному альфа-коду (C ‘): C'_rgb = C_rgb * C_a и C'_a = C_a

Ответ №3:

Хм, давайте верить, что C и A находятся между 0 и 1. как можно видеть, последовательность C'(i) = [1 - A'_(i 1)]C(i) C'(i-1) растет с ростом i . Я думаю, что C не является цветным (RGB или любой другой модели). Возможно, это «серость» какого-то вокселя. Т.е. если перед вокселем много вокселов, он должен быть более серым, чем верхние вокселы.

Итак, я предполагаю, что C_i неправильно описывает цвет. Это говорит нам о том, каким серым мы должны сделать цвет некоторого вокселя.

простите меня за мой плохой английский и не стесняйтесь переспрашивать, если что-то непонятно.

Кстати: если вы мне верите, C_0 (серость верхнего вокселя) должно быть 1, а A_0 должно быть 0.

Комментарии:

1. Я почти уверен, что вы можете обрабатывать каждый цветовой канал RGB отдельно, как если бы выполняли несколько уровней серого одновременно, а затем объединяли в конечный цвет …?