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