1

私のコードは、glDrawArrays を使用すると問題なく動作しますが、インデックス バッファを作成して glDrawElements を使用するように変更すると、セグメンテーション違反が発生します。

(奇妙なことに、描画の前後ではなく、メイン ループが終了したときです!)

ここに簡単なコードがあります..ここでは、三角形を描画するために 4 つの頂点とそれらへの 3 つのインデックスを宣言します。

int main()
{
    sf::Window win(sf::VideoMode(400,400,32),"Manasij");
    GlewInit();
    mm::Program program
    (
        {
            mm::Shader(GL_VERTEX_SHADER,"vshader.vert"),
            mm::Shader(GL_FRAGMENT_SHADER,"fshader.frag")
        }
    );
    float vdata[]=
    {
        0.0f,0.0f,
        0.5f,0.0f,
        0.5f,0.5f,
        0.0f,0.5f
    };
    GLubyte indices[]={0,1,3};

    GLuint vao,vbo,ebo;
    glGenVertexArrays(1,&vao);
    glBindVertexArray(vao);

    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glBufferData(GL_ARRAY_BUFFER,8*sizeof(float),vdata,GL_STATIC_DRAW);

    glGenBuffers(1,&ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,3*sizeof(GLubyte),indices,GL_STATIC_DRAW);

    glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
    glEnableVertexAttribArray(0);
    glBindAttribLocation(program.getHandle(),0,"pos");
    //glBindVertexArray(0);

    glUseProgram(program.getHandle());
    //glBindVertexArray(vao);
    glClearColor(1.0f,1.0f,1.0f,1.0f);

    while(win.isOpen())
    {
        sf::Event eve;
        while(win.pollEvent(eve))
            if(eve.type==sf::Event::Closed)
                win.close();
        glClear(GL_COLOR_BUFFER_BIT);

//      glDrawArrays(GL_TRIANGLES,0,3);
        glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,(GLvoid*)0);
        win.display();  
    }
    return 0;
}

そして、シェーダーは次のようにシンプルです。

#version 330
in vec2 pos;
void main()
{
    gl_Position = vec4(pos,0.0f,1.0f);
}

#version 330
void main()
{
    gl_FragColor = vec4(1.0f,0.3f,0.8f,1.0f);
}

そして gdb ショー:

Breakpoint 1, main () at test.cpp:57
57                      win.display();
(gdb) continue 
Continuing. //<- At this point I try to close the window, thus triggeing the main loop to break

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff557d164 in ?? () from /lib/libnvidia-glcore.so.302.17

私が何を台無しにしているのか分かりますか?

PS: 誰かがテストしたい場合は、ここでアーカイブ..メイクファイルを完成させてください!

https://docs.google.com/file/d/0B0oubbp-MVYOeGFuX0owXzhRTEU/edit

4

2 に答える 2

2

問題は、ループの最後の繰り返しで、「閉じる」イベントが検出されたときに、ウィンドウが閉じることを通知されたことでしたが、その後も最後にもう一度 glDrawElements を呼び出していました。すべてがすでになくなっているため、セグメンテーション違反が発生しました。

解決策は、win.close() が呼び出された後に break ステートメントを配置するか、イベント処理コードをループの最後に配置することです。

(これをキャッチしてくれた archlinux フォーラムの cmtptr のおかげで、これはドライバーの問題であるとほぼ確信しました)

于 2012-07-23T20:16:21.507 に答える
0

描画ループが終了したら、 VertexArraysandを削除してみてください。Buffers

while(win.isOpen())
{
    sf::Event eve;
    while(win.pollEvent(eve))
        if(eve.type==sf::Event::Closed)
            win.close();
    glClear(GL_COLOR_BUFFER_BIT);

    // glDrawArrays(GL_TRIANGLES,0,3);
    glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,(GLvoid*)0);
    win.display();  
}
glDeleteBuffer(1, &ebo);
glDeleteVertexArrays(1, &vbo);    
return 0;

あくまでも推測ですので、違いがあれば教えてください。

于 2012-07-22T08:19:30.640 に答える