获取着色器字节代码以传递给CreateVertexShader()

时间:2013-01-01 09:38:58

标签: c++ directx directx-11

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

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吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

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

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