我正在尝试通过 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 吗?