c++ - 如何将着色器嵌入到 UWP-DLL 库中?
问题描述
我正在用 C# 编写一个 Windows-UWP 应用程序,我想在其中包含一个 3D 控件。出于这个原因,我将基于 Visual Studio DirectX UWP 示例的程序移植到 UWP DLL。但是,当尝试加载包含的着色器时,程序会失败,因为它找不到已编译的着色器文件。
到目前为止,我看到的论坛帖子似乎表明在 AppX 容器内无法访问着色器等资源,并且主项目应该包含它们。因此,我尝试使用“始终复制”和“附加文件”或“嵌入资源”设置分别将编译后的着色器复制到主项目,但这也不起作用。
我尝试加载着色器的代码如下所示:
void Scene3DRenderer::CreateDeviceDependentResources()
{
// Load shader asynchronously
auto loadVSTask = DX::ReadDataAsync(L"SampleVertexShader.cso");
auto createVSTask = loadVSTask.then([this](const std::vector<byte>& fileData) {
// Creating the vertex shader on the graphics device
});
// some other stuff
}
虽然这在独立应用程序中有效,但在用作 C# 项目的库时,等待loadVSTask
完成总是会引发Platform::COMException ^
系统找不到指定文件的说明。
在这种情况下如何正确加载着色器?
解决方案
您应该使着色器编译器输出头文件而不是 .cso 文件。您可以在 VS 中的单个着色器属性中执行此操作:
然后,您可以只包含该着色器(在本例中为 SampleVertexShader.h),并将这些字节直接传递给 ID3D11Device::CreateVertexShader:
#include "SampleVertexShader.h"
Microsoft::WRL::ComPtr<ID3D11VertexShader> vertexShader;
auto hr = d3dDevice->CreateVertexShader(g_SampleVertexShader, sizeof(g_SampleVertexShader), nullptr, &vertexShader);
if (FAILED(hr))
{
// handle error
}
推荐阅读
- python - 如何在 Python 中收听 hookbin webhook?
- python - 使用 Python 中的 Numpy 库获取两个数组 A 和 B 的公共元素的索引
- asp.net - 如何在asp.net中修改具有外键的数据库?
- python - 得到??在将 Netezza 与 Python 连接时作为 unicode 字符的输出
- c++ - 在 C++ 中将浮点数转换为 int 的最快方法
- kubernetes - 如何访问 keycloak.local 入口主机?
- python - 如何更改当前视图的权限,覆盖 django rest-framework 中的 DEFAULT_PERMISSION_CLASSES
- templates - 在 smarty version3 中,我在文件夹结构中看到我们有 2 个插件目录,应该用于创建自定义插件功能?
- cluster-computing - rsh 无法访问集群节点
- android - 在应用程序中下载后如何安装apk,或弹出请求安装?