Effekter
Vad är Direct2D-effekter?
Du kan använda Direct2D för att tillämpa en eller flera högkvalitativa effekter på en bild eller en uppsättning bilder. Effekterna API:er bygger på Direct3D 11 och dra nytta av GPU-funktioner för bildbearbetning. Du kan länka effekter i ett effektdiagram och skriva eller blanda effekternas utdata.
En Direct2D-effekt utför en avbildningsuppgift, som att ändra ljusstyrka, avmätta en bild eller skapa en skugga. Effekter kan acceptera noll eller fler indatabilder, exponera flera egenskaper som styr deras åtgärd och generera en enda utdatabild.
Varje effekt skapar ett internt transformeringsdiagram som består av enskilda transformeringar. Varje transformering representerar en enskild bildåtgärd. Huvudsyftet med en transformering är att hysa skuggningar som körs för varje utdatapixel. Dessa skuggningar kan innehålla pixelskuggare, hörnskuggor, blandningssteget för en GPU och beräkningsskuggor.
Både Direct2Dinbyggda effekter och anpassade effekter som du kan göra med api:et anpassade effekter fungera på det här sättet.
Det finns en rad inbyggda effekter från kategorier som de här. En fullständig lista finns i avsnittet Inbyggda effekter.
- filtrering
- sammansättning och blandning
- Transparens
- färg
- belysning och stiliserande
- Transformera och skala
- källor
Du kan tillämpa effekter på alla bitmappar, inklusive: bilder som läses in av Windows Imaging Component (WIC), primitiver ritade av Direct2D, text från DirectWriteeller scener som återges av Direct3D.
Med Direct2D-effekter kan du skriva dina egna effekter som du kan använda för dina program. Med ett anpassat effektramverk kan du använda GPU-funktioner som pixelskuggare, hörnskuggor och blandningsenheten. Du kan också inkludera andra inbyggda eller anpassade effekter i din anpassade effekt. Ramverket för att skapa anpassade effekter är samma som användes för att skapa de inbyggda effekterna av Direct2D-. API:et Direct2D-effektförfattare tillhandahåller en uppsättning gränssnitt för att skapa och registrera effekter.
Avsnitt om fler effekter
Resten av det här avsnittet förklarar grunderna i Direct2D-effekter, till exempel att tillämpa en effekt på en bild. Tabellen här innehåller länkar till ytterligare avsnitt om effekter.
Ämne | Beskrivning |
---|---|
effektskuggning som länkar |
Direct2D använder en optimering som kallas för effektskuggningslänkning som kombinerar diagramåtergivning med flera effekter som skickas till ett enda pass. |
Anpassade effekter |
Visar hur du skriver egna anpassade effekter med standard-HLSL. |
Läsa in en bild i Direct2D-effekter med hjälp av FilePicker- |
Visar hur du använder Windows::Storage::P ickers::FileOpenPicker för att läsa in en bild i Direct2D-effekter. |
Spara Direct2D-innehåll i en bildfil |
Det här avsnittet visar hur du använder IWICImageEncoder för att spara innehåll i form av en ID2D1Image- till en kodad bildfil som JPEG. |
Tillämpa effekter på primitiver |
Det här avsnittet visar hur du tillämpar en serie effekter på Direct2D- och DirectWrite primitiver. |
Kontrollera precision och numeriska urklipp i effektdiagram |
Program som renderar effekter med Direct2D måste vara noga med att uppnå önskad kvalitet och förutsägbarhet med avseende på numerisk precision. |
Tillämpa en effekt på en bild
Du kan använda API:et för Direct2D-effekter för att tillämpa transformeringar på bilder.
Not
Det här exemplet förutsätter att du redan har ID2D1DeviceContext och IWICBitmapSource objekt som skapats. Mer information om hur du skapar dessa objekt finns i Läsa in en bild i Direct2D-effekter med hjälp av FilePicker- och Enheter och enhetskontexter.
Deklarera en ID2D1Effect variabel och skapa sedan en bitmappskälla effekt med hjälp av metoden ID2DDeviceContext::CreateEffect.
ComPtr<ID2D1Effect> bitmapSourceEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
Ange egenskapen BitmapSource till WIC-bitmappskällan med hjälp av ID2D1Effect::SetValue.
DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
Deklarera en ID2D1Effect variabel och skapa sedan gaussisk oskärpa effekt.
ComPtr<ID2D1Effect> gaussianBlurEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
Ange indata för att ta emot bilden från bitmappskällans effekt. Ange oskärpamängden SetValue-metoden och standardavvikelseegenskapen.
gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get()); DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
Använd enhetskontexten för att rita de resulterande bildutdata.
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();
Metoden DrawImage måste anropas mellan ID2DDeviceContext::BeginDraw och EndDraw-anrop som andra Direct2D-återgivningsåtgärder. DrawImage kan ta en bild eller utdata från en effekt och återge den till målytan.
Rumsliga transformeringar
Direct2D ger inbyggda effekter som kan transformera bilder i 2D- och 3D-utrymme samt skalning. Skalnings- och transformeringseffekterna erbjuder olika kvalitetsnivåer som: närmaste granne, linjär, kubik, flerexempel linjär, anisotropisk och högkvalitativ kubik.
Not
Anisotropiskt läge genererar mipmaps vid skalning, men om du ställer in egenskapen Cached till true på de effekter som är indata till transformeringen genereras inte mipmaps varje gång för tillräckligt små bilder.
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();
Den här användningen av 2D-transformeringseffekten roterar bitmappen något motsols.
Före |
---|
![]() |
Efter |
![]() |
Skapa bilder
Vissa effekter accepterar flera indata och sammansatta dem till en resulterande bild.
De inbyggda sammansatta och aritmetiska sammansatta effekterna ger olika lägen. Mer information finns i avsnittet sammansatta. Den blandningen effekt har en mängd olika GPU-accelererade lägen tillgängliga.
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();
Den sammansatta effekten kombinerar bilder på olika sätt beroende på vilket läge du anger.
Pixeljusteringar
Det finns några inbyggda Direct2D-effekter som gör att du kan ändra pixeldata. Till exempel kan färgmatriseffekten användas för att ändra färg på en bild.
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();
Den här koden tar bilden och ändrar färgen som visas i exempelbilderna här.
Före |
---|
![]() |
Efter |
![]() |
Mer information finns i avsnittet inbyggda effekter färg.
Diagram för byggeffekt
Du kan länka samman effekter för att transformera bilder. Koden här använder till exempel en skugga och en 2D-transformering och sammanställer sedan resultatet tillsammans.
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();
Här är resultatet.
Effekterna tar ID2D1Image objekt som indata. Du kan använda en ID2D1Bitmap- eftersom gränssnittet härleds från ID2D1Image. Du kan också använda ID2D1Effect::GetOutput för att hämta utdata från ett ID2D1Effect-objekt som ett ID2D1Image- eller använda metoden SetInputEffect som konverterar utdata åt dig. I de flesta fall består ett effektdiagram av ID2D1Effect objekt som är direkt sammanlänkade, vilket gör det enkelt att tillämpa flera effekter på en bild för att skapa övertygande visuella objekt.
Mer information finns i Så här tillämpar du effekter på primitiver.