【问题标题】:VS 2013 Directx project Vertex shader file missingVS 2013 Directx 项目顶点着色器文件丢失
【发布时间】:2015-05-13 01:12:21
【问题描述】:

这是我第一次使用着色器,我正在学习directx 编程教程,我的项目中包含两个着色器文件,文件类型分别为 .vs 和 .ps。我不确定这些文件类型是否被识别为视觉工作室中 hlsl 的文件类型,最后有 .hlsl。有没有办法让这些文件类型得到识别,如果没有,我将如何更改下面的代码以包含不同的文件类型?我的代码编译了,它只是返回我的错误消息说 color.vs missing。

在我的 colorshaderclass.cpp 的初始化函数下,返回函数调用如下:

result = InitializeShader(device, hwnd, L"../Engine/color.hlsl", L"../Engine/color.ps");

initializeShader函数本身定义如下:

bool ColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename)
{
HRESULT result;
ID3D10Blob* errorMessage;
ID3D10Blob* vertexShaderBuffer;
ID3D10Blob* pixelShaderBuffer;
D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
unsigned int numElements;
D3D11_BUFFER_DESC matrixBufferDesc;

//initializ the pointers this function will use to null
errorMessage = 0;
vertexShaderBuffer = 0;
pixelShaderBuffer = 0;

//compile vertex shader code
result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL,
    &vertexShaderBuffer, &errorMessage, NULL);

if (FAILED(result))
{
    //if the shader failed to compile it should have written something to error message
    if (errorMessage)
    {
        OutputShaderErrorMessage(errorMessage, hwnd, vsFilename);
    }
    //if there was nothing in error message then it couldnt find shader file
    else
    {
        MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK);
    }

    return false;
}

//compile pixel shader code
if (FAILED(result))
{
    if (errorMessage)
    {
        OutputShaderErrorMessage(errorMessage, hwnd, psFilename);
    }

    else
    {
        MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK);
    }

    return false;
}

任何帮助将不胜感激。我不确定这是否是设置问题,或者我是否需要更改文件类型或是否需要包含标头(尽管尝试了此选项,VS 尝试使用 c++ 语法调试 hlsl 文件)。

【问题讨论】:

  • 你作为result得到的具体价值是什么?

标签: c++ visual-studio-2013 directx-11 hlsl vertex-shader


【解决方案1】:

您的着色器中有任何#include 语句吗?正如MSDN 上的文档中所述,如果您提供“NULL”的 pInclude 处理程序,那么任何#include 语句都将失败。

此外,您无需在此处使用旧版 DirectX SDK 中已弃用的 D3DX11 库,尤其是因为您拥有 VS 2013 工具集。您可以直接使用D3DCompileFromFile,并且应该将D3D_COMPILE_STANDARD_FILE_INCLUDE 用于pInclude 处理程序。请参阅 HLSL FXC and D3DCompileLiving without D3DX

result = D3DCompileFromFile(vsFilename, nullptr,
    D3D_COMPILE_STANDARD_FILE_INCLUDE , "ColorVertexShader", "vs_5_0",
    D3DCOMPILE_ENABLE_STRICTNESS, 0, &vertexShaderBuffer, &errorMessage );

您可能需要查看this tutorial 以获取有关创建和使用您自己的着色器的一些提示,特别是如果您想使用 Visual Studio 在编译时将它们构建到 .cso 中,从而完全避免使用 D3DCompileFromFile在运行时。

【讨论】:

  • 我没有任何包含语句。更改 pInclude 处理程序似乎已经让 VS 找到该文件,但是它正在做与之前调试文件一样的事情,就好像它是 c++ 代码一样。正如我之前所问的,这是因为它们应该是不同于 .vs 和 .ps 的文件类型吗?将这些更改为 .cso 是否会被识别为 hlsl?
  • 如果你直接用函数编译文件扩展名是无关紧要的。文件扩展名 .hlsl.fx 可被 Visual Studio 2012+ 识别并使用 FXC.EXE 构建,但这是构建时而非运行时。 .cso 是预编译的着色器,您可以直接将这些数据与 Create*Shader 函数一起使用。
【解决方案2】:

正如 Chuck 所提到的,您正在使用已弃用的 API,并且您还需要确保将着色器文件编译为 .cso,因为这是您的应用程序要读取的内容。当您编译 .cpp 文件时,VS 2013 会自动将 .hlsl 文件编译成 .cso,因此这应该不是问题。假设在您编写 LoadShaderFile 函数时存在 .cso 文件。从this excellent tutorial 中提取的示例,在“使用着色器”部分下:

#include <fstream>

// this function loads a file into an Array^
Array<byte>^ LoadShaderFile(std::string File)
{
    Array<byte>^ FileData = nullptr;

    // open the file
    std::ifstream VertexFile(File, std::ios::in | std::ios::binary | std::ios::ate);

    // if open was successful
    if(VertexFile.is_open())
    {
        // find the length of the file
        int Length = (int)VertexFile.tellg();

        // collect the file data
        FileData = ref new Array<byte>(Length);
        VertexFile.seekg(0, std::ios::beg);
        VertexFile.read(reinterpret_cast<char*>(FileData->Data), Length);
        VertexFile.close();
    }

    return FileData;
}

//... And this is the call and use.
Array<byte>^ VSFile = LoadShaderFile("VertexShader.cso");
device->CreateVertexShader(VSFile->Data, VSFile->Length, nullptr, &vertexshader);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多