2

私は最近glslシェーダーをいじくり回していて、派手な新しいテッセレーションステージから始めたところです。それはしばらくの間完全に機能していましたが、突然、BANG、失敗しました。元のパラメータなどを使用して実行すると、 glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0)0x00000054でアクセス違反が発生します。

私は自分のコードをくまなく調べました、そして私が見ることができるものから、すべてがチェックアウトします。しかし、これが問題です。に変更GL_PATCHESするとGL_TRIANGLES、問題なく動作します。もちろん、テッセレーションコントロールと評価シェーダーを無効にした後。私も試しましたがglDrawArrays、それでも失敗するGL_PATCHESので、それはそれと関係があるとかなり確信しています。

現在、ジオメトリシェーダーで基本的なテッセレーションを使用していますが、そのガンナはすぐに古くなります。

私はATIMobilityRadeonHD5650を搭載したWindows7x64を実行していますが、私の知る限り、最新のドライバーは何ですか。それが助けになるなら、例外はatioglxx.dllのどこかで発生すると言っています。ここにいくつかのコードがあります。

GLuint CreateIcosahedron(vec3, unsigned int&);

void DrawScene(){
    static unsigned int numindices = 0;
    static GLuint vao = CreateIcosahedron(vec3(0,0,0), vec3(1,2,1), numindices);

    glBindVertexArray(vao);
    glDrawElements(GL_PATCHES, numindices, GL_UNSIGNED_INT, 0);
    glBindVertexArray(0);
}

GLuint CreateIcosahedron(vec3 center, unsigned int& numindices){
    GLuint vaoID;
    GLuint vboID;
    GLuint iboID;

    const int indices[] = {
            // indices omitted for your viewing pleasure
    };
    const vec3 vertices[] = {
            // vertices omitted for your viewing pleasure
    };

    const GLuint uPosition = 0;
    numindices = sizeof(indices)/sizeof(indices[0]);

    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);

    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(uPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(uPosition);

    glGenBuffers(1, &iboID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    return vaoID;
} 

私は何が間違っているのですか?:c

4

1 に答える 1

0

VAO が正しくセットアップされていないときに、glDrawElements がこれを行うのを見たことがあります。初期化コードは正しいように見えますが、関数の最後で VAO のバインドを解除していないことが問題である可能性があります。これは、glBindBuffer などへの後続の呼び出しによって、VAO の状態が変更される可能性があることを意味します。CreateIcosahedron() の最後で VAO のバインドを解除してみて、それが役立つかどうかを確認してください。

[編集] あなたのコードが上に投稿したとおりに見える場合、これはおそらく役に立たないでしょう。VAOのバインドを解除していないようですが、とにかく関数が戻った直後にバインドします。問題を絞り込むために、glDrawElements の動作は、呼び出されたときに要素配列バッファーがバインドされているかどうかによって変わることを知っておく必要があります。バインドされた配列がある場合、最後のパラメーターは要素配列へのバイト オフセットとして解釈されます。それ以外の場合は、ポインターとして解釈されます。これは、あなたの場合に起こっていることだと思います。

于 2012-11-21T13:41:26.953 に答える