Проблема с привязкой индексных буферов в DirectX 11 - PullRequest
0 голосов
/ 23 июня 2019

Я неоднократно рендерил трехмерные объекты в DirectX, но на этот раз столкнулся со странной проблемой, с которой я потратил день на выяснение, и до сих пор ничего не имею.У меня есть DX11 Context, в котором я загружаю 3d модели из файлов obj.Мне пришлось сделать скайбокс, и я понял, что хорошей отправной точкой будет попытка визуализировать куб, а затем продолжить.Мой графический конвейер рисует много вещей, поэтому, если я намеренно не отсоединю индексный шейдер, он останется связанным.Если я пытаюсь отобразить куб с привязанным индексным буфером моего куба, это не сработает.Но если я не связываю индексный буфер, он использует ранее связанный буфер (насколько я могу разобрать) и отображает вершины странным образом, как и ожидалось.Я, должно быть, здесь что-то упускаю.Я провел часы и часы и все еще не мог решить проблему.Я был бы признателен, если бы кто-то мог помочь ...

PS: я использую эти странные индексы только для тестирования, так как я предполагал, что они вызывают проблему.

Я весьма озадачен этимповедение, я должен что-то здесь упустить.

void SkyBox::CreateShader(Vertex * verts, size_t size_of_verts, WORD* indices, size_t size_of_indices)
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Shader Compilation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ID3D10Blob* VS = nullptr;
    ID3D10Blob* PS = nullptr;
    ID3D10Blob* ErrMSG = nullptr;

    D3DX11CompileFromFile("SkyShader.shader", 0, 0, "SKYMAP_VS", "vs_4_0", 0, 0, 0, &VS, &ErrMSG, 0);
    D3DX11CompileFromFile("SkyShader.shader", 0, 0, "SKYMAP_PS", "ps_4_0", 0, 0, 0, &PS, &ErrMSG, 0);
    char* p = new char[100];

    // encapsulate both shaders into shader objects
    if (!ErrMSG && VS && PS)
    {
        pRenderer->GetDevice()->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), nullptr, &pVertexShader);
        pRenderer->GetDevice()->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), nullptr, &pPixelShader);
    }
    else
    {
        ELOG("The Shader file cannot be compiled. Please run this executable from the directory that contains the Shader file.");
        exit(1);
    }
    D3D11_INPUT_ELEMENT_DESC IED[] =
    {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
    UINT numElements = ARRAYSIZE(IED);
    pRenderer->GetDevice()->CreateInputLayout(IED, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout);

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Vertex Buffer ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    D3D11_BUFFER_DESC bd;
    ZeroMemory(&bd, sizeof(bd));
    bd.Usage = D3D11_USAGE_DYNAMIC;
    bd.ByteWidth = size_of_verts;
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

    D3D11_SUBRESOURCE_DATA InitData;
    ZeroMemory(&InitData, sizeof(InitData));
    InitData.pSysMem = verts;

    pRenderer->GetDevice()->CreateBuffer(&bd, &InitData, OUT &pVBuffer);    // creating the buffer

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Index Buffer /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ZeroMemory(&bd, sizeof(bd));
    bd.Usage = D3D11_USAGE_DEFAULT;
    bd.ByteWidth = size_of_indices;
    bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
    bd.CPUAccessFlags = 0;

    ZeroMemory(&InitData, sizeof(InitData));
    InitData.pSysMem = indices;

    pRenderer->GetDevice()->CreateBuffer(&bd, &InitData, OUT &pIBuffer);
}

SkyBox::SkyBox()
{
}

SkyBox::SkyBox(CRenderer * pRenderer)
    :
    pRenderer(pRenderer)
{
}

void SkyBox::CreateTri()
{
    Vertex verts[]
    {
        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},

        {-0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},

        {-0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},

        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},

        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, 0.0f},

        {-0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        { 0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f,  0.5f,  0.0f, 0.0f, 0.0f},
        {-0.5f,  0.5f, -0.5f,  0.0f, 0.0f, 0.0f}
    };

    WORD indices[] {
        0, 1, 2,
        3, 4, 5,
        6, 7, 8,
        9, 10, 11,
        12, 13, 14,
        15, 16, 17,
        18, 19, 20,
        21, 22, 23,
        24, 25, 26,
        27, 28, 29,
        30, 31, 32,
        33, 34, 35,
    };

    CubeMesh Cube;
    Cube.CreateMesh();

    CreateShader(verts, sizeof(Vertex) * 36, indices, sizeof(WORD) * 36);
}

void SkyBox::Render()
{
    const UINT  vStride = sizeof(Vertex);
    const UINT vOffset = 0; 
    pRenderer->GetDeviceContext()->VSSetShader(pVertexShader, 0, 0);
    pRenderer->GetDeviceContext()->PSSetShader(pPixelShader, 0, 0);
    pRenderer->GetDeviceContext()->IASetInputLayout(pLayout);
    pRenderer->GetDeviceContext()->IASetVertexBuffers(0, 1, &pVBuffer, &vStride, &vOffset);
    pRenderer->GetDeviceContext()->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R16_UINT, 0);
    pRenderer->GetDeviceContext()->DrawIndexed(36, 0, 0);
}



And here's the shader

float4 SKYMAP_VS( float4 Pos : POSITION, float4 Norm : NORMAL ) : SV_POSITION
{
    return Pos;
}
float4 SKYMAP_PS( float4 Pos : SV_POSITION ) : SV_Target
{
    return float4( 1.0f, 1.0f, 0.0f, 1.0f );
}
// I don't know how it could be simpler...

```c++

In SkyBox::Render(), if i don't set the index buffer it uses the previously bound buffer (as mentioned before) but if i bind the buffer it literally draws nothing. And yes, the the index buffer is created successfully.
...