部署和加载图片以用作全息应用程序中的纹理
Deploy and load a picture to use as a texture in a holographic app
我在 Visual Studio 2015 年使用 C++/CX(或者他们称之为带有帽子和 ref new 的奇特 C++ 的任何东西)创建了一个示例全息应用程序。它构建、部署和运行良好,呈现一个旋转的彩色立方体,正如它应该的那样。现在我想添加一个 jpeg 图像并将其用作立方体上的纹理。问题是,我应该把图像放在哪里,我如何将它添加到项目中,我如何让 VS 将它与项目的其余部分一起部署,以及我如何在我的应用程序中加载它?
我对 DirectX 和 UWP 的经验几乎为零。我已经完成 this tutorial on textures on my desktop Windows 10 (a regular C++ app, not managed, not UWP), although the way they load a file into a texture in the tutorial didn't work for me. After some googling I downloaded this library,为桌面构建它 Windows 10 (DirectXTex_Desktop_2015_Win10.sln
) 并在我的项目中使用如下:
DirectX::ScratchImage image;
LoadFromWICFile(L"myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
CreateShaderResourceView(d3d11Device, image.GetImages(), image.GetImageCount(), image.GetMetadata(), &CubesTexture);
成功了。现在,对于 Hololens,我构建了他们的 DirectXTex_Windows10.sln
解决方案(假设如果另一个用于桌面,那么这个必须用于非桌面)并尝试(未成功)像这样使用它:
DirectX::ScratchImage image;
HRESULT hr = LoadFromWICFile(L"ms-appx:///myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
CreateShaderResourceView(m_deviceResources->GetD3DDevice(), image.GetImages(), image.GetImageCount(), image.GetMetadata(), &m_cubesTexture);
我也试过 ms-appdata
而不是 ms-appx
。在这两种情况下,LoadFromWICFile
都不是 return S_OK
。它给出了ERROR_INVALID_NAME: The filename, directory name or volume label syntax is incorrect.
至于myimage.jpg
,我把它放到了Assets
子文件夹中并通过Add->Existing Item
添加到解决方案中。这足以将其部署到 Hololens 吗?我如何检查它是否已部署?如果已部署,它将位于设备的哪个位置?
看来我把事情复杂化了。
要将这样的文件添加到项目中,只需使用 right click
(在解决方案资源管理器的 Assets
子文件夹中)-> Add -> Existing Item
。要将其部署到设备或模拟器上,请在文件 -> Properties
上 right click
,将 Content
设置为 Yes
并将 Item Type
设置为 Image
或 Does not participate in build
(对于无法正确识别的内容,例如 Wavefront .OBJ 文件,否则 VS 会尝试并失败 link)。
要检查文件是否(以及在哪里)将在设备或模拟器上,您可以构建一个实际的包:右键单击项目,选择 Store->Create App Packages...
它会创建一个 .appx
文件,它实际上是一个 zip 存档。您可以使用 7zip 之类的存档器对其进行探索,或者将其从 .appx
重命名为 .zip
并使用 Windows 文件资源管理器打开。在我的例子中,图像文件在 Assets
子文件夹中。我能够通过它的简单相对路径来阅读它,就像这样(没有 ms-appx:///
或其他这样的前缀):
HRESULT hr = LoadFromWICFile(L"Assets/myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
对于其他一些功能(std::fopen
、std::ifstream
等)这个相对路径不起作用,我不得不使用完整路径如下:
Platform::String^ appInstallFolder = Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
std::wstring folderNameW(appInstallFolder->Begin());
std::string folderNameA(folderNameW.begin(), folderNameW.end());
std::string fname = folderNameA + std::string("/Assets/model.obj");
std::FILE *f = std::fopen(fname.c_str(), "r");
这个带纹理的立方体项目可能会让您有所了解。我认为是基于 C# VS2015 全息模板。
我在 Visual Studio 2015 年使用 C++/CX(或者他们称之为带有帽子和 ref new 的奇特 C++ 的任何东西)创建了一个示例全息应用程序。它构建、部署和运行良好,呈现一个旋转的彩色立方体,正如它应该的那样。现在我想添加一个 jpeg 图像并将其用作立方体上的纹理。问题是,我应该把图像放在哪里,我如何将它添加到项目中,我如何让 VS 将它与项目的其余部分一起部署,以及我如何在我的应用程序中加载它?
我对 DirectX 和 UWP 的经验几乎为零。我已经完成 this tutorial on textures on my desktop Windows 10 (a regular C++ app, not managed, not UWP), although the way they load a file into a texture in the tutorial didn't work for me. After some googling I downloaded this library,为桌面构建它 Windows 10 (DirectXTex_Desktop_2015_Win10.sln
) 并在我的项目中使用如下:
DirectX::ScratchImage image;
LoadFromWICFile(L"myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
CreateShaderResourceView(d3d11Device, image.GetImages(), image.GetImageCount(), image.GetMetadata(), &CubesTexture);
成功了。现在,对于 Hololens,我构建了他们的 DirectXTex_Windows10.sln
解决方案(假设如果另一个用于桌面,那么这个必须用于非桌面)并尝试(未成功)像这样使用它:
DirectX::ScratchImage image;
HRESULT hr = LoadFromWICFile(L"ms-appx:///myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
CreateShaderResourceView(m_deviceResources->GetD3DDevice(), image.GetImages(), image.GetImageCount(), image.GetMetadata(), &m_cubesTexture);
我也试过 ms-appdata
而不是 ms-appx
。在这两种情况下,LoadFromWICFile
都不是 return S_OK
。它给出了ERROR_INVALID_NAME: The filename, directory name or volume label syntax is incorrect.
至于myimage.jpg
,我把它放到了Assets
子文件夹中并通过Add->Existing Item
添加到解决方案中。这足以将其部署到 Hololens 吗?我如何检查它是否已部署?如果已部署,它将位于设备的哪个位置?
看来我把事情复杂化了。
要将这样的文件添加到项目中,只需使用 right click
(在解决方案资源管理器的 Assets
子文件夹中)-> Add -> Existing Item
。要将其部署到设备或模拟器上,请在文件 -> Properties
上 right click
,将 Content
设置为 Yes
并将 Item Type
设置为 Image
或 Does not participate in build
(对于无法正确识别的内容,例如 Wavefront .OBJ 文件,否则 VS 会尝试并失败 link)。
要检查文件是否(以及在哪里)将在设备或模拟器上,您可以构建一个实际的包:右键单击项目,选择 Store->Create App Packages...
它会创建一个 .appx
文件,它实际上是一个 zip 存档。您可以使用 7zip 之类的存档器对其进行探索,或者将其从 .appx
重命名为 .zip
并使用 Windows 文件资源管理器打开。在我的例子中,图像文件在 Assets
子文件夹中。我能够通过它的简单相对路径来阅读它,就像这样(没有 ms-appx:///
或其他这样的前缀):
HRESULT hr = LoadFromWICFile(L"Assets/myimage.jpg", DirectX::WIC_FLAGS_NONE, nullptr, image);
对于其他一些功能(std::fopen
、std::ifstream
等)这个相对路径不起作用,我不得不使用完整路径如下:
Platform::String^ appInstallFolder = Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
std::wstring folderNameW(appInstallFolder->Begin());
std::string folderNameA(folderNameW.begin(), folderNameW.end());
std::string fname = folderNameA + std::string("/Assets/model.obj");
std::FILE *f = std::fopen(fname.c_str(), "r");
这个带纹理的立方体项目可能会让您有所了解。我认为是基于 C# VS2015 全息模板。