2

我正在尝试通过 ID3D11Device::CreateVertexShader() 创建一个顶点着色器对象。参数要求一个指向着色器字节码的指针,以及字节码的长度。因此,我有以下结构:

struct shaderData
{
    char *shaderCode;
    UINT size;
};

以下函数返回此结构以尝试获取着色器字节码(我使用 Visual Studio 2012 和 fxc.exe 将我的着色器编译为已编译的着色器对象 (.cso) 文件。

struct shaderData *CubeApp::GetShaderByteCode(char *compiledShader)
{
    FILE *pFile = 0;
    char *shaderCode = 0;
    UINT fSize = 0;
    UINT numRead = 0;
    struct shaderData *sData = (struct shaderData *)malloc(sizeof(struct shaderData));

    pFile = fopen(compiledShader, "rb");

    fseek(pFile, 0, SEEK_END);
    fSize = ftell(pFile);
    fseek(pFile, 0, SEEK_SET);

    shaderCode = (char *)malloc(fSize);

    while (numRead != fSize)
        numRead = fread(&shaderCode[numRead], 1, fSize, pFile);

    fclose(pFile);

    sData->shaderCode = shaderCode;
    sData->size = fSize;

    return sData;
}

我这样调用函数:

struct shaderData *sData = GetShaderByteCode("VShader.cso");

但是,当我调用 ID3D11Device::CreateVertexShader(),将 sData->shaderCode 和 sData->size 作为参数传递时,我的顶点着色器对象 (ID3D11VertexShader) 返回为 NULL,并且该函数返回 E_INVALIDARG。

也许我对着色器字节码是什么有一个错误的理解,但是这个函数不应该给我正确的参数来传递给 CreateVertexShader 吗?

4

1 回答 1

0

尝试这个:

struct shaderData
{
    BYTE *shaderCode;
    UINT size;
};

着色器字节码需要是 unsigned char(这就是 BYTE 类型)。我不确定这是否是您的代码的唯一问题,但就我而言,它适用于这种类型。

于 2013-06-27T15:41:21.777 回答