1

我在 Visual Studio 2015 中使用 C++/CX(或任何他们称之为带有帽子和 ref new 的花哨 C++ 的东西)创建了一个示例全息应用程序。它构建、部署和运行良好,渲染一个旋转的彩色立方体,就像它应该做的那样。现在我正在尝试添加一个 jpeg 图像并将其用作立方体上的纹理。问题是,我应该将图像放在哪里,如何将其添加到项目中,如何使 VS 将其与项目的其余部分一起部署,以及如何将其加载到我的应用程序中?

我对 DirectX 和 UWP 的体验几乎为零。我已经在我的桌面 Windows 10(一个常规的 C++ 应用程序,不是托管的,不是 UWP)上完成了这个关于纹理的教程,尽管他们在教程中将文件加载到纹理中的方式对我不起作用。经过一番谷歌搜索后,我下载了这个库,为桌面 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都不返回S_OKERROR_INVALID_NAME: The filename, directory name or volume label syntax is incorrect.至于它myimage.jpg,我把它放到Assets子文件夹中,并通过添加到解决方案中Add->Existing Item。这足以让它部署到 Hololens 吗?如何检查它是否已部署?如果部署,它将位于设备上的哪个位置?

4

2 回答 2

2

看来我把事情复杂化了。

要将这样的文件添加到项目中,只需使用right click(在Assets解决方案资源管理器中的子文件夹上) -> Add -> Existing Item。要将其部署在设备或模拟器上,right click请在 file-> Properties上设置ContentYesItem Typeto Imageor Does not participate in build(对于无法正确识别的内容,例如 Wavefront .OBJ 文件,否则 VS 会尝试链接但无法链接)。

要检查文件是否(以及在哪里)将在设备或模拟器上,您可以构建一个实际的包:右键单击项目,选择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::fopenstd::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");
于 2016-10-03T03:26:54.157 回答
1

这个带纹理的立方体项目可能会给您一些见解。我认为是基于 C# VS2015 Holographic 模板。

https://github.com/dngoins/HololensDXTutorials

于 2016-10-14T10:58:58.147 回答