Реализация правил Портера-Даффа в Direct3D - PullRequest
1 голос
/ 15 сентября 2008

Какие состояния рендеринга Direct3D следует использовать для реализации правил компоновки Java Porter-Duff (CLEAR, SRC, SRCOVER и т. Д.)?

Ответы [ 4 ]

2 голосов
/ 16 сентября 2008

Я не слишком много использовал Java, но, основываясь на белой книге от 1984 , это должно быть довольно простое отображение режимов смешивания состояний рендеринга.

Конечно, вы можете сделать больше, чем просто это, например, нормальное альфа-смешивание (SourceAlpha, InvSourceAlpha) или добавку (One, One) и многие другие. (Я полагаю, что вы спрашиваете об этом именно потому, что переносите некоторые существующие функции? В связи с этим вас могут не волновать другие комбинации ...)

В любом случае, они предполагают, что BlendOperation - Add, а AlphaBlendEnable - true.

Очистить

SourceBlend = Zero
DestinationBlend = Zero

A

SourceBlend = One
DestinationBlend = Zero

B

SourceBlend = Zero
DestinationBlend = One

А над В

SourceBlend = One
DestinationBlend = InvSourceAlpha

B более A

SourceBlend = InvDestinationAlpha
DestinationBlend = One

A в B

SourceBlend = DestinationAlpha
DestinationBlend = One

B в A

SourceBlend = Zero
DestinationBlend = SourceAlpha

A out B

SourceBlend = InvDestinationAlpha
DestinationBlend = Zero

B out A

SourceBlend = Zero
DestinationBlend = InvSourceAlpha

поверх B

SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha

B поверх A

SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha

A xor B

SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha

Объединение их в цепочку немного сложнее и потребует либо нескольких проходов, либо нескольких текстурных входов в шейдер.

1 голос
/ 24 декабря 2011

Для случая "A in B", не должен ли DestinationBlend быть нулем?

A в B

SourceBlend = DestinationAlpha
DestinationBlend = Zero
0 голосов
/ 16 сентября 2008

Одна вещь, чтобы проверить, убедитесь, что альфа-тест выключен с

AlphaTestEnable = false

Если это включено (наряду с чем-то вроде AlphaFunction = Greater и ReferenceAlpha = 0), чистые пиксели могут выбрасываться независимо от значения параметра AlphaBlendEnable.

0 голосов
/ 16 сентября 2008

Когда я реализую состояния рендеринга для «A» (то есть рисует исходный пиксель цвет / альфа и игнорирует целевой пиксель цвет / альфа), Direct3D не выполняет правильную операцию, если источник имеет альфа-значение нуля. Вместо того, чтобы заполнить целевую область прозрачностью, я вижу, что целевая область остается неизменной. Однако если я изменю альфа-значение источника на 1, целевая область станет «практически» прозрачной. Это происходит даже тогда, когда я отключаю состояние рендеринга alphablending, поэтому я предполагаю, что это попытка оптимизации, которая фактически является ошибкой в ​​Direct3D.

За исключением этой ситуации, похоже, что состояния рендеринга Кори правильны. Спасибо, Кори!

...