DX11 Нарисуйте простую 2D-линию без использования посторонних библиотек - PullRequest
0 голосов
/ 21 октября 2018

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

Чтобы повторить, я ищу самый простой способнарисовать линию 2D с доступом к IDXGISwapChain и доступом к функциям DX:

HRESULT __stdcall D3D11Present(IDXGISwapChain* This, UINT SyncInterval, UINT Flags) {
   // do anything here
}

1 Ответ

0 голосов
/ 22 октября 2018

Самый простой способ нарисовать однопиксельную линию с Direct3D 11 - это использовать DirectX Tool Kit и класс PrimitiveBatch в сочетании с BasicEffect:

std::unique_ptr<DirectX::CommonStates> m_states;
std::unique_ptr<DirectX::BasicEffect> m_effect;
std::unique_ptr<DirectX::PrimitiveBatch<DirectX::VertexPositionColor>> m_batch;
Microsoft::WRL::ComPtr<ID3D11InputLayout> m_inputLayout;

m_states = std::make_unique<CommonStates>(m_d3dDevice.Get());

m_effect = std::make_unique<BasicEffect>(m_d3dDevice.Get());
m_effect->SetVertexColorEnabled(true);

void const* shaderByteCode;
size_t byteCodeLength;

m_effect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength);

DX::ThrowIfFailed(
    m_d3dDevice->CreateInputLayout(VertexPositionColor::InputElements,
        VertexPositionColor::InputElementCount,
        shaderByteCode, byteCodeLength,
        m_inputLayout.ReleaseAndGetAddressOf()));

m_batch = std::make_unique<PrimitiveBatch<VertexPositionColor>>(m_d3dContext.Get());

m_d3dContext->OMSetBlendState( m_states->Opaque(), nullptr, 0xFFFFFFFF );
m_d3dContext->OMSetDepthStencilState( m_states->DepthNone(), 0 );
m_d3dContext->RSSetState( m_states->CullNone() );

m_effect->Apply(m_d3dContext.Get());

m_d3dContext->IASetInputLayout(m_inputLayout.Get());

m_batch->Begin();

VertexPositionColor v1(Vector3(-1.f, -1.0f, 0.5f), Colors::Yellow);
VertexPositionColor v2(Vector3(1.0f, 1.0f, 0.5f), Colors::Yellow);

m_batch->DrawLine(v1, v2);

m_batch->End();

Direct3D может изначально рисовать однопиксельные «текстурированные линии», но обычно, если вам нужно что-то необычное, например, широкие линии и т. Д.используйте Direct2D для рисования, поскольку это полнофункциональный векторный рендерер.

Если вы хотите использовать DirectX 12, см. Набор инструментов DirectX для DirectX 12

...