Ошибка при попытке визуализации геометрии пути в проекте Direct2D UWP (C++/WinRT)

Я пытаюсь изучить 2D и 3D графику, используя DirectX 11_1, и следую нескольким онлайн-учебникам. Тем не менее, я использую последний шаблон VS2017, Direct3D UWP Game (C++/WinRT), и модифицировал пример кода, так как многие учебные пособия не относятся к UWP. Я успешно воссоздал примеры в документации MSDN для линий сетки, а также для незаполненных и заполненных прямоугольников. Когда я пытаюсь создать сцену горы в этом учебном пособии, программа вылетает со следующим сообщением "Исключение, выданное в 0x75F9AB32 (KernelBase.dll) в Direct3D UWP Game.exe: Ошибка при создании WinRT - 0x80004005:" Неизвестное исключение "."

Целевая версия для моего проекта - 10.0.17763.0.

В следующем коде я попытался отобразить тот же прямоугольник, который я успешно создал с помощью метода D2DContext FillRectangle. Программа по-прежнему вылетает с тем же сообщением об ошибке.

m_d2dContext->BeginDraw();

// this code draws a yellow, filled rectangle with a 100px border
//m_d2dContext->FillRectangle(
//  D2D1::RectF(
//      m_clientRect.left + 100.0f,
//      m_clientRect.top + 100.0f,
//      m_clientRect.right - 100.0f,
//      m_clientRect.bottom - 100.0f),
//  m_YellowBrush.Get());

// attemp to draw same rectangle using path geometries
Microsoft::WRL::ComPtr<ID2D1PathGeometry> rectGeometry;

// create empty path geometries
DX::ThrowIfFailed(m_Direct2dFactory->CreatePathGeometry(rectGeometry.GetAddressOf()));

Microsoft::WRL::ComPtr<ID2D1GeometrySink> sink = nullptr;
DX::ThrowIfFailed(rectGeometry->Open(sink.GetAddressOf()));
sink->SetFillMode(D2D1_FILL_MODE_WINDING);

sink->BeginFigure(D2D1::Point2F(m_clientRect.left + 100.0f, m_clientRect.top + 100.0f), D2D1_FIGURE_BEGIN_FILLED);
D2D1_POINT_2F points[] = {
    D2D1::Point2F(m_clientRect.left + 100.0f, m_clientRect.top + 100.0f),
    D2D1::Point2F(m_clientRect.right - 100.0f, m_clientRect.top + 100.0f),
    D2D1::Point2F(m_clientRect.right - 100.0f, m_clientRect.bottom - 100.0f),
    D2D1::Point2F(m_clientRect.left + 100.0f, m_clientRect.bottom - 100.0f),
};
sink->AddLines(points, ARRAYSIZE(points));
sink->EndFigure(D2D1_FIGURE_END_CLOSED);

DX::ThrowIfFailed(sink->Close());

m_d2dContext->DrawGeometry(rectGeometry.Get(), m_YellowBrush.Get(), 4); // draw rect
m_d2dContext->FillGeometry(rectGeometry.Get(), m_YellowBrush.Get());    // fill the rect

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

Ошибка возникает, когда программа попадает в строку EndDraw(). Я довольно новичок в программировании на C++ (фон - C#), но никаких ошибок сборки или предупреждений не отображается.

Был бы признателен за любую помощь в решении этой проблемы, так как я не могу продвинуться дальше, пока не пойму, где я иду не так!!

Большое спасибо.

DogFather2

1 ответ

Ошибка возникает, когда программа попадает в строку EndDraw().

Если EndDraw терпит неудачу, он возвращает HRESULT, который описывает любую ошибку, которая произошла при пакетировании команд рисования. Окно вывода отладчика также может отображать дополнительную информацию об ошибке, если вы установили D2D1_DEBUG_LEVEL_INFORMATION.

Другие вопросы по тегам