我试图通过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吗?
答案 0 :(得分:0)
试试这个:
struct shaderData
{
BYTE *shaderCode;
UINT size;
};
着色器字节代码需要是unsigned char(这是BYTE类型)。我不确定它是否是您的代码唯一的问题,但在我这方面它适用于这种类型。