Nano Hash - криптовалюты, майнинг, программирование

Как добиться вывода D3D с предварительно умноженным альфа-каналом для использования с D3DImage в WPF?

Мы используем 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, поэтому, пожалуйста, извините, если решение может быть очевидным ...


Ответы:


1

Для правильного предварительного умножения вашего DirectX-контента вам понадобится собственный ID3D11BlendState. Структура D3D11_BLEND_DESC должен быть настроен следующим образом:

AlphaToCoverageEnable = FALSE;
IndependentBlendEnable = FALSE;
RenderTarget[0].BlendEnable = TRUE;

// dest.rgb = src.rgb * src.a + dest.rgb * (1 - src.a)
RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;

// dest.a = 1 - (1 - src.a) * (1 - dest.a) [the math works out]
RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE;
RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;

RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

Создайте состояние наложения с помощью ID3D11Device: : CreateBlendState, затем установите его с помощью ID3D11DeviceContext :: OMSetBlendState. Затем просто настройте остальную часть вашего конвейера Direct3D как обычно, и выходные данные в цель рендеринга должны иметь предварительно умноженную альфа с правильным выходом альфа-канала для использования с Direct2D, WPF или любым другим API, требующим предварительно умноженного содержимого. .

Обратите внимание: если вы используете Direct3D 9, концепции те же, но API другой. Посмотрите здесь для хорошее место для начала, если вы используете 9.

24.09.2013
  • Спасибо за Ваш ответ! На самом деле мы используем D3D9 (забыл упомянуть об этом), поэтому я не мог использовать этот код и, наконец, передал его какому-то коллеге с большим опытом работы с D3D. В любом случае, я полагаю, что ваш ответ верен для D3D11, поэтому я приму его. 25.09.2013
  • D3DImage использует D3D9, поэтому этот ответ бесполезен. 30.03.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..