Megosztás a következőn keresztül:


Ingóságok

Mik azok a Direct2D-effektusok?

A Direct2D használatával egy vagy több kiváló minőségű effektust alkalmazhat egy képre vagy képkészletre. Az effektus API-k Direct3D 11 épülnek, és kihasználják a GPU-funkciók előnyeit a képfeldolgozáshoz. Az effektusokat láncolhatja egy effektusdiagramon, és megírhatja vagy elegyítheti az effektusok kimenetét.

A Direct2D-effektusok képalkotó feladatokat hajtanak végre, például megváltoztatják a fényerőt, megszüntetik a kép telítettségét, vagy árnyékot hoznak létre. Az effektusok nulla vagy több bemeneti lemezképet fogadnak el, több olyan tulajdonságot is elérhetővé tehetnek, amelyek vezérli a működésüket, és egyetlen kimeneti lemezképet hoznak létre.

Minden effektus egyedi átalakításokból álló belső átalakítási gráfot hoz létre. Minden átalakítás egyetlen képműveletet jelöl. Az átalakítás fő célja az egyes kimeneti képpontokhoz végrehajtott árnyékolók használata. Ezek az árnyékolók lehetnek képpontárnyékolók, csúcspont-árnyékolók, GPU keverési fázisa és számítási árnyékolók.

A Direct2Dbeépített effektusok és az egyéni effektusok is így működnek az egyéni effektusok API-jának használatával,.

Számos beépített effektus kategóriákból, például az itt találhatóakból. A teljes listát a Beépített effektusok szakaszban találja.

Bármilyen bitképre alkalmazhat effektusokat, beleértve a Windows képalkotó összetevő (WIC)által betöltött képeket, Direct2Dáltal rajzolt primitíveket, DirectWriteszövegét vagy Direct3Dáltal renderelt jeleneteket.

A Direct2D-effektusokkal saját effektusokat írhat az alkalmazásokhoz. Az egyéni effektus-keretrendszer lehetővé teszi a GPU-funkciók, például a képpontárnyékolók, a csúcspont-árnyékolók és a keverőegység használatát. Más beépített vagy egyéni effektusokat is felvehet az egyéni effektusba. Az egyéni effektusok létrehozásának keretrendszere ugyanaz, mint a Direct2Dbeépített effektusainak létrehozásához. A Direct2D-effektuskészítő API interfészek készletét biztosítja az effektusok létrehozásához és regisztrálásához.

További effektustémakörök

A témakör további része a Direct2D-effektusok alapjait ismerteti, például az effektusok képre való alkalmazását. Az alábbi táblázat további, effektusokkal kapcsolatos témakörökre mutató hivatkozásokat tartalmaz.

Téma Leírás
Effektusszűrő összekapcsolása
A Direct2D egy effektus-árnyékoló csatolásának nevezett optimalizálást használ, amely több effektusdiagram-renderelést egyesít egyetlen lépésben.
egyéni effektusok
Bemutatja, hogyan írhat saját egyéni effektusokat standard HLSL használatával.
Kép betöltése Direct2D-effektusokba a FilePicker
A Windows::Storage::P ickers::FileOpenPicker használatával tölthet be egy képet Direct2D-effektusokba.
Direct2D-tartalom mentése képfájlba
Ez a témakör bemutatja, hogyan mentheti a tartalmat IWICImageEncoderID2D1Image formájában egy kódolt képfájlba, például JPEG-fájlba.
Hatások alkalmazása a primitívekre
Ez a témakör bemutatja, hogyan alkalmazhat effektusokat Direct2D és DirectWrite primitívekre.
Pontosság és numerikus vágás szabályozása az effektusdiagramokban
A Direct2D-vel effektusokat renderelő alkalmazásoknak ügyelniük kell a kívánt minőségre és kiszámíthatóságra a numerikus pontosság tekintetében.

Effektus alkalmazása képre

A Direct2D-effektusok API-val átalakításokat alkalmazhat képekre.

Jegyzet

