Opaklık Maskelerine Genel Bakış
Bu konuda, opaklık maskelerini tanımlamak için bit eşlemlerin ve fırçaların nasıl kullanılacağı açıklanmaktadır. Aşağıdaki bölümleri içerir.
- Önkoşullar
- Opaklık Maskesi Nedir?
- FillOpacityMask Yöntemiyle Saydamlık Maskesi Olarak Bitmap Kullanma
- FillGeometry Yöntemi ile Opaklık Maskesi Olarak Fırça Kullanma
- Katmana Opaklık Maskesi Uygulama
- İlgili konular
Önkoşullar
Bu genel bakış, basit bir Direct2D uygulaması oluşturma kılavuzunda açıklandığı gibi temel Direct2D çizim işlemleri hakkında bilgi sahibi olduğunuzu varsayar. Fırçalara Genel Bakışaçıklandığı gibi farklı fırça türlerini de biliyor olmalısınız.
Opaklık Maskesi Nedir?
Opaklık maskesi, bir fırça veya bit eşlem tarafından tanımlanan ve bu nesneyi kısmen veya tamamen saydam hale getirmek için başka bir nesneye uygulanan bir maskedir. Opaklık maskesi, nesnenin kaynak piksellerinin son hedef hedefle nasıl karıştırılacağını belirtmek için alfa kanalı bilgilerini kullanır. Maskenin saydam bölümleri, temel alınan görüntünün gizlendiği alanları gösterirken, maskenin opak bölümleri maskelenen nesnenin nerede görünür olduğunu gösterir.
Opaklık maskesi uygulamanın birkaç yolu vardır:
- ID2D1RenderTarget::FillOpacityMask yöntemini kullanın. FillOpacityMask yöntemi, bir rendirme hedefinin dikdörtgen bölgesini çizer ve ardından bir bit eşlem ile tanımlanan bir opaklık maskesi uygular. Opaklık maskeniz bit eşlem olduğunda ve dikdörtgen bir bölgeyi doldurmak istediğinizde bu yöntemi kullanın.
- ID2D1RenderTarget::FillGeometry yöntemini kullanın. FillGeometry yöntemi, belirtilen ID2D1BitmapBrushile geometrinin içini boyar ve ardından fırça tarafından tanımlanan bir opaklık maskesi uygular. Geometriye opaklık maskesi uygulamak veya fırçayı opaklık maskesi olarak kullanmak istediğinizde bu yöntemi kullanın.
- Opaklık maskesi uygulamak için ID2D1Layer kullanın. Yalnızca tek bir şekil veya görüntüye değil, bir grup çizim içeriğine opaklık maskesi uygulamak istediğinizde bu yaklaşımı kullanın. Ayrıntılar için bkz. Katmanlara Genel Bakış.
FillOpacityMask Yöntemi ile bir Bitmap'i Opaklık Maskesi Olarak Kullanma
FillOpacityMask yöntemi, bir işleme hedefinin dikdörtgen bölgesini boyar ve ardından ID2D1Bitmaptarafından tanımlanan bir opaklık maskesi uygular. Dikdörtgen bir bölge için opaklık maskesi olarak kullanmak istediğiniz bir bit eşlem varsa bu yöntemi kullanın.
Aşağıdaki diyagram, bir çiçek görüntüsüyle ID2D1Bitmap opaklık maskesinin, eğrelti otu görüntüsüyle ID2D1BitmapBrush üzerine uygulanmasının bir etkisini gösterir. Elde edilen görüntü, çiçek şekline kırpılmış bir bitkinin bitmapidir.
Bir eğrelti otu resmi üzerinde opaklık maskesi olarak kullanılan bir çiçek bit haritasının
Aşağıdaki kod örnekleri bunun nasıl yapıldığını gösterir.
İlk örnek, bitmap maskesi olarak kullanmak üzere aşağıdaki bitmap'i m_pBitmapMaskyükler. Aşağıdaki çizimde, üretilen çıktı gösterilmektedir. Bit eşleminin opak kısmı siyah görünse de, bit eşlemdeki renk bilgilerinin opaklık maskesi üzerinde hiçbir etkisi olmadığını unutmayın; bit eşlem içindeki her pikselin yalnızca opaklık bilgileri kullanılır. Bu bit eşlem içindeki tamamen opak pikseller yalnızca açıklayıcı amaçlarla siyah renktedir.
çizimi
Bu örnekte, ID2D1Bitmap, örneğin başka bir yerde tanımlanan LoadResourceBitmap yardımcı metodu tarafından yüklenir.
if (SUCCEEDED(hr))
{
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"BitmapMask",
L"Image",
&m_pBitmapMask
);
}
Sonraki örnek, opaklık maskesinin uygulandığı m_pFernBitmapBrushfırçayı tanımlar. Bu örnekte, eğrelti otunun görüntüsünü içeren bir ID2D1BitmapBrush kullanılır, ancak bunun yerine bir ID2D1SolidColorBrush, bir ID2D1LinearGradientBrushveya bir ID2D1RadialGradientBrush kullanabilirsiniz. Aşağıdaki çizimde, üretilen çıktı gösterilmektedir.
if (SUCCEEDED(hr))
{
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp =
D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
hr = m_pRenderTarget->CreateBitmapBrush(
m_pFernBitmap,
propertiesXClampYClamp,
&m_pFernBitmapBrush
);
}
Artık opaklık maskesi ve fırça tanımlandığına göre uygulamanızın işleme yönteminde FillOpacityMaskyöntemini kullanabilirsiniz. FillOpacityMask yöntemini çağırdığınızda, kullandığınız opaklık maskesi türünü belirtmeniz gerekir: D2D1_OPACITY_MASK_CONTENT_GRAPHICS, D2D1_OPACITY_MASK_CONTENT_TEXT_NATURALve D2D1_OPACITY_MASK_CONTENT_TEXT_GDI_COMPATIBLE. Bu üç türün anlamları için bkz. D2D1_OPACITY_MASK_CONTENT.
Not
Windows 8'den başlayarak, D2D1_OPACITY_MASK_CONTENT gerekli değildir. D2D1_OPACITY_MASK_CONTENT parametresi olmayan ID2D1DeviceContext::FillOpacityMask yöntemine bakın.
Sonraki örnek, opaklık maskesinin düzgün çalışması için işleme hedefinin dengeleme modunu D2D1_ANTIALIAS_MODE_ALIASED olarak ayarlar. Ardından FillOpacityMask yöntemini çağırır ve opaklık maskesini (m_pBitmapMask), opaklık maskesinin uygulandığı fırçayı (m_pFernBitmapBrush), opaklık maskesinin içindeki içerik türünü (D2D1_OPACITY_MASK_CONTENT_GRAPHICS) ve boyanacak alanı geçirir. Aşağıdaki çizimde, üretilen çıktı gösterilmektedir.
D2D1_RECT_F rcBrushRect = D2D1::RectF(5, 5, 155, 155);
// D2D1_ANTIALIAS_MODE_ALIASED must be set for FillOpacityMask to function properly
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
m_pRenderTarget->FillOpacityMask(
m_pBitmapMask,
m_pFernBitmapBrush,
D2D1_OPACITY_MASK_CONTENT_GRAPHICS,
&rcBrushRect
);
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
Bu örnekte kod atlanmıştır.
FillGeometry Yöntemiyle Opaklık Maskesi Olarak Fırça Kullanma
Önceki bölümde, ID2D1Bitmap opaklık maskesi olarak nasıl kullanılacağı açıklanmıştır. Direct2D ayrıca id2D1Geometrydoldururken isteğe bağlı olarak fırçayı opaklık maskesi olarak belirtmenizi sağlayan id2D1RenderTarget::FillGeometryyöntemini sağlar. Bu, gradyanlardan (ID2D1LinearGradientBrushveya ID2D1RadialGradientBrush)kullanarak) ve bit eşlemlerden (ID2D1Bitmap kullanarak) opaklık maskeleri oluşturmanıza olanak tanır.
FillGeometry yöntemi üç parametre alır:
- ID2D1Geometryilk parametresi, boyanacak şekli tanımlar.
- ID2D1Brusholan ikinci parametre, geometriyi boyamak için kullanılan fırçayı belirtir. Bu parametre, x ve y genişletme modları D2D1_EXTEND_MODE_CLAMPolarak ayarlanmış bir ID2D1BitmapBrush olmalıdır.
- ID2D1Brusholan üçüncü parametre, opaklık maskesi olarak kullanılacak bir fırça belirtir. Bu fırça bir ID2D1LinearGradientBrush, bir ID2D1RadialGradientBrushveya bir ID2D1BitmapBrusholabilir. (Teknik olarak, ID2D1SolidColorBrushkullanabilirsiniz, ancak opaklık maskesi olarak düz bir renk fırçası kullanmak ilginç sonuçlar vermez.)
Aşağıdaki bölümlerde, ID2D1LinearGradientBrush ve ID2D1RadialGradientBrush nesnelerin opaklık maskeleri olarak nasıl kullanılacağı açıklanmaktadır.
Doğrusal Gradyan Fırçayı Opaklık Maskesi Olarak Kullanma
Aşağıdaki diyagram, çiçeklerden oluşan bir bitmap ile doldurulmuş bir dikdörtgene doğrusal degrade fırçası uygulamanın etkisini göstermektedir.
Aşağıdaki adımlarda bu etkinin nasıl yeniden oluşturulacağı açıklanır.
Maskelenecek içeriği tanımlayın. Aşağıdaki örnek, ID2D1BitmapBrushve m_pLinearFadeFlowersBitmapoluşturur. m_pLinearFadeFlowersBitmap için x ve y genişletme modu D2D1_EXTEND_MODE_CLAMP olarak ayarlanır, böylece FillGeometry yöntemi tarafından opaklık maskesiyle kullanılabilir.
if (SUCCEEDED(hr)) { // Create the bitmap to be used by the bitmap brush. hr = LoadResourceBitmap( m_pRenderTarget, m_pWICFactory, L"LinearFadeFlowers", L"Image", &m_pLinearFadeFlowersBitmap ); } if (SUCCEEDED(hr)) { D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp = D2D1::BitmapBrushProperties( D2D1_EXTEND_MODE_CLAMP, D2D1_EXTEND_MODE_CLAMP, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR );
C++ if (SUCCEEDED(hr)) { hr = m_pRenderTarget->CreateBitmapBrush( m_pLinearFadeFlowersBitmap, propertiesXClampYClamp, &m_pLinearFadeFlowersBitmapBrush ); }
C++ }
Opaklık maskesini tanımlayın. Bir sonraki kod örneği, 0 konumunda tamamen opak siyahtan 1. konumda tamamen saydam beyaza kadar solan çapraz doğrusal gradyan fırça (m_pLinearGradientBrush) oluşturur.
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection *pGradientStops = NULL;
static const D2D1_GRADIENT_STOP gradientStops[] =
{
{ 0.f, D2D1::ColorF(D2D1::ColorF::Black, 1.0f) },
{ 1.f, D2D1::ColorF(D2D1::ColorF::White, 0.0f) },
};
hr = m_pRenderTarget->CreateGradientStopCollection(
gradientStops,
2,
&pGradientStops);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateLinearGradientBrush(
D2D1::LinearGradientBrushProperties(
D2D1::Point2F(0, 0),
D2D1::Point2F(150, 150)),
pGradientStops,
&m_pLinearGradientBrush);
}
pGradientStops->Release();
}
- FillGeometry yöntemini kullanın. Son örnek, içeriğe dolgu yapmak için FillGeometry yöntemini içerik fırçasına uygular, ID2D1RectangleGeometry (m_pRectGeo) öğesini ID2D1BitmapBrush (m_pLinearFadeFlowersBitmap) ile doldurur ve bir opaklık maskesi (m_pLinearGradientBrush) uygular.
m_pRenderTarget->FillGeometry(
m_pRectGeo,
m_pLinearFadeFlowersBitmapBrush,
m_pLinearGradientBrush
);
Bu örnekte kod atlanmıştır.
Opaklık Maskesi Olarak Radyal Gradyan Fırçası Kullanma
Aşağıdaki diyagramda, bir bitmap resmi olan yeşillik ile doldurulmuş bir dikdörtgene uygulanan radyal gradyan fırçasının görsel etkisi gösterilmektedir.
İlk örnek, ID2D1BitmapBrush, m_pRadialFadeFlowersBitmapBrusholuşturur. FillGeometry yöntemiyle opaklık maskesiyle kullanılabilmesi için, m_pRadialFadeFlowersBitmapBrush için x ve y genişletme modu D2D1_EXTEND_MODE_CLAMPolarak ayarlanır.
if (SUCCEEDED(hr))
{
// Create the bitmap to be used by the bitmap brush.
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"RadialFadeFlowers",
L"Image",
&m_pRadialFadeFlowersBitmap
);
}
if (SUCCEEDED(hr))
{
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp =
D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
C++ |
---|
|
C++ |
---|
|
Sonraki örnek, opaklık maskesi olarak kullanılacak radyal gradyan fırçasını tanımlar.
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection *pGradientStops = NULL;
static const D2D1_GRADIENT_STOP gradientStops[] =
{
{ 0.f, D2D1::ColorF(D2D1::ColorF::Black, 1.0f) },
{ 1.f, D2D1::ColorF(D2D1::ColorF::White, 0.0f) },
};
hr = m_pRenderTarget->CreateGradientStopCollection(
gradientStops,
2,
&pGradientStops);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateRadialGradientBrush(
D2D1::RadialGradientBrushProperties(
D2D1::Point2F(75, 75),
D2D1::Point2F(0, 0),
75,
75),
pGradientStops,
&m_pRadialGradientBrush);
}
pGradientStops->Release();
}
Son kod örneğinde ID2D1RectangleGeometry (m_pRectGeo)doldurmak için ID2D1BitmapBrush (m_pRadialFadeFlowersBitmapBrush) ve opaklık maskesi (m_pRadialGradientBrush) kullanılır.
m_pRenderTarget->FillGeometry(
m_pRectGeo,
m_pRadialFadeFlowersBitmapBrush,
m_pRadialGradientBrush
);
Bu örnekte kod atlanmıştır.
Katmana Opaklık Maskesi Uygulama
Bir işleme hedefine bir ID2D1Layer katmanı eklemek için PushLayer çağırdığınızda, fırçayı opaklık maskesi olarak uygulamak için D2D1_LAYER_PARAMETERS yapısını kullanabilirsiniz. Aşağıdaki kod örneği, opaklık maskesi olarak ID2D1RadialGradientBrush kullanır.
HRESULT DemoApp::RenderWithLayerWithOpacityMask(ID2D1RenderTarget *pRT)
{
HRESULT hr = S_OK;
// Create a layer.
ID2D1Layer *pLayer = NULL;
hr = pRT->CreateLayer(NULL, &pLayer);
if (SUCCEEDED(hr))
{
pRT->SetTransform(D2D1::Matrix3x2F::Translation(300, 250));
// Push the layer with the content bounds.
pRT->PushLayer(
D2D1::LayerParameters(
D2D1::InfiniteRect(),
NULL,
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1::IdentityMatrix(),
1.0,
m_pRadialGradientBrush,
D2D1_LAYER_OPTIONS_NONE),
pLayer
);
pRT->DrawBitmap(m_pBambooBitmap, D2D1::RectF(0, 0, 190, 127));
pRT->FillRectangle(
D2D1::RectF(25.f, 25.f, 50.f, 50.f),
m_pSolidColorBrush
);
pRT->FillRectangle(
D2D1::RectF(50.f, 50.f, 75.f, 75.f),
m_pSolidColorBrush
);
pRT->FillRectangle(
D2D1::RectF(75.f, 75.f, 100.f, 100.f),
m_pSolidColorBrush
);
pRT->PopLayer();
}
SafeRelease(&pLayer);
return hr;
}
Katmanları kullanma hakkında daha fazla bilgi için bkz. Katmanlara Genel Bakış.
İlgili konular