0

私は Open GL が初めてで、非推奨のコードをビルドしようとしています。今、私が把握できないのはVBOです。これが私がこれまでに得たすべてです。私が何をすべきか説明してください。また、OpenGL プログラミング ガイドを持っているので、読むべきページをいくつか指摘していただければ、それも非常に役に立ちます。

#include <GL/glew.h>
#include <GL/freeglut.h> 

GLuint ID[2];
GLfloat PositionData[][2] ={{50,50},{100,50},{50,100}, {100,50}, {100, 100}, {50, 100}};
GLfloat Colors[][3] = {{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3}};

void init(){
    glewInit();
    glClearColor(1.0, 1.0, 1.0, 0.0);
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glShadeModel(GL_FLAT);
    glGenBuffers(2, ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(PositionData), PositionData, GL_STATIC_DRAW);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, ID[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL_TRIANGLES, 0, 12);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDeleteBuffers(2, ID);
    glFlush();
}

void reshape(int w, int h){
    glViewport(0,0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("I don't get VBOs");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}
4

2 に答える 2

3

私はあなたのコードをざっと見てみましたが、1つ目立ったのは、VBOの要点を完全に見逃しているということです。各描画呼び出しで、VBOオブジェクトを作成し、データをアップロードして描画を試み(頂点属性のセンスを与えるシェーダーが欠落しているため、機能しません)、それらを削除します。

VBOの要点は、ジオメトリデータをGLオブジェクトに一度アップロードしてから、その抽象オブジェクトIDハンドルとインデックス配列によってのみ参照することです。これらの配列もバッファオブジェクトに配置されます。

しかし、reshapeコールバックで射影行列を設定するなど、そのコードには他にも多くの問題があります。一つには、OpenGL-3コアでは、これらの組み込みマトリックスはもうありません。それはすべてシェーダーユニフォームです。次に、レンダリングハンドラーでこれらのマトリックスをオンデマンドで設定します。

適切なイディオムを示す、その決定的なOpenGL-3コアチュートリアルを実際に作成する必要があると思います。

于 2011-02-24T00:25:09.117 に答える
2

インデックス 0 と 1 でカスタム頂点属性を設定していますが、それらを使用するシェーダーが見つかりません。シェーダーがまだない場合は、機能しません。これは、固定機能パイプラインが特定の属性を受け入れるためです (ケースによって設定されglVertexPointerますglColorPointer)。

シェーダーを作成することにした場合 (あなたの目標は GL-3 コア用に作成することですよね?)、リンクする前に GLSL コードで使用する実際の名前を頂点属性に割り当てることを忘れないでください。

glBindAttribLocation( program_id, attribute_id, attribute_variable_name )
于 2011-02-24T00:34:50.330 に答える