Ez a példa feltételezi, hogy már létrehozott ID2D1DeviceContext és IWICBitmapSource objektumokat. További információ az objektumok létrehozásáról: Kép betöltése Direct2D-effektusokba a FilePicker és Eszközök és eszközkörnyezetekhasználatával.

  1. Deklaráljon egy ID2D1Effect változót, majd hozzon létre egy bitképforrást effektust az ID2DDeviceContext::CreateEffect metódussal.

        ComPtr<ID2D1Effect> bitmapSourceEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
    
  2. Állítsa a BitmapSource tulajdonságot a WIC-bitképforrásra az ID2D1Effect::SetValuehasználatával.

            DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
    
  3. Deklarálhat egy ID2D1Effect változót, majd hozza létre a gauss elmosódási effektust.

        ComPtr<ID2D1Effect> gaussianBlurEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
    
  4. Állítsa be a bemenetet a kép bitképforrás-effektusból való fogadásához. Állítsa be a SetValue metódust és a szórás tulajdonságot.

        gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get());
    
        DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
    
  5. Az eszközkörnyezet használatával rajzolja meg az eredményként kapott képkimenetet.

        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();
    

    A DrawImage metódust az ID2DDeviceContext::BeginDraw és EndDraw hívások között kell meghívni, mint más Direct2D renderelési műveletek. DrawImage készíthet egy képet vagy egy effektus kimenetét, és megjelenítheti azt a célfelületen.

Térbeli átalakítások

A Direct2D beépített effektusokat biztosít, amelyek 2D és 3D térben alakíthatják át a képeket, valamint skálázhatók. A méretezési és átalakítási effektusok különböző minőségi szinteket kínálnak, például: legközelebbi szomszéd, lineáris, köbös, többmintás lineáris, anizotróp és kiváló minőségű köb.

Jegyzet

Az anizotróp mód mipmap-okat hoz létre skálázáskor, azonban ha a gyorsítótárazott tulajdonságot igaz értékre állítja az átalakításhoz bemenetként bemenő hatásokra, a mipmaps nem jön létre minden alkalommal megfelelően kis méretű képek esetén.

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();

A 2D affine transzformációs effektus használata kissé elforgatja a bitképet az óramutató járásával ellentétesen.

Előtt
2d affine effektust a kép előtt.
Után
2d affine effektust a kép után.

Képek összeállítása

Egyes effektusok több bemenetet is elfogadnak, és egyetlen eredményül kapott képbe alakítja őket.

A beépített összetett és aritmetikai összetett effektusok különböző módokat biztosítanak, további információkért lásd a összetett témakört. A keverék effektus számos GPU-gyorsított módot kínál.

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();

Az összetett effektus különböző módokon egyesíti a képeket a megadott módnak megfelelően.

Képpontkorrekciók

Néhány beépített Direct2D-effektus lehetővé teszi a képpontadatok módosítását. A színmátrix-effektus például a képek színének módosítására használható.

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();

Ez a kód felveszi a képet, és megváltoztatja a színt az itt látható példaképekben látható módon.

Előtt
színmátrix effektust a kép előtt.
Után
kép utáni színmátrix-effektust.

További információt a beépített színeffektusok szakaszban talál.

Effektusdiagramok készítése

Az effektusok összefűzhetők a képek átalakításához. Az itt szereplő kód például árnyékot és 2D-átalakítást alkalmaz, majd összefésüli az eredményeket.

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();

Itt van az eredmény.

árnyékeffektus kimenetét.

Az effektusok bemenetként ID2D1Image objektumokat. Használhat ID2D1Bitmap, mert a felület ID2D1Imageszármazik. A ID2D1Effect::GetOutput használatával is lekérheti egy ID2D1Effect objektum kimenetét ID2D1Image, vagy használhatja a SetInputEffect metódust, amely átalakítja a kimenetet. A legtöbb esetben az effektusdiagram ID2D1Effect közvetlenül egymáshoz láncolt objektumokat tartalmaz, így egyszerűen alkalmazhat több effektust egy képre lenyűgöző vizualizációk létrehozásához.

További információt a Hogyan alkalmazhat effektusokat a primitívekre.

Direct2D alapszintű képeffektusok mintája

beépített effektusok