Účinky
Co jsou efekty Direct2D?
Direct2D můžete použít k použití jednoho nebo více vysoce kvalitních efektů na obrázek nebo sadu obrázků. Rozhraní API efektů jsou založená na Direct3D 11 a využívají funkce GPU pro zpracování obrázků. Efekty můžete zřetězovat v grafu efektů a vytvářet nebo kombinovat výstup efektů.
Efekt Direct2D provádí úlohu vytváření obrázků, jako je změna jasu, odstranění nasycení obrázku nebo vytvoření stínu. Efekty můžou přijímat nulové nebo více vstupních obrázků, zpřístupnit více vlastností, které řídí jejich operaci, a generovat jeden výstupní obrázek.
Každý efekt vytvoří interní transformační graf složený z jednotlivých transformací. Každá transformace představuje jednu operaci image. Hlavním účelem transformace je zařaďte shadery, které se spouští pro každý výstupní pixel. Tyto shadery můžou zahrnovat shadery pixelů, shadery vrcholů, fázi prolnutí GPU a výpočetních shaderů.
Direct2Dintegrované efekty i vlastní efekty, které můžete použít rozhraní API vlastních efektů, tímto způsobem fungují.
Existuje řada předdefinovaných efektů z kategorií, jako jsou ty tady. Úplný seznam najdete v části Předdefinované efekty.
- filtrování
- složení a mixování
- průhlednosti
- barev
- Osvětlení a stylizace
- transformace a škálování
- zdroje
Efekty můžete použít u libovolného rastrového obrázku, včetně obrázků načtených komponentou WIC (Windows Imaging Component), primitivní prvky vykreslené Direct2D, text z DirectWritenebo scény vykreslené Direct3D.
Díky efektům Direct2D můžete napsat vlastní efekty, které můžete použít pro své aplikace. Architektura vlastních efektů umožňuje používat funkce GPU, jako jsou shadery pixelů, shadery vrcholů a jednotka prolnutí. Do vlastního efektu můžete také zahrnout další předdefinované nebo vlastní efekty. Architektura pro vytváření vlastních efektů je stejná jako ta, která byla použita k vytvoření předdefinovaných efektů Direct2D. Rozhraní API pro vytváření efektu Direct2D poskytuje sadu rozhraní pro vytváření a registraci efektů.
Další témata o efektech
Zbývající část tohoto tématu vysvětluje základy efektů Direct2D, jako je použití efektu na obrázek. Tabulka obsahuje odkazy na další témata týkající se efektů.
Námět | Popis |
---|---|
propojení shaderu efektu |
Direct2D používá optimalizaci označovanou jako propojení shaderu efektu, která kombinuje vykreslování grafu s více efekty, které se předává do jednoho průchodu. |
vlastní efekty |
Ukazuje, jak psát vlastní efekty pomocí standardního HLSL. |
Jak načíst image do efektů Direct2D pomocí FilePickeru |
Ukazuje, jak použít Windows::Storage::P ickers::FileOpenPicker k načtení image do efektů Direct2D. |
Jak uložit obsah Direct2D do souboru obrázku |
Toto téma ukazuje, jak pomocí IWICImageEncoder uložit obsah ve formě ID2D1Image do zakódovaného souboru obrázku, jako je JPEG. |
Jak použít efekty na primitivní |
Toto téma ukazuje, jak použít řadu efektů na Direct2D a DirectWrite primitiv. |
řízení přesnosti a číselných výřezů v grafech efektu |
Aplikace, které vykreslují efekty pomocí Direct2D, se musí postarat o dosažení požadované úrovně kvality a předvídatelnosti s ohledem na číselnou přesnost. |
Použití efektu na obrázek
K použití transformací na obrázky můžete použít rozhraní API pro efekty Direct2D.
Poznámka
Tento příklad předpokládá, že již máte ID2D1DeviceContext a IWICBitmapSource objekty vytvořené. Další informace o vytváření těchto objektů naleznete v tématu Jak načíst image do efektů Direct2D pomocí filePicker a zařízení a kontextů zařízení.
Deklarujte ID2D1Effect proměnnou a pak vytvořte rastrový efekt pomocí metody ID2DDeviceContext::CreateEffect.
ComPtr<ID2D1Effect> bitmapSourceEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
Nastavte BitmapSource vlastnost na WIC bitmap source pomocí ID2D1Effect::SetValue.
DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
Deklarujte proměnnou ID2D1Effect a pak vytvořte gaussian blur efekt.
ComPtr<ID2D1Effect> gaussianBlurEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
Nastavte vstup pro příjem obrázku ze zdrojového efektu rastrového obrázku. Nastavte rozostření množství SetValue metoda a vlastnost směrodatná odchylka.
gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get()); DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
Pomocí kontextu zařízení nakreslete výsledný výstup obrázku.
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 metoda musí být volána mezi ID2DDeviceContext::BeginDraw a EndDraw volání jako jiné operace vykreslování Direct2D. DrawImage může pořídit obrázek nebo výstup efektu a vykreslit ho na cílovou plochu.
Prostorové transformace
Direct2D poskytuje integrované efekty, které můžou transformovat obrázky ve 2D a 3D prostoru a také škálování. Efekty škálování a transformace nabízejí různé úrovně kvality, jako jsou: nejbližší soused, lineární, krychlový, multi-vzork lineární, anisotropní a vysoce kvalitní krychlový.
Poznámka
Anisotropní režim generuje mipmapy při škálování, ale pokud nastavíte Cached vlastnost true na efekty, které jsou vstupem transformace mipmaps nebudou generovány pokaždé pro dostatečně malé obrázky.
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();
Toto použití efektu transformace 2D affinu otočí rastrový obrázek mírně proti směru hodinových ručiček.
Před |
---|
![]() |
Po |
![]() |
Kompozitování obrázků
Některé efekty přijímají více vstupů a složeného je do jednoho výsledného obrázku.
Integrované složené a aritmetické složené efekty poskytují různé režimy. Další informace najdete v tématu složené. Efekt blendu má k dispozici různé akcelerované režimy 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();
Složený efekt kombinuje obrázky různými způsoby podle vámi zadaného režimu.
Úpravy pixelů
Existuje několik předdefinovaných efektů Direct2D, které umožňují měnit data pixelů. Například efekt matice barev se dá použít ke změně barvy obrázku.
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();
Tento kód vezme obrázek a změní barvu, jak je znázorněno na ukázkových obrázcích.
Před |
---|
![]() |
Po |
![]() |
Další informace najdete v části předdefinovaných efektů barev.
Grafy stavebních efektů
Efekty můžete zřetězovat a transformovat obrázky. Například zde kód použije stín a 2D transformaci a pak složených výsledků dohromady.
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();
Tady je výsledek.
Efekty ID2D1Image objekty jako vstup. Můžete použít ID2D1Bitmap, protože rozhraní je odvozeno z ID2D1Image. Pomocí ID2D1Effect::GetOutput můžete také získat výstup ID2D1Effect objektu jako ID2D1Image nebo použít SetInputEffect metoda, která převede výstup za vás. Ve většině případů se graf efektů skládá z ID2D1Effect objekty přímo zřetězených dohromady, což usnadňuje použití více efektů na obrázek k vytvoření poutavých vizuálů.
Další informace najdete v tématu Jak použít efekty na primitivy.