如何使用 Direct X11 XAML UWP、C++ 将纹理映射到默认立方体?

How to map a texture to the default cube utilising the Direct X11 XAML UWP, C++?

我是 C++/DX11 的新手 - 虽然我一直在研究这个主题以使自己跟上速度。 无论如何,我的问题是默认的 DX11 XAML UWP 模板(我使用的是 VS 2017)- 我在将纹理应用到网格上时遇到问题。但是,我已经进行了一些挖掘,并在官方 MS 文档中找到了非常有用的资源 我不太确定如何在 Sample3DSceneRenderer.cpp.

中实现我的纹理加载代码
    // After the vertex shader file is loaded, create the shader and input layout.
auto createVSTask = loadVSTask.then([this](const std::vector<byte>& fileData) {
    DX::ThrowIfFailed(
        m_deviceResources->GetD3DDevice()->CreateVertexShader(
            &fileData[0],
            fileData.size(),
            nullptr,
            &m_vertexShader
            )
        );

    static const D3D11_INPUT_ELEMENT_DESC vertexDesc [] =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "COLOR", 0, DXGI_FORMAT_AYUV, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };

    DX::ThrowIfFailed(
        m_deviceResources->GetD3DDevice()->CreateInputLayout(
            vertexDesc,
            ARRAYSIZE(vertexDesc),
            &fileData[0],
            fileData.size(),
            &m_inputLayout
            )
        );
});

我发现通过从特定枚举列表中选择某些值(此处的值设置为“DXGI_FORMAT_AYUV”)我可以改变立方体的颜色,但我通常知道 UV 的过程这种事情需要映射,但我不确定我是否必须定义过程,或者它是否已经在着色器代码中得到处理。 (如有任何错误信息,我深表歉意,我仍在学习 DX11)

这是我从中获取逻辑的文档: https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-textures-how-to

我专门尝试从文件创建 WIC 纹理。

希望任何熟悉默认 DX11 UWP 模板的人都能看到我的出发点,欢迎大家投稿!谢谢

如果您在 ThrowIfFailed 中的 throw 上设置断点,您会看到 CreateInputLayout 的 HRESULT 是 E_INVALIDARGDirect3D Debug Layer 会告诉您 DXGI_FORMAT_AYUV 不是顶点颜色支持的格式:

D3D11 ERROR: ID3D11Device::CreateInputLayout: Element[1]'s format (AYUV)
cannot be used with the Input Assembler.
[ STATE_CREATION ERROR #153: CREATEINPUTLAYOUT_INCOMPATIBLEFORMAT]

DXGI_FORMAT_AYUV 是一种 DirectX 视频格式,具有 special rules for how they are used and you need to keep in mind the Direct3D Hardware Feature level.

IOW:在掌握基本的 DirectX 11 之前,不要弄乱视频格式。

关于使用 WIC 创建纹理,请参阅 WICTextureLoader 模块。

You should look at DirectX Tool Kit for DirectX11 which supports UWP for both the DirectX and DirectX+XAML appmodels.