在哪里设置 Shader 文件的入口点(错误 X3501)?

Posted

技术标签:

【中文标题】在哪里设置 Shader 文件的入口点(错误 X3501)?【英文标题】:Where to set the entrypoint of Shader files (error X3501)? 【发布时间】:2015-06-30 20:42:38 【问题描述】:

我是 DirectX 的菜鸟,在 Visual Studio 中运行 [this][1] 教程。在编译时,我遇到了这个错误:“错误 X3501:'main':找不到入口点。”现在一些谷歌搜索将我带到[this answer] [2],它说输入我的着色器文件的属性,将着色器类型和入口点设置为您想要的入口点。现在提供的答案很好,我不知道我的入口点应该是什么。起初我认为它应该是我实际调用D3DX11CompileFromFile() 的位置,它位于ColorShaderClass::InitializeShader 中,但我再次遇到错误X3501。做什么?


我的文件如下

ColorVS.hlsl
ColorPS.hlsl

使用名称的方法

bool ColorShaderClass::Initialize(ID3D11Device* device, HWND hwnd)

    bool result;


    // Initialize the vertex and pixel shaders.
    result = InitializeShader(device, hwnd, L"ColorVS.hlsl", L"ColorPS.hlsl");
    if (!result)
    
        return false;
    

    return true;

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;

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

    // Compile the 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 writen something to the error message.
    if (errorMessage)
    
        OutputShaderErrorMessage(errorMessage, hwnd, vsFilename);
    
    // If there was nothing in the error message then it simply could not find the shader file itself.
    else
    
        MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK);
    

    return false;


// Compile the pixel shader code.
result = D3DX11CompileFromFile(psFilename, NULL, NULL, "ColorPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL,
    &pixelShaderBuffer, &errorMessage, NULL);
if (FAILED(result))

    // If the shader failed to compile it should have writen something to the error message.
    if (errorMessage)
    
        OutputShaderErrorMessage(errorMessage, hwnd, psFilename);
    
    // If there was  nothing in the error message then it simply could not find the file itself.
    else
    
        MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK);
    

    return false;

//more code

编辑

正如 tsandy 所回答的,入口点是实际执行着色的函数。对于遵循本教程并使用与我对着色器文件相同的方案的任何人

ColorPS.hlsl 有入口点“ColorPixelShader”

ColorVS.hlsl 有入口点“ColorVertexShader”

【问题讨论】:

【参考方案1】:

对于每个 hlsl 文件,入口点应该是 hlsl 文件中执行着色的函数的名称。 例如。在以下像素着色器 hlsl 中:

struct PixelInputType

    float4 position : SV_POSITION;
    float4 color : COLOR;
;

float4 ColorPixelShader(PixelInputType input) : SV_TARGET

    return input.color;

您将使用 ColorPixelShader 作为入口点。

【讨论】:

效果很好!谢谢!有关详细信息,请查看我的问题中的编辑 如果你同时拥有顶点和像素着色器怎么办?

以上是关于在哪里设置 Shader 文件的入口点(错误 X3501)?的主要内容,如果未能解决你的问题,请参考以下文章

nextjs 应用程序的入口点在哪里?

Coreldraw X3出现的corel A.R.M怎么解决?

vs2005无法定位程序输入点怎么解决?

错误:链接:致命错误 LNK1561:入口点必须定义 C++

致命错误 LNK1561:必须定义入口点

Python程序加密打包