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");
しかし、sData->shaderCode と sData->size をパラメーターとして渡して ID3D11Device::CreateVertexShader() を呼び出すと、頂点シェーダー オブジェクト (ID3D11VertexShader) が NULL として返され、関数は E_INVALIDARG を返します。
シェーダー バイトコードの理解が間違っているのかもしれませんが、この関数は CreateVertexShader に渡す正しいパラメーターを与えるべきではないでしょうか?