Что такое D3D12, эквивалентный D3D11 CreateTexture2D?

Я новичок в программировании Direct3D, и я создаю простое приложение для Windows, чтобы отображать 4 изображения одно за другим с помощью d3d12. Я имею базовое представление об архитектуре D3D12 и на данный момент создал четыре распределителя команд (размер буфера обратной связи = 4), список команд, очередь команд, кучу дескрипторов и ограждение. Я также загрузил свои изображения из файла с помощью WIC. Я каким-то образом знаю, что мне нужно сделать данные текстуры изображения в качестве ресурса. Хотя эта часть еще не ясна, я хотел бы уточнить, как я могу сделать текстуру из загруженного изображения в d3d12.


person ngub05    schedule 23.02.2016    source источник
comment
Если вы новичок в Direct3D, придерживайтесь Direct3D 11. См. эта тема.   -  person Chuck Walbourn    schedule 23.02.2016
comment
Я собираюсь создать продукт, для которого требуется d3d12, поэтому я придерживаюсь его.   -  person ngub05    schedule 23.02.2016
comment
Direct3D 12 — это неумолимый API, разработанный для экспертов. Если вы уже являетесь экспертом в Direct3D 11, вы готовы к работе. Если нет, придерживайтесь Direct3D 11.   -  person Chuck Walbourn    schedule 23.02.2016


Ответы (1)


Основы загрузки текстур Direct3D 12 демонстрируются в примере D3D12HelloTexture на DirectX-Graphics-Samples Репродукция GitHub.

ComPtr<ID3D12Resource> textureUploadHeap;

// Create the texture.
{
    // Describe and create a Texture2D.
    D3D12_RESOURCE_DESC textureDesc = {};
    textureDesc.MipLevels = 1;
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    textureDesc.Width = TextureWidth;
    textureDesc.Height = TextureHeight;
    textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
    textureDesc.DepthOrArraySize = 1;
    textureDesc.SampleDesc.Count = 1;
    textureDesc.SampleDesc.Quality = 0;
    textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;

    ThrowIfFailed(m_device->CreateCommittedResource(
        &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
        D3D12_HEAP_FLAG_NONE,
        &textureDesc,
        D3D12_RESOURCE_STATE_COPY_DEST,
        nullptr,
        IID_PPV_ARGS(&m_texture)));

    const UINT64 uploadBufferSize = GetRequiredIntermediateSize(m_texture.Get(), 0, 1);

    // Create the GPU upload buffer.
    ThrowIfFailed(m_device->CreateCommittedResource(
        &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
        D3D12_HEAP_FLAG_NONE,
        &CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize),
        D3D12_RESOURCE_STATE_GENERIC_READ,
        nullptr,
        IID_PPV_ARGS(&textureUploadHeap)));

    // Copy data to the intermediate upload heap and then schedule a copy 
    // from the upload heap to the Texture2D.
    std::vector<UINT8> texture = GenerateTextureData();

    D3D12_SUBRESOURCE_DATA textureData = {};
    textureData.pData = &texture[0];
    textureData.RowPitch = TextureWidth * TexturePixelSize;
    textureData.SlicePitch = textureData.RowPitch * TextureHeight;

    UpdateSubresources(m_commandList.Get(), m_texture.Get(), textureUploadHeap.Get(), 0, 0, 1, &textureData);
    m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));

    // Describe and create a SRV for the texture.
    D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
    srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
    srvDesc.Format = textureDesc.Format;
    srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = 1;
    m_device->CreateShaderResourceView(m_texture.Get(), &srvDesc, m_srvHeap->GetCPUDescriptorHandleForHeapStart());
}

Он использует вспомогательную функцию UpdateSubresources D3DX12. h C++ встроенный только заголовок утилиты.

В качестве примера сложностей использования Direct3D 12 вместо Direct3D 11 этот код работает правильно, только если вы загружаете текстуру для пиксельного шейдера. Если вы используете текстуру для вершинного шейдера или геометрического шейдера, это может привести к сбою. Или это может сработать. Или это может работать иногда, а не другие. Это также только один из способов загрузки текстур в Direct3D 12, и даже не самый эффективный.

ОБНОВЛЕНИЕ: теперь доступен набор инструментов DirectX для DirectX12. Взгляните на DDSTextureLoader и WICTextureLoader.

person Chuck Walbourn    schedule 23.02.2016
comment
Если я не ошибаюсь, я искал GenerateTextureData() и обнаружил, что функция не создает данные текстуры из растрового изображения. Код весьма полезен для понимания того, как данные текстуры можно использовать в качестве ресурса. Но в то же время мне интересно, как я могу создать текстуру из загруженного битмапа? - person ngub05; 23.02.2016
comment
Вы можете просмотреть WICTextureLoader код загрузки растровых данных с помощью WIC. - person Chuck Walbourn; 25.02.2016