1

我一直在使用 D3DX11CompileFromFile 函数从 blob 指针编译和创建 ID3D11VertexShader * 和 ID3D11PixelShader * ,如下所示:

ID3D10Blob * vertexShaderBuffer;
ID3D10Blob * errorMessage;

if(FAILED(D3DX11CompileFromFile(vsFilename.c_str(), NULL, NULL, "LightVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL)))
    return false;

if(FAILED(device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader)))
    return false;

其中 vsFilename 是一个有效的 std::string 而 m_vertexShader 是一个 ID3D11ShaderVertex *。我很好奇第四个参数是干什么用的?它在哪里使用,我什么时候使用它,它有什么作用?它是什么有关系吗?我问,因为我在代码中调用它的位置,如果它除了唯一之外没有其他目的,我不希望用户必须指定它。

4

2 回答 2

2

这是文件中顶点着色器函数的名称

例如,如果您在着色器文件中有相同的代码

...

PS_INPUT VS(VS_INPUT input)
{

    PS_INPUT output = (PS_INPUT) 0;
    ...

使用 D3DX11CompileFromFile(shaderFileName.c_str(), nullptr, nullptr, "VS", ...); 之类的函数调用 你向 DirectX 解释着色器文件中的哪个函数开始使用顶点着色器

于 2012-07-11T04:25:52.277 回答
1

你检查过 MSDN 上的文档吗?D3DX11CompileFromFile函数的参考说明了这个pFunctionName参数:

着色器执行开始的着色器入口点函数的名称。编译效果时,D3DX11CompileFromFile 会忽略 pFunctionName;我们建议您将 pFunctionName 设置为 NULL,因为如果被调用的函数不使用它,将指针参数设置为 NULL 是一种很好的编程习惯。

于 2012-07-11T04:23:45.370 回答