Ошибка при попытке визуализации геометрии пути в проекте Direct2D UWP (C ++ / WinRT) - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь изучить 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 Ответ

0 голосов
/ 03 января 2019

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

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

...