Мы используем D3DImage
в WPF для отображения частично прозрачного 3D-контента, визуализированного с помощью Direct3D, на фоне, созданном в WPF. Итак, у нас получилось что-то вроде этого:
<UserControl Background="Blue">
<Image>
<Image.Source>
<D3DImage .../>
</Image.Source>
</Image>
</UserControl>
Теперь у нас есть проблема, заключающаяся в том, что сглаженные края не отображаются должным образом. У нас появляется своего рода эффект белого «свечения» на некоторых краях, похожий на эффект вокруг текста, показанного на первом рисунке:
(взято из http://dvd-hq.info/alpha_matting.php)
Причина в том, что данные, которые мы получаем из DirectX, очевидно, не умножаются заранее на альфа-канал. Но WPF и D3DImage
ожидают, что это будет их вводом (см. «Введение в D3DImage» в CodeProject, раздел «Краткий обзор требований к взаимодействию D3D»).
Я проверил, что это действительно проблема, умножив каждый пиксель на его альфа-значение в C # и используя собственный пиксельный шейдер. Результаты оба были хорошими. Однако я бы хотел получить этот результат напрямую из DirectX.
Как я могу получить предварительно умноженные данные напрямую из DirectX? Можно как-то указать это при звонке на CreateRenderTarget
? Я не эксперт по DirectX, поэтому, пожалуйста, извините, если решение может быть очевидным ...