为什么在Direct2D中错误地填充带有缠绕和大坐标的FillGeometry

时间:2018-08-14 07:48:12

标签: graphics mfc direct2d

我有一个使用Direct2D绘画的MFC程序。
以下是使用FillGeometry填充三角形的draw方法的一个非常简单的版本。

// AFX_WM_DRAW2D event handler
afx_msg LRESULT CChildView::OnDraw2d( WPARAM wParam, LPARAM lParam )
{
    CHwndRenderTarget* pclRenderTarget = (CHwndRenderTarget*)lParam;
    ASSERT_VALID( pclRenderTarget );
    // Clear window background
    pclRenderTarget->Clear( D2D1::ColorF( D2D1::ColorF::Red ) );

    const float fZoom = 0.2f;
    const float fOffset = 50000000;
    pclRenderTarget->SetTransform( D2D1::Matrix3x2F::Translation( D2D1::Size( -fOffset, -fOffset ) ) * D2D1::Matrix3x2F::Scale( fZoom , fZoom )  );

    CD2DPathGeometry clPath( pclRenderTarget );
    clPath.Create( pclRenderTarget );
    ID2D1GeometrySink* pclSink = clPath.Open();
    pclSink->SetFillMode( D2D1_FILL_MODE_WINDING );
    pclSink->BeginFigure( D2D1::Point2F( fOffset + 100,   fOffset + 100 ), D2D1_FIGURE_BEGIN_FILLED );
    pclSink->AddLine( D2D1::Point2F(     fOffset + 100,   fOffset + 10000 ) );
    pclSink->AddLine( D2D1::Point2F(     fOffset + 10000, fOffset + 100 ) );
    pclSink->EndFigure( D2D1_FIGURE_END_CLOSED );
    pclSink->Close();
    pclRenderTarget->FillGeometry( &clPath, m_pBlueBrush );
    return TRUE;
}

当我运行程序时,它看起来像这样。 enter image description here

可以看出,三角形上有一些不应该出现的红色水平线和垂直线。
我发现,如果删除D2D1_FILL_MODE_WINDING,三角形将被填充,没有任何预期的线条。
我还发现,如果减少“偏移”,线条会变细,最终消失。
我在其他计算机上尝试过该程序。

行显示在
* Windows 10(1803)和Nvidia GeForce GTX 1050 Ti
* Windows 10(1803)和AMD Radeon R9 370
* Windows 10(1709)和Nvidia Quadro P400
* Windows 10(1803)和Intel HD 5500

行未显示在
上 * Windows 10(1803)和AMD FirePro2270
* Windows 7和AMD Radeon 8790M / Intel
* VirualBox中的Windows 10(1803)

但是我在行为上找不到任何模式。

有人可以解释这里发生的事情吗?

首先,我想这可能是驱动程序错误,但是由于我在不同的显卡上看到它,因此我不愿接受。

更新
这是我在Visual Studio图形分析器中获得的输出。
线条显示在第一张图纸中。
enter image description here

0 个答案:

没有答案