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

Getting shader byte code to pass into CreateVertexShader()

本文关键字:CreateVertexShader 代码 字节 获取      更新时间:2023-10-16

我试图通过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?

试试这个:

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

着色器字节代码需要是unsigned char(这就是byte类型)。我不确定这是否是您代码的唯一问题,但在我这边,它可以很好地使用这种类型。

相关文章:
  • 没有找到相关文章