0

D3D12 で三角形をレンダリングしたいのですが、うまくいきません。Microsoft の Direct 3D Programming Guide に従いました。

レンダー ターゲット ビューをクリアすると、出力で COMMAND_LIST_DRAW_VERTEX_BUFFER_TOO_SMALL 警告 (DrawInstanced: Vertex Buffer at the input vertex slot 0 is not big for what the Draw*() call is expected to traverse...) になります。だから私の考えでは、問題は頂点にあり、頂点に対処しています。

これが私のコードです:

struct Vertex {
    float x;
    float y;
};

const Vertex vertices[] = {
    { 0.0f, 0.5f },
    { 0.5f, -0.5f },
    { -0.5f, -0.5f }
};

const UINT vertexBufferSize = sizeof(vertices);

// Create and load the vertex buffers
// I'm using an upload heap, because I can't find any solution about a default heap.
CD3DX12_HEAP_PROPERTIES vertexBufferHeapProperties(D3D12_HEAP_TYPE_UPLOAD/*D3D12_HEAP_TYPE_DEFAULT*/);
auto vertexBufferResourceDesc = CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize);

THROW_IF_FAILED(m_pDevice->CreateCommittedResource(
    &vertexBufferHeapProperties,
    D3D12_HEAP_FLAG_NONE,
    &vertexBufferResourceDesc,
    D3D12_RESOURCE_STATE_GENERIC_READ/*D3D12_RESOURCE_STATE_COPY_SOURCE*/,
    nullptr,
    IID_PPV_ARGS(&m_pVertexBuffer)
));

// Copy the vertex data to the vertex buffer
UINT8* pVertexDataBegin;
CD3DX12_RANGE readRange(0, 0);
THROW_IF_FAILED(m_pVertexBuffer->Map(0, &readRange, reinterpret_cast<void**>(&pVertexDataBegin)));
memcpy(pVertexDataBegin, vertices, sizeof(vertices));
m_pVertexBuffer->Unmap(0, nullptr);

// Create the vertex buffer views
m_vertexBufferView.BufferLocation = m_pVertexBuffer->GetGPUVirtualAddress();
m_vertexBufferView.SizeInBytes = sizeof(Vertex);
m_vertexBufferView.StrideInBytes = vertexBufferSize;

入力レイアウトでは、位置に DXGI_FORMAT_R32G32_FLOAT と D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA を使用しています。

そして、PopulateCommandList 関数では:

const float clearColor[] = { 0.6f, 0.7f, 0.9f, 1.0f };
m_pCommandList->ClearRenderTargetView(renderTargetViewHandle, clearColor, 0, 0);
m_pCommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_pCommandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
m_pCommandList->DrawInstanced(3, 1, 0, 0);
4

1 に答える 1

1

そのはず

m_vertexBufferView.BufferLocation = m_pVertexBuffer->GetGPUVirtualAddress();
m_vertexBufferView.SizeInBytes = vertexBufferSize;
m_vertexBufferView.StrideInBytes = sizeof(Vertex);

それ以外の

m_vertexBufferView.BufferLocation = m_pVertexBuffer->GetGPUVirtualAddress();
m_vertexBufferView.SizeInBytes = sizeof(Vertex);
m_vertexBufferView.StrideInBytes = vertexBufferSize;
于 2021-08-30T07:26:54.817 に答える