Реализация правил Портера-Даффа в Direct3D

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


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


Ответы (4)


Я не слишком часто использую 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

Б над А

SourceBlend = InvDestinationAlpha
DestinationBlend = One

A in B

SourceBlend = DestinationAlpha
DestinationBlend = One

B in A

SourceBlend = Zero
DestinationBlend = SourceAlpha

А из Б

SourceBlend = InvDestinationAlpha
DestinationBlend = Zero

Б из А

SourceBlend = Zero
DestinationBlend = InvSourceAlpha

А поверх Б

SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha

Б поверх А

SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha

А или Б

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, целевая область станет «виртуально» прозрачной. Это происходит даже тогда, когда я отключаю состояние рендеринга альфа-смешивания, поэтому я предполагаю, что это попытка оптимизации, которая на самом деле является ошибкой в ​​​​Direct3D.

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

person Neal    schedule 16.09.2008

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

AlphaTestEnable = false

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

person Corey Ross    schedule 16.09.2008