获取着色器字节代码传递给CreateVertexShader()
Getting shader byte code to pass into CreateVertexShader()
我试图通过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类型)。我不确定这是否是您代码的唯一问题,但在我这边,它可以很好地使用这种类型。
相关文章:
- 没有找到相关文章