c++ - 如何将着色器嵌入到 UWP-DLL 库中?

标签 c++ dll uwp directx

我正在用 C# 编写一个 Windows-UWP 应用程序,我想在其中包含一个 3D 控件。出于这个原因,我将基于 Visual Studio DirectX UWP 示例的程序移植到 UWP DLL。但是,当尝试加载包含的着色器时,程序会失败,因为它找不到已编译的着色器文件。

到目前为止,我看到的论坛帖子似乎表明,在 AppX 容器内无法访问像着色器这样的资源,主项目应该包括它们。因此,我尝试分别使用设置“始终复制”和“AdditionalFiles”或“嵌入式资源”将已编译的着色器复制到主项目,但这也不起作用。

我尝试加载着色器的代码如下所示:

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
}

虽然这在独立应用程序中有效,但等待 loadVSTask 完成总是抛出一个 Platform::COMException ^ 说明系统在用作时找不到指定的文件C# 项目的库。

如何在这种情况下正确加载着色器?

最佳答案

您应该使着色器编译器输出头文件而不是 .cso 文件。您可以在 VS 中的各个着色器属性中执行此操作:

enter image description here

然后,您可以只包含该着色器(在本例中为 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
}

关于c++ - 如何将着色器嵌入到 UWP-DLL 库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55557422/

相关文章:

c++ - 包括文件问题

c - C语言dll调试

.net - 如何将程序集添加到Visual Studio项目并引用它?

c# - .NET EXE 和 DLL 之间的堆栈/堆差异

c# - Windows 10 UWP 获取内容对话框以在移动设备上垂直居中屏幕

c++ - OpenGL Shader 在 AMD 机器上不能正常工作

c++ - C++ 中的 BST 搜索键

c++ - 流插入重载 C++

c# - 使用 ScrollViewer 从中心原点缩放图像在 UWP 中不起作用

c# - 后退按钮横行