0

バッファ オブジェクトを使用して頂点配列を格納する場合、openGL で問題が発生します。コードを実行すると、「アクセス違反読み取り場所 0x000000000 」というメッセージを表示するウィンドウが表示され、カーソルを glGenBuufers 関数の横にある矢印に移動すると、説明が表示されます。これは、このスレッドが現在の関数から戻ったときに実行する次のステートメントです。

IDE スナップショット

コード:

int frame=0;
void display();
void datasource();

 GLuint vbo;

void datasource()
{
    GLfloat vertex1[]={-1.000000 ,0.500000 ,-0.700000 ,0.500000 ,-1.000000 ,0.800000 ,-0.700000 ,0.800000 ,-0.400000 ,0.500000 ,-0.100000 ,0.500000 ,-0.400000 ,0.800000 ,-0.100000 ,0.200000 ,0.500000 ,0.500000 ,0.500000 ,0.200000 ,0.800000 ,0.500000,0.800000 ,0.800000 ,0.800000 ,0.500000 ,1.100000 ,0.500000 ,0.800000 ,0.800000 ,1.100000,0.800000  };

    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertex1),vertex1,GL_STATIC_DRAW);
}


void init(int arc,char **arch)
{
    glutInit(&arc,arch);
    glutInitWindowSize(800,800);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutCreateWindow("chess");
    glClearColor(0.0,0.0,0.0,0.0);
    glutDisplayFunc(display);
}

int main(int arc,char **arch)
{
    init(arc,arch);
    datasource();
    glutMainLoop();
    return 0;
}

void display()
{
    frame++;
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLE_STRIP,0,8);
    glutSwapBuffers();
    glutPostRedisplay();
}

私は何を間違えましたか?

4

2 に答える 2

5

glGenBuffers、glBindBuffer、およびglBufferDataは、VertexBufferObject拡張機能またはOpenGL-1.5のいずれかの関数です。デフォルトのシステムABIはOpenGL-1.2にのみ適用されるため、使用する前に拡張OpenGL機能をポストロードする必要があります。ヘッダーを含めるだけでは不十分です。ヘッダーは初期化されていないシンボルを提供するだけだからです。

最も簡単な方法:

  1. http://glew.sf.netからGLEWをダウンロードしてインストールします
  2. #include <GL/gl.h>のすべての出現をで置き換えます#include <GL/glew.h>
  3. glewInit()直後に電話glutCreateWindowしてエラーコードを確認してください
  4. VBOが使用可能かどうかを確認します(つまり、少なくともGL_ARB_vertex_buffer_objectまたはOpenGLバージョン> = 1.5)
  5. GLEWライブラリをリンカー設定に追加します
于 2012-12-23T10:58:19.483 に答える
2

関数ポインタ自体 ( glGenBuffers) がNULL( source ) である可能性があります。これは、OpenGL システムがまだ適切に初期化されていない場合に発生し、NULL関数ポインターを呼び出すと明らかにセグメンテーション違反が発生します。のアドレスを見てくださいglGenBuffersNULL。はいの場合、初期化コードのどこかで間違いを犯しています。

于 2012-12-23T09:41:38.097 に答える