Anwenden von Effekten auf Primitive
In diesem Thema wird gezeigt, wie Sie eine Reihe von Effekten auf Direct2D und DirectWrite Primitive anwenden.
Sie können die Direct2D-Effekt-API verwenden, um Effektdiagramme auf Primitive anzuwenden, die von Direct2D auf ein Bild gerendert werden. Das beispiel enthält zwei abgerundete Rechtecke und den Text "Direct2D". Verwenden Sie Direct2D, um die Rechtecke zu zeichnen, und DirectWrite, um den Text zu zeichnen.

Mit Direct2D-Effektenkönnen Sie dieses Bild wie das nächste Bild aussehen lassen. Wenden Sie die effekte Gaußscher Weichzeichner, Point Specular Lighting, Arithmetic Compositeund Composite auf die 2D-Primitive an, um das Bild hier zu erstellen.

Nachdem Sie die Rechtecke und den Text auf einer Zwischenoberfläche gerendert haben, können Sie diese als Eingabe für ID2D1Effect-Objekte im Bilddiagramm verwenden.
Legen Sie in diesem Beispiel das ursprüngliche Bild als Eingabe für den effekt Gaußscher Weichzeichner fest, und legen Sie dann die Ausgabe des Weichzeichners als Eingabe für den Point Specular Lighting-Effektfest. Das Ergebnis dieses Effekts wird dann zweimal mit dem ursprünglichen Bild zusammengesetzt, um das endgültige Bild abzurufen, das im Fenster gerendert wird.
Hier sehen Sie ein Diagramm des Bilddiagramms.

