Какви състояния на изобразяване на Direct3D трябва да се използват за прилагане на правилата за композиране Porter-Duff на Java (CLEAR, SRC, SRCOVER и т.н.)?
Внедряване на правилата на Портър-Дъф в Direct3D
Отговори (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
Верижното им свързване е малко по-сложно и би изисквало или множество преминавания, или множество входни текстури към шейдър.
За случая "А в Б" не трябва ли DestinationBlend да е нула?
A in B
SourceBlend = DestinationAlpha
DestinationBlend = Zero
Когато внедрявам състоянията на рендиране за „A“ (т.е. рисувам цвета/алфата на изходния пиксел и игнорирам цвета/алфата на целевия пиксел), Direct3D изглежда не изпълнява операцията правилно, ако източникът има алфа стойност нула. Вместо да запълвам целевата област с прозрачност, виждам, че целевата област остава непроменена. Ако обаче променя алфа стойността на източника на 1, целевата област става "на практика" прозрачна. Това се случва дори когато деактивирам състоянието на изобразяване на alphablending, така че бих предположил, че това е опит за оптимизация, който всъщност е грешка в Direct3D.
С изключение на тази ситуация, изглежда, че състоянията на изобразяване на Corey са правилни. Благодаря, Кори!
Едно нещо, което трябва да проверите, уверете се, че алфа тестът е изключен
AlphaTestEnable = false
Ако това е включено (заедно с нещо като AlphaFunction = Greater и ReferenceAlpha = 0), чистите пиксели могат да бъдат изхвърлени независимо от настройката AlphaBlendEnable.