0

当我在玩这个 MSDN 示例时,我只是无法在由 DXGISurface 创建并填充了一些矩形的 ID2D1Image 上添加模糊效果。

这是我的EndDraw方法:

void Scenario1ImageSource::EndDraw()
{
    // Remove the transform and clip applied in BeginDraw since
    // the target area can change on every update.
    m_d2dContext->SetTransform(D2D1::IdentityMatrix());
    m_d2dContext->PopAxisAlignedClip();

    DX::ThrowIfFailed(
        m_d2dContext->Flush()
        );

    ComPtr<ID2D1Image> bitmap;
    m_d2dContext->GetTarget(&bitmap);

    DX::ThrowIfFailed(
        m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &m_gaussianBlurEffect)
        );

    m_gaussianBlurEffect->SetInput(0, bitmap.Get());

    DX::ThrowIfFailed(
        m_gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 3.0f)
        );
    DX::ThrowIfFailed(
        m_gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_BORDER_MODE, D2D1_BORDER_MODE_HARD)
        );

    m_d2dContext->BeginDraw();

    m_d2dContext->DrawImage(m_gaussianBlurEffect.Get());


    // Remove the render target and end drawing.
    DX::ThrowIfFailed(
        m_d2dContext->EndDraw()
        );

    m_d2dContext->SetTarget(nullptr);

    // Query for ISurfaceImageSourceNative interface.
    Microsoft::WRL::ComPtr<ISurfaceImageSourceNative> sisNative;    
    DX::ThrowIfFailed(
        reinterpret_cast<IUnknown*>(this)->QueryInterface(IID_PPV_ARGS(&sisNative))
        );

    DX::ThrowIfFailed(
        sisNative->EndDraw()
        );
}

我想在他们在图像上绘制后模糊我的矩形。为什么它通过抛出带有错误代码 D2DERR_INVALID_GRAPH_CONFIGURATION 的异常而失败?

4

1 回答 1

1

BeginDraw/EndDraw导致您的问题是因为当该资源被用作目标时,您试图将效果应用于块中的资源(在您的情况下为位图/表面)DeviceContext。粗略地说,当你调用 时ID2D1RenderTarget.BeginDraw,它的目标被锁定,你不能将它用于除 a 之外的其他东西TARGET

一个简单的解决方案是使用中间位图作为屏幕外的位图。例如(伪代码):

// somewhere at some initialization point
deviceContext.CreateBitmap(size, nil, 0, @bitmapProps, newBitmap);

// drawing routine
deviceContext.GetTarget(yourInitialTarget);
deviceContext.SetTarget(newBitmap);

deviceContext.BeginDraw;
try
  fBrush.SetColor(getRandomColor);
  deviceContext.FillRect(getRect, fBrush);
finally
  deviceContext.EndDraw;
end;

deviceContext.CreateEffect(@CLSID_D2D1GaussianBlur, fx);
fx.SetInput(0, newBitmap);
fx.GetOutput(newBitmap);

deviceContext.SetTarget(yourInitialTarget);

deviceContext.BeginDraw;
try
  deviceContext.Clear(getRandomColor);
  deviceContext.DrawImage(newBitmap);
finally
  deviceContext.EndDraw;
end;

请记住,内置 GaussianBlur 效果的输出位图可能大于输入位图。高斯模糊效果

于 2014-11-26T07:49:24.883 回答