Dieses Effektdiagramm besteht aus vier ID2D1Effect-Objekten, die jeweils einen anderen integrierten Effekt darstellen. Sie können benutzerdefinierte Effekte auf die gleiche Weise erstellen und verbinden, nachdem Sie sie mit id1D1Factory1::RegisterEffectregistriert haben. Der Code hier erstellt die Effekte, legt die Eigenschaften fest und verbindet das zuvor gezeigte Effektdiagramm.
Erstellen Sie den Weichzeichnereffekt "Gaussian" mithilfe der ID2D1DeviceContext::CreateEffect-Methode, und geben Sie die richtige CLSID an. Die CLSIDs für die integrierten Effekte werden in d2d1effects.h definiert. Anschließend legen Sie die Standardabweichung des Weichzeichners mithilfe der ID2D1Effect::SetValue-Methode fest.
// Create the Gaussian Blur Effect DX::ThrowIfFailed( m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect) ); // Set the blur amount DX::ThrowIfFailed( gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, sc_gaussianBlurStDev) );Der Weichzeichnereffekt "Gaussian" verwischt alle Kanäle des Bilds, einschließlich des Alphakanals.
Erstellen Sie den Glanzlichteffekt, und legen Sie die Eigenschaften fest. Die Position des Lichts ist ein Vektor von drei Gleitkommawerten. Daher müssen Sie sie als separate Variable deklarieren und an die SetValue-Methode übergeben.
// Create the Specular Lighting Effect DX::ThrowIfFailed( m_d2dContext->CreateEffect(CLSID_D2D1PointSpecular, &specularLightingEffect) ); DX::ThrowIfFailed( specularLightingEffect->SetValue(D2D1_POINTSPECULAR_PROP_LIGHT_POSITION, sc_specularLightPosition) ); DX::ThrowIfFailed( specularLightingEffect->SetValue(D2D1_POINTSPECULAR_PROP_SPECULAR_EXPONENT, sc_specularExponent) ); DX::ThrowIfFailed( specularLightingEffect->SetValue(D2D1_POINTSPECULAR_PROP_SURFACE_SCALE, sc_specularSurfaceScale) ); DX::ThrowIfFailed( specularLightingEffect->SetValue(D2D1_POINTSPECULAR_PROP_SPECULAR_CONSTANT, sc_specularConstant) );Der Glanzlichteffekt verwendet den Alphakanal der Eingabe, um eine Höhenkarte für die Beleuchtung zu erstellen.
Es gibt zwei verschiedene zusammengesetzte Effekte, die Sie mit dem zusammengesetzten Effekt und dem arithmetischen zusammengesetzten-Effekt verwenden können. Dieses Effektdiagramm verwendet beides.
Erstellen Sie den zusammengesetzten Effekt, und legen Sie den Modus auf D2D1 _ COMPOSITE MODE SOURCE IN _ _ _ fest, wodurch die Schnittmenge der Quell- und Zielbilder ausgegeben wird.
Der arithmetische zusammengesetzte Effekt erstellt die beiden Eingabebilder basierend auf einer Formel, die vom World Wide Web Consortium (W3C) für den SVG-Standard (Scalable Vector Graphics) definiert wird. Erstellen Sie eine arithmetische Zusammengesetztkeit, und legen Sie die Koeffizienten für die Formel fest.
// Create the Composite Effects DX::ThrowIfFailed( m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect) ); DX::ThrowIfFailed( compositeEffect->SetValue(D2D1_COMPOSITE_PROP_MODE, D2D1_COMPOSITE_MODE_SOURCE_IN) ); DX::ThrowIfFailed( m_d2dContext->CreateEffect(CLSID_D2D1ArithmeticComposite, &m_arithmeticCompositeEffect) ); DX::ThrowIfFailed( m_arithmeticCompositeEffect->SetValue(D2D1_ARITHMETICCOMPOSITE_PROP_COEFFICIENTS, sc_arithmeticCoefficients) );Die Koeffizienten für den arithmetischen zusammengesetzten Effekt sind hier dargestellt.
D2D1_VECTOR_4F sc_arithmeticCoefficients = D2D1::Vector4F(0.0f, 1.0f, 1.0f, 0.0f);In diesem Effektdiagramm nehmen beide zusammengesetzten Effekte die Ausgabe der anderen Effekte und die Zwischenoberfläche als Eingaben und zusammengesetzte Effekte an.
Abschließend verbinden Sie die Effekte, um das Diagramm zu bilden, indem Sie die Eingaben auf die richtigen Bilder und Bitmaps festlegen.
Der erste Effekt, der Gausssche Weichzeichner,empfängt seine Eingabe von der Zwischenoberfläche, in der Sie die Primitiven gerendert haben. Sie legen die Eingabe mithilfe der ID2D1Effect::SetInput-Methode fest und geben den Index eines ID2D1Image-Objekts an. Die Weichzeichner- und Glanzlichteffekte von Gaussian weisen nur eine einzige Eingabe auf. Für den Glanzlichteffekt wird der unscharfe Alphakanal des Gaußschen Weichzeichners verwendet.
Die zusammengesetzten und arithmetischen Verbundeffekte weisen mehrere Eingaben auf. Um sicherzustellen, dass die Bilder in der richtigen Reihenfolge zusammengestellt werden, müssen Sie den richtigen Index für jedes Eingabebild angeben.
// Connect the graph. // Apply a blur effect to the original image. gaussianBlurEffect->SetInput(0, m_inputImage.Get()); // Apply a specular lighting effect to the result. specularLightingEffect->SetInputEffect(0, gaussianBlurEffect.Get()); // Compose the original bitmap under the output from lighting and blur. compositeEffect->SetInput(0, m_inputImage.Get()); compositeEffect->SetInputEffect(1, specularLightingEffect.Get()); // Compose the original bitmap under the output from lighting and blur. m_arithmeticCompositeEffect->SetInput(0, m_inputImage.Get()); m_arithmeticCompositeEffect->SetInputEffect(1, compositeEffect.Get());Übergeben Sie das arithmetische Objekt des zusammengesetzten Effekts an die ID2DDeviceContext::D rawImage-Methode, und es verarbeitet und zeichnet die Ausgabe des Diagramms.
// Draw the output of the effects graph. m_d2dContext->DrawImage( m_arithmeticCompositeEffect.Get(), D2D1::Point2F( (size.width - sc_inputBitmapSize.width) / 2, (size.height - sc_inputBitmapSize.height) / 2 + sc_offset ) );