Объемный рендеринг: путаница с непосредственным наложением - PullRequest
9 голосов
/ 24 мая 2011

В, например, Графический процессор Gems Уравнение компоновки между фронтами (для цвета) равно

C ' i = (1 - A' i-1 ) C i + C ' i-1

где C ' i - выходное накопленное значение цвета; 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, даже если это предположительно прозрачный воксель!?

Любые намеки приветствуются.

Ответы [ 3 ]

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

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

0 голосов
/ 24 мая 2011

Хм, давайте поверим, что 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.

0 голосов
/ 24 мая 2011

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

...