2014-11-01 3 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. Я не могу представьте, что Microsoft ограничивает ID2D1Effect Windows 8, поэтому должен быть другой способ. Кто-нибудь знает другой способ созданияID2D1Effectинтерфейс?


EDIT 2:

Я также отвечал на этот вопрос на MSDN и, наконец, получил answer. Мне пришлось установить Platform Update for Win7 SP1 (KB2670838) и Win8 SDK (также работает на Win7), чтобы использовать Win8-заголовки на Win7.

(Окончательное решение ниже в качестве ответа)

+0

Я подозреваю, что идея состоит в том, чтобы сделать сцену растровым, фильтровать, а затем показать результат. – enhzflep

+0

Итак, вместо использования HwndRenderTarget для рендеринга, я должен использовать BitmapRenderTarget? – Cubinator73

+0

Звучит как вероятный кандидат. (Я вообще не знаю DX) – enhzflep

ответ

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

Вы должны отметить это как ответ. –

+0

@MikeVersteeg Я знаю, но мне пришлось ждать 24 часа, чтобы отметить этот ответ. – Cubinator73

Смежные вопросы