Поделиться через


Произведенный эффект

Что такое эффекты Direct2D?

Direct2D можно использовать для применения одного или нескольких высококачественных эффектов к изображению или набору изображений. Api-интерфейсы эффектов основаны на Direct3D 11 и используют функции GPU для обработки изображений. Вы можете цепочки эффектов в графе эффектов и создавать или смешивать выходные данные эффектов.

Эффект Direct2D выполняет задачу визуализации, например изменение яркости, отмены насыщения изображения или создание тени падения. Эффекты могут принимать ноль или больше входных изображений, предоставлять несколько свойств, которые управляют их операцией, и создавать один выходной образ.

Каждый эффект создает внутренний граф преобразования, состоящий из отдельных преобразований. Каждое преобразование представляет одну операцию изображения. Основной целью преобразования является создание шейдеров, выполняемых для каждого выходного пикселя. Эти шейдеры могут включать шейдеры пикселей, вершинные шейдеры, этап смешения GPU и вычислительные шейдеры.

Встроенные эффекты Direct2D и настраиваемые эффекты можно сделать с помощью API пользовательских эффектов таким образом.

Существует ряд встроенных эффектов от категорий, таких как здесь. Полный список см. в разделе "Встроенные эффекты ".

Эффекты можно применять к любой растровой карте, включая изображения, загруженные компонентом образов Windows (WIC), примитивы, рисуемые Direct2D, текст из DirectWrite или сцены, отрисованные Direct3D.

С помощью эффектов Direct2D можно создавать собственные эффекты, которые можно использовать для приложений. Настраиваемая платформа эффектов позволяет использовать такие функции GPU, как шейдеры пикселей, шейдеры вершин и блок смешивания. Вы также можете включить другие встроенные или настраиваемые эффекты в настраиваемый эффект. Платформа для создания пользовательских эффектов совпадает с той же платформой, которая использовалась для создания встроенных эффектов Direct2D. API создания эффектов Direct2D предоставляет набор интерфейсов для создания и регистрации эффектов.

Дополнительные разделы о эффектах

Остальная часть этого раздела объясняет основы эффектов Direct2D, например применение эффекта к изображению. В таблице приведены ссылки на дополнительные разделы о эффектах.

Раздел Описание
Связывание шейдеров эффектов
Direct2D использует оптимизацию, называемую шейдером эффектов, который объединяет несколько эффектов отрисовки графа передается в один проход.
Пользовательские эффекты
Показывает, как создавать собственные пользовательские эффекты с помощью стандартного HLSL.
Загрузка изображения в эффекты Direct2D с помощью FilePicker
Показывает, как использовать Windows::Storage::P ickers::FileOpenPicker для загрузки изображения в эффекты Direct2D.
Сохранение содержимого Direct2D в файл изображения
В этом разделе показано, как использовать IWICImageEncoder для сохранения содержимого в виде ID2D1Image в закодированном файле изображения, например JPEG.
Применение эффектов к примитивам
В этом разделе показано, как применить ряд эффектов к примитивам Direct2D и DirectWrite .
Управление точностью и числовым вырезками в графах эффектов
Приложения, отрисовывающие эффекты с помощью Direct2D, должны обеспечить требуемый уровень качества и прогнозируемости в отношении числовой точности.

Применение эффекта к изображению

Api эффектов Direct2D можно использовать для применения преобразований к изображениям.

Примечание.

В этом примере предполагается, что у вас уже созданы объекты ID2D1DeviceContext и IWICBitmapSource. Дополнительные сведения о создании этих объектов см. в статье "Загрузка изображения в эффекты Direct2D" с помощью FilePicker и устройств и контекстов устройств.

  1. Объявите переменную ID2D1Effect и создайте эффект источника растрового изображения с помощью метода ID2DeviceContext::CreateEffect.

        ComPtr<ID2D1Effect> bitmapSourceEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
    
  2. Задайте для свойства BitmapSource источник растрового изображения WIC с помощью идентификатора ID2D1Effect::SetValue.

            DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
    
  3. Объявите переменную ID2D1Effect и создайте эффект размытия gaussian.

        ComPtr<ID2D1Effect> gaussianBlurEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
    
  4. Задайте входные данные для получения изображения из эффекта источника растрового изображения. Задайте значение размытия метода SetValue и стандартного свойства отклонения.

        gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get());
    
        DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
    
  5. Используйте контекст устройства для рисования результирующего вывода изображения.

        m_d2dContext->BeginDraw();
    
        m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    
        // Draw the blurred image.
        m_d2dContext->DrawImage(gaussianBlurEffect.Get());
    
        HRESULT hr = m_d2dContext->EndDraw();
    

    Метод DrawImage должен вызываться между вызовами ID2DDeviceContext::BeginDraw и EndDraw, например другими операциями отрисовки Direct2D. DrawImage может принимать изображение или выходные данные эффекта и отображать его на целевой поверхности.

