如何使用 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_INVALIDARG
。 Direct3D 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.
我是 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_INVALIDARG
。 Direct3D 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.