DX11在不使用外部库的情况下绘制一条简单的2D线

时间:2018-10-21 18:36:33

标签: c++ directx directx-11

我正在寻找在Present调用的上下文中在两个屏幕坐标之间画线的最简单方法。在DX11方面,我还是一个初学者,但是我震惊的是,没有简单的画线方法。

要重申一下,我正在寻找一种最简单的方法来绘制一条2D线,该线可以访问IDXGISwapChain和DX功能:

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

1 个答案:

答案 0 :(得分:1)

使用Direct3D 11绘制单像素线的最简单方法是将DirectX Tool KitPrimitiveBatch类与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进行绘制,因为它是基于矢量的完整渲染器。 / p>      

如果要使用DirectX 12,请参见DirectX Tool Kit for DirectX 12