VS 2013 DirectX Project Vertex着色器文件缺失

VS 2013 Directx project Vertex shader file missing

本文关键字:文件 2013 DirectX Project Vertex VS      更新时间:2023-10-16

这是我对着色器的第一次体验,我正在遵循DirectX编程教程,并且我的项目中包含了.vs和.ps文件类型中的两个着色器文件。我不确定这些文件类型是否被识别为Visual Studios中HLSL的文件类型。有没有办法可以识别这些文件类型,如果没有,我将如何更改下面的代码以包括不同的Filetype?我的代码编译,它只是返回我的错误消息,说color.vs缺少。

在我的Colorshaderclass的初始化函数下

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

初始化函数本身定义如下:

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;
}

任何帮助将不胜感激。我不确定这是否是设置问题,还是我是否需要更改Filetype,或者是否需要包含标题(但是尝试了此选项,VS尝试使用C 语法来调试HLSL文件)。

您的着色器中有任何#include语句吗?如MSDN上的文档中指出的那样,如果您提供了" null"的pinclude处理程序,则任何#include语句都会失败。

另外,您不必在此处使用Legacy DirectX SDK的不弃用D3DX11库,特别是因为您拥有VS 2013 Toolset。您可以直接使用D3DCompileFromFile,并应将D3D_COMPILE_STANDARD_FILE_INCLUDE用于Pinclude处理程序。参见HLSL FXC和D3DCompile以及没有D3DX的生活。

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

您可能需要查看本教程,以了解有关创建和使用自己的着色器的一些提示,尤其是如果您想使用Visual Studio在编译时间内将它们构建为.cso,这避免了在运行时根本使用D3DCompileFromFile

正如查克(Chuck)所提到的,您正在使用不弃用的API,并且您还需要确保将着色器文件汇编为.cso,因为这是由此可以通过的你的申请。VS 2013在编译.CPP文件时将.HLSL文件自动编译为.cso,因此这不是问题。只需假设编写LoadShaderFile函数时,.cso文件就在那里。从该出色的教程中提取的示例,在"使用着色器"部分下:

#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);