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

时间:2019-04-07 09:22:39

标签: c++ dll uwp directx

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

到目前为止,我所看到的论坛帖子似乎表明,在AppX容器内部无法访问诸如着色器之类的资源,并且主项目应包括这些资源。因此,我尝试将设置为“始终复制”且分别为“ AdditionalFiles”或“ Embedded resource”的复制的着色器复制到主项目中,这同样行不通。

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

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#项目的库时找不到指定的文件。

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

1 个答案:

答案 0 :(得分:1)

您应该使着色器编译器输出头文件而不是.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
}