Какие состояния отображения Direct3D должны использоваться для реализации правил компоновки Java Porter-Duff (CLEAR, SRC, SRCOVER и т. Д.)?Реализация правил Porter-Duff в Direct3D
ответ
Я не слишком много использовал Java, но, основываясь на white paper from 1984, это должно быть довольно простое отображение режимов смешивания визуализации.
Есть, конечно, больше того, что вы можете сделать, чем просто их, например, нормальное альфа-смешивание (SourceAlpha, InvSourceAlpha) или аддитив (один, один), чтобы назвать несколько. (я предполагаю, что вы спрашиваете о них именно потому, что вы переносите некоторые существующие функциональные возможности? В этой причине вы можете не заботиться о других комбинациях ...)
Во всяком случае, они предполагают BlendOperation С и AlphaBlendEnable является правда.
Ясно
SourceBlend = Zero
DestinationBlend = Zero
SourceBlend = One
DestinationBlend = Zero
В
SourceBlend = Zero
DestinationBlend = One
А над B
SourceBlend = One
DestinationBlend = InvSourceAlpha
В над
SourceBlend = InvDestinationAlpha
DestinationBlend = One
А в В
SourceBlend = DestinationAlpha
DestinationBlend = One
В в
SourceBlend = Zero
DestinationBlend = SourceAlpha
из Б
SourceBlend = InvDestinationAlpha
DestinationBlend = Zero
B OUT A
SourceBlend = Zero
DestinationBlend = InvSourceAlpha
вершине B
SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha
В вершине
SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha
XOR B
SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha
Цепной это является немного более сложным и требует либо несколько проходов или нескольких текстур входы в шейдер.
Когда я реализую состояния рендеринга для «A» (это краска исходного пиксельного цвета/альфа и игнорирует цвет пикселя назначения/альфа), Direct3D, похоже, не выполняет операцию правильно, если источник имеет альфа значение нуля. Вместо того, чтобы заполнять целевую область прозрачностью, я вижу, что целевая область остается неизменной. Однако, если я изменю значение альфа-источника на 1, целевая область станет «практически» прозрачной. Это происходит даже тогда, когда я отключу состояние отображения alphablending, поэтому я предполагаю, что это попытка оптимизации, которая на самом деле является ошибкой в Direct3D.
За исключением ситуации, казалось бы, состояния рендеринга Кори являются правильными. Спасибо, Кори!
Одна вещь, чтобы проверить, чтобы убедиться альфа-тест выключен с
AlphaTestEnable = false
Если на (вместе с чем-то вроде AlphaFunction = Большой и ReferenceAlpha = 0), четкие пиксели могут быть выброшены независимо от Настройка AlphaBlendEnable.
Для случая «A в B», не следует ли DestinationBlend быть нолем?
А в В
SourceBlend = DestinationAlpha
DestinationBlend = Zero