Aracılığıyla paylaş


Efekt -leri

Direct2D efektleri nelerdir?

Bir görüntüye veya görüntü kümesine bir veya daha fazla yüksek kaliteli efekt uygulamak için Direct2D kullanabilirsiniz. Efekt API'leri, Direct3D 11 üzerinde oluşturulur ve görüntü işleme için GPU özelliklerinden yararlanılır. Efektleri bir efekt grafiğinde zincirleyebilir ve efektlerin çıkışını oluşturabilir veya karıştırabilirsiniz.

Direct2D efekti parlaklığı değiştirme, resmin doygunluğunu kaldırma veya gölge oluşturma gibi bir görüntüleme görevi gerçekleştirir. Efektler sıfır veya daha fazla giriş görüntüsünü kabul edebilir, işlemlerini denetleen birden çok özelliği kullanıma açabilir ve tek bir çıkış görüntüsü oluşturabilir.

Her efekt, tek tek dönüşümlerden oluşan bir iç dönüşüm grafı oluşturur. Her dönüşüm tek bir görüntü işlemini temsil eder. Dönüşümün temel amacı, her çıkış pikseli için yürütülen gölgelendiricileri barındırır. Bu gölgelendiriciler piksel gölgelendiricileri, köşe gölgelendiricilerini, GPU'nun harmanlama aşamasını ve işlem gölgelendiricilerini içerebilir.

Hem Direct2Dyerleşik efektler hem de özel efektler API'sini kullanarak yapabileceğiniz özel efektler bu şekilde çalışır.

Buradaki gibi kategorilerden çeşitli yerleşik efekt vardır. Tam liste için Yerleşik Efektler bölümüne bakın.

Windows Görüntüleme Bileşeni (WIC)tarafından yüklenen görüntüler, Direct2Dtarafından çizilen temel öğeler, directwrite metinler veya Direct3Dtarafından işlenen sahneler gibi herhangi bir bit eşlem için efektler uygulayabilirsiniz.

Direct2D efektleri ile uygulamalarınız için kullanabileceğiniz kendi efektlerinizi yazabilirsiniz. Özel efekt çerçevesi piksel gölgelendiricileri, köşe gölgelendiricileri ve karıştırma birimi gibi GPU özelliklerini kullanmanıza olanak tanır. Özel efektinize diğer yerleşik veya özel efektleri de ekleyebilirsiniz. Özel efektler oluşturmaya yönelik çerçeve, Direct2Dyerleşik efektlerini oluşturmak için kullanılan çerçeveyle aynıdır. Direct2D efekt yazarı API' efektleri oluşturmak ve kaydetmek için bir dizi arabirim sağlar.

Diğer efekt konuları

Bu konunun geri kalanında, bir görüntüye efekt uygulama gibi Direct2D efektlerinin temelleri açıklanmaktadır. Buradaki tabloda efektlerle ilgili ek konuların bağlantıları vardır.

Konu Açıklama
Efekt Gölgelendirici Bağlama
Direct2D, birden çok efekt grafı işleme geçişini tek bir geçişte birleştiren efekt gölgelendiricisi bağlama adı verilen bir iyileştirme kullanır.
Özel efektler
Standart HLSL kullanarak kendi özel efektlerinizi nasıl yazabileceğinizi gösterir.
FilePicker kullanarak Direct2D Efektlerine görüntü yükleme
Bir görüntüyü Direct2D efektlerine yüklemek için Windows::Storage::P ickers::FileOpenPickernasıl kullanılacağını gösterir.
Direct2D içeriğini bir görüntü dosyasına kaydetme
Bu konu başlığında, IWICImageEncoder kullanarak içeriği ID2D1Image JPEG gibi kodlanmış bir görüntü dosyasına kaydetme işlemi gösterilmektedir.
İlkel Öğelere Efekt Uygulama
Bu konu başlığında Direct2D ve DirectWrite temel bir dizi efektin nasıl uygulanacağı gösterilmektedir.
Efekt Grafiklerinde Duyarlığı ve Sayısal Kırpmayı Denetleme
Direct2D kullanarak etkileri işleyen uygulamalar, sayısal duyarlık açısından istenen kalite ve öngörülebilirlik düzeyine ulaşmak için dikkatli olmalıdır.

Görüntüye efekt uygulama

Görüntülere dönüşüm uygulamak için Direct2D efektleri API'sini kullanabilirsiniz.

Not

