Внедряване на правилата на Портър-Дъф в Direct3D

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


person Neal    schedule 15.09.2008    source източник


Отговори (4)


Не съм използвал Java много, но въз основа на бялата книга от 1984 г., това трябва да е сравнително просто картографиране на режимите на смесване на състоянието на изобразяване.

Разбира се, можете да правите повече от тези, като нормално алфа смесване (SourceAlpha, InvSourceAlpha) или добавка (One, One), за да назовем само няколко. (Предполагам, че питате за тях специално, защото пренасяте някои съществуващи функции? Поради тази причина може да не ви интересуват други комбинации...)

Както и да е, те предполагат BlendOperation на Add и че AlphaBlendEnable е вярно.

ясно

SourceBlend = Zero
DestinationBlend = Zero

A

SourceBlend = One
DestinationBlend = Zero

B

SourceBlend = Zero
DestinationBlend = One

А върху Б

SourceBlend = One
DestinationBlend = InvSourceAlpha

Б върху А

SourceBlend = InvDestinationAlpha
DestinationBlend = One

A in B

SourceBlend = DestinationAlpha
DestinationBlend = One

B in A

SourceBlend = Zero
DestinationBlend = SourceAlpha

А аут Б

SourceBlend = InvDestinationAlpha
DestinationBlend = Zero

B изход A

SourceBlend = Zero
DestinationBlend = InvSourceAlpha

А отгоре Б

SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha

Б върху А

SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha

A xor B

SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha

Верижното им свързване е малко по-сложно и би изисквало или множество преминавания, или множество входни текстури към шейдър.

person Corey Ross    schedule 15.09.2008

За случая "А в Б" не трябва ли DestinationBlend да е нула?

A in B

SourceBlend = DestinationAlpha
DestinationBlend = Zero
person benbuck    schedule 23.12.2011

Когато внедрявам състоянията на рендиране за „A“ (т.е. рисувам цвета/алфата на изходния пиксел и игнорирам цвета/алфата на целевия пиксел), Direct3D изглежда не изпълнява операцията правилно, ако източникът има алфа стойност нула. Вместо да запълвам целевата област с прозрачност, виждам, че целевата област остава непроменена. Ако обаче променя алфа стойността на източника на 1, целевата област става "на практика" прозрачна. Това се случва дори когато деактивирам състоянието на изобразяване на alphablending, така че бих предположил, че това е опит за оптимизация, който всъщност е грешка в Direct3D.

С изключение на тази ситуация, изглежда, че състоянията на изобразяване на Corey са правилни. Благодаря, Кори!

person Neal    schedule 16.09.2008

Едно нещо, което трябва да проверите, уверете се, че алфа тестът е изключен

AlphaTestEnable = false

Ако това е включено (заедно с нещо като AlphaFunction = Greater и ReferenceAlpha = 0), чистите пиксели могат да бъдат изхвърлени независимо от настройката AlphaBlendEnable.

person Corey Ross    schedule 16.09.2008