2

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 に渡す正しいパラメーターを与えるべきではないでしょうか?

4

1 に答える 1

0

これを試して:

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

シェーダーのバイト コードは unsigned char である必要があります (これが BYTE 型です)。それがあなたのコードの唯一の問題かどうかはわかりませんが、私の側では、このタイプで問題なく動作します。

于 2013-06-27T15:41:21.777 に答える