2014-11-01 67 views
1

比方說,我有一個高斯模糊效果ID2D1Effect *blur;,我想應用位圖來獲得模糊圖像。我可以使用blur->SetInput(0, bitmap);將位圖傳遞給效果,並使用blur->Get()獲得輸出。現在我不想模糊存儲在磁盤上的圖像,我想模糊在renderTarget->BeginDraw()renderTarget->EndDraw()之間創建的輸出。我的第一個想法是獲得輸出的位圖,但是我找不到用於檢索已渲染輸出的函數,也沒有找到將效果應用於renderTarget而不是加載位圖的方法。將效果應用於輸出而不是位圖?

小例子:

ID2D1SolidColorBrush *brush; 
ID2D1HwndRenderTarget *renderTarget; // Instantiated somewhere else in code 

renderTarget->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.6f, 1.0f), &bush); 

renderTarget->BeginDraw(); 
renderTarget->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f)); 
renderTarget->FillRectangle(D2D1::RectF(50.0f, 50.0f, 100.0f, 100.0f), brush); 
// Apply gaussian blur? 
renderTarget->EndDraw(); 

brush->Release(); 
// renderTarget gets released somewhere else 

我怎樣才能在模糊這個例子中,矩形?


EDIT(感謝enhzflep):

我能夠獲得已經呈現的輸出與下面的代碼段的位圖:

ID2D1BitmapRenderTarget *bitmapRenderTarget; 
hwndRenderTarget->CreateCompatibleRenderTarget(&bitmapRenderTarget); 

ID2D1Bitmap *bitmap; 
bitmapRenderTarget->GetBitmap(&bitmap); 

在我的代碼我已經測試了它通過獲取一個位圖,繪製它,最後將這個位圖繪製到hwndRenderTarget上,它工作。在將位圖繪製回hwndRenderTarget之前,我想對其應用效果(例如高斯模糊)。但是這會導致下一個問題(我不知道是否應該開放一個新主題,所以我在此處發佈):ID2D1Effect接口只能從ID2D1DeviceContext的實例中實例化,該實例僅適用於Windows 8.我不能想象一下微軟將ID2D1Effect限制到Windows 8,所以必須有另一種方式。 有誰知道另一種方式來安裝一個ID2D1Effect接口?


編輯2

我也貼在MSDN上這個問題終於得到了answer。我必須安裝Platform Update for Win7 SP1 (KB2670838)Win8 SDK(也適用於Win7)才能在Win7上使用Win8頭文件。

(以下最終解答爲答案)

+0

我懷疑這個想法是渲染場景到位圖,過濾器,然後顯示結果。 – enhzflep 2014-11-01 14:22:30

+0

因此改爲使用HwndRenderTarget進行渲染,我應該使用BitmapRenderTarget? – Cubinator73 2014-11-01 15:45:52

+0

聽起來像是一個可能的候選人。 (我根本不知道DX) – enhzflep 2014-11-01 22:48:52

回答

1

這是我的最終解決方案。它比我更簡單,雖然它會是:

// Obtain already initialized ID2D1HwndRenderTarget 
ID2D1HwndRenderTarget *hwndRenderTarget = Game::GetInstance()->gfx->hwndRenderTarget; 

// COMs 
ID2D1Bitmap *bitmap; 
ID2D1BitmapRenderTarget *bitmapRenderTarget; 
ID2D1DeviceContext *deviceContext; 
ID2D1Effect *gaussianBlur; 
ID2D1SolidColorBrush *solidColorBrush; 

// Create bitmapRenderTarget 
hwndRenderTarget->CreateCompatibleRenderTarget(&bitmapRenderTarget); 

// Create solidColorBrush 
bitmapRenderTarget->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.6f, 1.0f), &solidColorBrush); 

// Draw onto bitmapRenderTarget 
bitmapRenderTarget->BeginDraw(); 
bitmapRenderTarget->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f)); 
bitmapRenderTarget->FillEllipse(D2D1::Ellipse(D2D1::Point2F(400.0f, 300.0f), 100.0f, 100.0f), solidColorBrush); 
bitmapRenderTarget->EndDraw(); 

// Obtain hwndRenderTarget's deviceContext 
hwndRenderTarget->QueryInterface(&deviceContext); 

// Create and apply gaussian blur 
deviceContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlur); 

bitmapRenderTarget->GetBitmap(&bitmap); 
gaussianBlur->SetInput(0, bitmap); 
gaussianBlur->SetValue(D2D1_GAUSSIANBLUR_PROP_BORDER_MODE, D2D1_BORDER_MODE_SOFT); 
gaussianBlur->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 5.0f); 

// Draw resulting bitmap 
deviceContext->DrawImage(
    gaussianBlur, 
    D2D1_INTERPOLATION_MODE_LINEAR); 

// Release 
bitmap->Release(); 
bitmapRenderTarget->Release(); 
deviceContext->Release(); 
gaussianBlur->Release(); 
solidColorBrush->Release(); 
+0

你應該把這個標記爲答案.. – 2014-11-03 09:13:52

+0

@MikeVersteeg我知道,但我必須等待24小時才能標記出答案。 – Cubinator73 2014-11-03 18:08:10

相關問題