我有一个使用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;
}
可以看出,三角形上有一些不应该出现的红色水平线和垂直线。
我发现,如果删除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图形分析器中获得的输出。
线条显示在第一张图纸中。