Пространственные преобразования

Direct2D предоставляет встроенные эффекты, которые могут преобразовывать изображения в трехмерном и трехмерном пространстве, а также масштабирование. Эффекты масштабирования и преобразования предлагают различные уровни качества, такие как ближайший сосед, линейный, кубический, много пример линейный, анисотропный и высококачественный куб.

Примечание.

Анисотропный режим создает MIP-карты при масштабировании, однако если при масштабировании свойство Cached задано значение true для эффектов, входных для преобразования MIP-карт, не будет создаваться каждый раз для достаточно небольших изображений.

ComPtr<ID2D1Effect> affineTransformEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D12DAffineTransform, &affineTransformEffect));

affineTransformEffect->SetInput(0, bitmap.Get());

D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F(0.9f, -0.1f,  0.1f, 0.9f, 8.0f, 45.0f);
DX::ThrowIfFailed(affineTransformEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, matrix));

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(affineTransformEffect.Get());
m_d2dContext->EndDraw();

Это использование эффекта аффинного преобразования 2D поворачивает битовую диаграмму счетчика слегка.

Перед
2d аффинный эффект перед изображением.
После
2d аффинный эффект после изображения.

Создание изображений

Некоторые эффекты принимают несколько входных данных и составят их в один результирующий образ.

Встроенные составные и арифметические составные эффекты предоставляют различные режимы, дополнительные сведения см. в составной статье. Эффект смешения имеет различные режимы ускорения GPU.

ComPtr<ID2D1Effect> compositeEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect));

compositeEffect->SetInput(0, bitmap.Get());
compositeEffect->SetInput(1, bitmapTwo.Get());

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(compositeEffect.Get());
m_d2dContext->EndDraw();

Составной эффект объединяет изображения различными способами в соответствии с заданным режимом.

Корректировки пикселей

Существует несколько встроенных эффектов Direct2D, которые позволяют изменять данные пикселей. Например, эффект цветовой матрицы можно использовать для изменения цвета изображения.

ComPtr<ID2D1Effect> colorMatrixEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1ColorMatrix, &colorMatrixEffect));

colorMatrixEffect->SetInput(0, bitmap.Get());

D2D1_MATRIX_5X4_F matrix = D2D1::Matrix5x4F(0, 0, 1, 0,   0, 1, 0, 0,   1, 0, 0, 0,   0, 0, 0, 1,   0, 0, 0, 0);
DX::ThrowIfFailed(colorMatrixEffect->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, matrix));

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(colorMatrixEffect.Get());
m_d2dContext->EndDraw();

Этот код принимает изображение и изменяет цвет, как показано в примерах изображений здесь.

Перед
Эффект цветовой матрицы перед изображением.
После
Эффект цветовой матрицы после изображения.

Дополнительные сведения см. в разделе о встроенных эффектах цвета.

Создание графов эффектов

Вы можете объединить эффекты для преобразования изображений. Например, код здесь применяет тень и 2D-преобразование, а затем составит результаты вместе.

ComPtr<ID2D1Effect> shadowEffect;
ComPtr<ID2D1Effect> affineTransformEffect;
ComPtr<ID2D1Effect> compositeEffect;

DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Shadow, &shadowEffect));
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D12DAffineTransform, &affineTransformEffect));
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect));

shadowEffect->SetInput(0, bitmap.Get());
affineTransformEffect->SetInputEffect(0, shadowEffect.Get());

D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation(20, 20));

affineTransformEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, matrix);

compositeEffect->SetInputEffect(0, affineTransformEffect.Get());
compositeEffect->SetInput(1, bitmap.Get());

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(compositeEffect.Get());
m_d2dContext->EndDraw();

Вот результат.

Выходные данные эффектов тени.

Эффекты принимают объекты ID2D1Image в качестве входных данных. Вы можете использовать id2D1Bitmap, так как интерфейс является производным от ID2D1Image. Вы также можете использовать id2D1Effect::GetOutput, чтобы получить выходные данные объекта ID2D1Effect в качестве id2D1Image или использовать метод SetInputEffect, который преобразует выходные данные для вас. В большинстве случаев граф эффектов состоит из объектов ID2D1Effect напрямую, что упрощает применение нескольких эффектов к изображению для создания привлекательных визуальных элементов.

Дополнительные сведения см. в статье о применении эффектов к примитивам .

Пример эффектов основных изображений Direct2D

Встроенные эффекты