Bu örnekte zaten ID2D1DeviceContext ve IWICBitmapSource nesnelerinin oluşturulduğu varsayılır. Bu nesneleri oluşturma hakkında daha fazla bilgi için bkz. FilePicker kullanarak Direct2D efektlerine görüntü yükleme ve Cihazlar ve Cihaz Bağlamları.

  1. BIR ID2D1Effect değişkeni bildirin ve ID2DDeviceContext::CreateEffect yöntemini kullanarak bir bit eşlem kaynağı efekti oluşturun.

        ComPtr<ID2D1Effect> bitmapSourceEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
    
  2. ID2D1Effect::SetValuekullanarak BitmapSource özelliğini WIC bit eşlem kaynağına ayarlayın.

            DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
    
  3. bir ID2D1Effect değişkeni bildirin ve ardından gaussian bulanıklaştırma efektini oluşturun.

        ComPtr<ID2D1Effect> gaussianBlurEffect;
    
        DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
    
  4. Bit eşlem kaynağı efektinden görüntüyü almak için girişi ayarlayın. SetValue yöntemini ve standart sapma özelliğini bulanıklaştırma miktarını ayarlayın.

        gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get());
    
        DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
    
  5. Elde edilen görüntü çıkışını çizmek için cihaz bağlamını kullanın.

        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 yöntemi, diğer Direct2D işleme işlemleri gibi ID2DDeviceContext::BeginDrawile EndDraw çağrıları arasında çağrılmalıdır. DrawImage bir görüntüyü veya efektin çıkışını alıp hedef yüzeye işleyebilir.

Uzamsal Dönüşümler

Direct2D, görüntüleri 2B ve 3B alanda dönüştürebilen yerleşik efektler ve ölçeklendirme sağlar. Ölçek ve dönüşüm efektleri, en yakın komşu, doğrusal, kübik, çok örnekli doğrusal, anizotropik ve yüksek kaliteli kübik gibi çeşitli kalite düzeyleri sunar.

Not

Anisotropik mod ölçeklendirme sırasında mipmap'ler oluşturur, ancak dönüştürmeye giriş olan efektlerde önbelleğe alınmış özelliğini true olarak ayarlarsanız, yeterince küçük görüntüler için her seferinde mipmap'ler oluşturulmaz.

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

2B benfin dönüştürme efektinin bu kullanımı bit eşlemi saat yönünün tersine biraz döndürür.

Önce
Görüntüden önce 2b benfin efekti .
Sonra
Görüntüden sonra 2b benfin efektini .

Görüntüleri oluşturma

Bazı efektler birden çok girişi kabul eder ve bunları tek bir sonuçta elde edilen görüntüde birleştirir.

Yerleşik bileşik ve aritmetik bileşik efektler çeşitli modlar sağlar. Daha fazla bilgi için bileşik konusuna bakın. blend etkisi çeşitli GPU hızlandırılmış modlara sahiptir.

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

Bileşik efekt, görüntüleri belirttiğiniz moda göre çeşitli şekillerde birleştirir.

Piksel ayarlamaları

Piksel verilerini değiştirmenize olanak sağlayan birkaç yerleşik Direct2D efekti vardır. Örneğin, renk matrisi efekti bir görüntünün rengini değiştirmek için kullanılabilir.

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

Bu kod, görüntüyü alır ve buradaki örnek görüntülerde gösterildiği gibi rengi değiştirir.

Önce
Resimden önce renk matrisi efektini .
Sonra
Görüntüden sonra renk matrisi efektini .

Daha fazla bilgi için renk yerleşik efektleri bölümüne bakın.

Efekt grafikleri oluşturma

Görüntüleri dönüştürmek için efektleri birbirine zincirleyebilirsiniz. Örneğin, buradaki kod bir gölge ve 2B dönüşüm uygular ve ardından sonuçları birleştirir.

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

Sonuç aşağıdadır.

gölge efekti çıkışı .

Efektler, ID2D1Image nesnelerini giriş olarak alır. ID2D1Imagearabiriminden türetildiği için id2D1Bitmapkullanabilirsiniz. ID2D1Effect::GetOutput kullanarak ID2D1Effect nesnesinin çıktısını ID2D1Image olarak alabilir veya çıkışı sizin için dönüştüren SetInputEffect yöntemini kullanabilirsiniz. Çoğu durumda bir efekt grafı, doğrudan zincirlenmiş ID2D1Effect nesnelerden oluşur ve bu da ilgi çekici görseller oluşturmak için bir görüntüye birden çok efekt uygulamayı kolaylaştırır.

Daha fazla bilgi için bkz. İlkel öğelere efektler uygulama .

Direct2D temel görüntü efektleri örneği

Yerleşik Efektler