directx - DX11 三角形列表根本不渲染

标签 directx directx-11 direct3d direct3d11

我将 4 个顶点的列表加载到顶点缓冲区中,并将索引加载到索引缓冲区中。

我遇到的问题是,虽然 LineList 渲染模式显示了一个四边形(见下文),但 TriangleList 什么也没显示(见下文)

void BLX::Model::load(std::filesystem::path path, Model* model, ID3D11Device* d3dDevice, ID3D11DeviceContext* d3dContext)
{
    // tmp: just making a quad
    float num = 0.5f;
    std::vector<BLX::Vertex> vertices = {
        BLX::Vertex { DirectX::XMFLOAT3(-num, -num, 0.0f), DirectX::XMFLOAT3(0.0f, 0.0f, 0.5f), },  // 0 = TL
        BLX::Vertex { DirectX::XMFLOAT3(num, -num, 0.0f), DirectX::XMFLOAT3(0.0f, 0.5f, 0.0f), },   // 1 = TR
        BLX::Vertex { DirectX::XMFLOAT3(num, num, 0.0f), DirectX::XMFLOAT3(0.5f, 0.0f, 0.0f), }, // 2 = BR
        BLX::Vertex { DirectX::XMFLOAT3(-num, num, 0.0f), DirectX::XMFLOAT3(0.5f, 0.5f, 0.0f), },  // 3 = BL
    };

    // line list
    //std::vector<unsigned int> indices = { 0, 1, 1, 2, 2, 3, 3, 0 };

    // triangle list
    std::vector<unsigned int> indices = { 0, 1, 3, 3, 1, 2 };

    model->vertexCount = vertices.size();
    model->indexCount = indices.size();

    // Vertex Buffer

    D3D11_BUFFER_DESC vbd = {};
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.Usage = D3D11_USAGE_DEFAULT;
    vbd.CPUAccessFlags = 0u;
    vbd.MiscFlags = 0u;
    vbd.ByteWidth = sizeof(BLX::Vertex) * model->vertexCount;

    vbd.StructureByteStride = sizeof(BLX::Vertex);

    D3D11_SUBRESOURCE_DATA vsd = {};
    vsd.pSysMem = &vertices[0];
    vsd.SysMemPitch = 0;
    vsd.SysMemSlicePitch = 0;

    d3dDevice->CreateBuffer(&vbd, &vsd, &model->vertexBuffer);

    /// Index Buffer
    
    D3D11_BUFFER_DESC ibd = {};
    ibd.Usage = D3D11_USAGE_DEFAULT;
    ibd.ByteWidth = sizeof(unsigned int) * model->indexCount;
    ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
    ibd.CPUAccessFlags = 0;
    ibd.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA isd = {};
    isd.pSysMem = &indices[0];
    isd.SysMemPitch = 0;
    isd.SysMemSlicePitch = 0;

    d3dDevice->CreateBuffer(&ibd, &isd, &model->indexBuffer);


    // IA = Input Assembly

    // pixel shader
    D3DReadFileToBlob(L"PixelShader2.cso", &model->pBlob);
    d3dDevice->CreatePixelShader(model->pBlob->GetBufferPointer(), model->pBlob->GetBufferSize(), nullptr, &model->pPixelShader);

    // Vertex Shader
    D3DReadFileToBlob(L"VertexShader2.cso", &model->pBlob);
    d3dDevice->CreateVertexShader(model->pBlob->GetBufferPointer(), model->pBlob->GetBufferSize(), nullptr, &model->pVertexShader);

    const D3D11_INPUT_ELEMENT_DESC ied[] =
    {
        // "Position" correcponds to Vertex Shader Semantic Name
                    // semantic index
                        // data type format
                                                  // Input slot
                                                     // Aligned byte offset
                                                        // Input slot class
                                                                                     // Instance data step rate
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        { "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
    // needs vertex shader blob
    d3dDevice->CreateInputLayout(ied, ARRAYSIZE(ied), model->pBlob->GetBufferPointer(), model->pBlob->GetBufferSize(), &model->pInputLayout);
}

void BLX::Model::render(ID3D11Device* d3dDevice, ID3D11DeviceContext* d3dContext, D3D11_VIEWPORT * vp)
{
    const UINT stride = sizeof(Vertex);
    const UINT offset[] = { 0u, 0u };

    d3dContext->IASetVertexBuffers(0u, 1u, vertexBuffer.GetAddressOf(), &stride, &offset[0]);
    d3dContext->IASetIndexBuffer(*indexBuffer.GetAddressOf(), DXGI_FORMAT_R32_UINT, offset[1]);

    d3dContext->PSSetShader(pPixelShader.Get(), nullptr, 0u);
    d3dContext->VSSetShader(pVertexShader.Get(), nullptr, 0u);

    d3dContext->IASetInputLayout(pInputLayout.Get());

    d3dContext->RSSetViewports(1u, vp);

    //d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY::D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
    d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY::D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    d3dContext->DrawIndexed(indexCount, 0, 0);
}

当使用 LineList 索引和拓扑时: enter image description here

当使用 TriangleList 索引和拓扑时: enter image description here

但是当我这样做的时候:

    // tmp: just making a quad
    float num = 0.5f;
    std::vector<BLX::Vertex> vertices = {
        BLX::Vertex { DirectX::XMFLOAT3(0.0f, num, 0.0f), DirectX::XMFLOAT3(0.0f, 0.0f, 0.5f), },
        BLX::Vertex { DirectX::XMFLOAT3(num, -num, 0.0f), DirectX::XMFLOAT3(0.0f, 0.5f, 0.0f), },
        BLX::Vertex { DirectX::XMFLOAT3(-num, -num, 0.0f), DirectX::XMFLOAT3(0.5f, 0.0f, 0.0f), },
    };

    // triangle list
    std::vector<unsigned int> indices = { 0, 1, 2 };

(其他一切完全相同)我得到了这个: enter image description here

只是很好奇在尝试渲染两个三角形以组成四边形时我没有看到或得到什么

最佳答案

您的矩形具有按顺时针方式组织的索引,这些索引由默认光栅化器剔除(因为您没有指定一个它剔除顺时针图元)

你的三角形顶点顺序是逆时针的,所以图元没有被剔除。

解决它,两种方案:

  • 更改索引顺序:

      std::vector<unsigned int> indices = { 0, 3, 1, 3, 2, 1 };
    
  • 在光栅器状态下禁用剔除:

首先创建一个Rasterizer Description

D3D11_RASTERIZER_DESC raster_desc;
raster_desc.FillMode = D3D11_FILL_SOLID;
raster_desc.CullMode= D3D11_CULL_NONE;
raster_desc.FrontCounterClockwise = false;
raster_desc.DepthBias = 0;
raster_desc.DepthBiasClamp= 0.0f;
raster_desc.SlopeScaledDepthBias= 0.0f;
raster_desc.DepthClipEnable= true;
raster_desc.ScissorEnable= false;
raster_desc.MultisampleEnable= false;
raster_desc.AntialiasedLineEnable= false;

然后使用您的设备创建光栅器状态:

   ID3D11RasterizerState* raster_state;
   HRESULT hr =d3dDevice->CreateRasterizerState(&raster_desc, &raster_state);

在绘制之前,将您的光栅器状态分配给您的上下文:

   d3dContext->RSSetState(raster_state);

关于directx - DX11 三角形列表根本不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64380866/

相关文章:

c++ - 图形分析

c++ - 将自定义矩阵转换为 float *

c++ - 启动时未应用构造函数值

c++ - 是否可以在 directx dc/buffer 上使用 opengl 进行绘制?

graphics - 实现法线贴图 HLSL

winapi - 在没有 vsync 的情况下与监视器刷新同步

opengl - 延迟着色抗锯齿

c# - 在 C# 中,显示可缩放和平移视频的好方法是什么?

c++ - 错误 :Unresolved external Symbol of d2d1effects. h DIRECTX 中的 CLSID_D2D1HueRotation 属性

c++ - 绘制多个对象