Чертеж не показывает, когда используется GDI-совместимый DC из IDXGISurface1 - PullRequest
2 голосов
/ 14 марта 2019

Я создал текстуру, которая совместима с GDI, но полученный от нее DC используется для рисования линий от точки к другой точке, которые не отображаются в окне просмотра. Также не исключение не выбрасывается. Я что-то пропустил? Кто-нибудь делал то же самое и успешно рисовал 2D-фигуры или что-то еще, используя GDI-совместимый DC? Пожалуйста, помогите.

// get texture surface1 and overlay DC from GDI compatible texture 2D
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = width;
desc.Height = height;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
desc.CPUAccessFlags = 0;
desc.MipLevels = 1;
desc.SampleDesc.Count = 1;
desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;

ID3D11Texture2DPtr texture2D;
IF_FAILED_THROW_HR(renderer->Device()->CreateTexture2D(&desc, nullptr, &texture2D));

// Create the shader resource view.
ID3D11ShaderResourceViewPtr shaderResourceView;
IF_FAILED_THROW_HR(device->CreateShaderResourceView(texture2D, nullptr, &shaderResourceView));

ID3D11ResourcePtr resource;
view->GetResource(&resource);
m_texture2D = resource;

m_dxgiSurface1 = m_texture2D;
TRY_CONDITION(m_dxgiSurface1);
HDC hdc{};
IF_FAILED_THROW_HR(m_dxgiSurface1->GetDC(FALSE, &hdc));

DXGI_SURFACE_DESC descOverlay = {0};
m_dxgiSurface1->GetDesc(&descOverlay);


// Draw on the DC using GDI
// fill the texture with the color key
::SetBkColor(overlayDC, m_keyColor);
const auto overlayRect = CRect{ 0, 0, gsl::narrow_cast<int>(descOverlay.Width), gsl::narrow_cast<int>(descOverlay.Height) };
::ExtTextOut(overlayDC, 0, 0, ETO_OPAQUE, overlayRect, nullptr, 0, nullptr);

m_dxgiSurface1->ReleaseDC(nullptr);

Обновление: Я отредактировал приведенный выше исходный код, в котором я создал вид ресурса шейдера из текстуры, совместимой с GDI, а затем перенес текстуру обратно из ресурса на поверхность1. Затем surface1 предоставляет DC, который используется для рисования GDI. Теперь плавный рендеринг, но GDI-чертеж не отображается.

1 Ответ

0 голосов
/ 26 июня 2019

Текстура, созданная после этого чертежа GDI, используется для смешивания с другими текстурами. Я находил эти рисунки поверх этих текстур, но позже обнаружил свои ошибки в том, что эта текстура чертежа GDI не смешивалась с другими текстурами в шейдерных программах, поэтому она не отображалась как наложение. Так что выглядело так, будто рисунок пропал.

...