0

これを書いて、opengl バッファで描画する方法をテストしました。初期化する関数は次のとおりです。

#include "GL/glew.h"
#include "GL/glfw.h"

    int main ( int argc, char* argv[] )
    {
        //init glfw
        glfwInit();

        glfwOpenWindow ( 1024, 768, 8, 8, 8, 8, 24, 0, GLFW_WINDOW );

        //init extension
        glewInit();

        //i
        glGenBuffers ( 1, &buffID );
        //init test buffer
        for ( int i = 0 ; i < 15; i ++ ) {
            testBuffer[i][0] += 1 + i * i;
            testBuffer[i][1] += 1 + i + i * i;
            testBuffer[i][2] = 0;
        }

        do {
            render_loop();
        } while ( glfwGetWindowParam ( GLFW_OPENED ) );

        glfwTerminate();
    }

これは render_loop 関数です:

GLuint buffID;
static GLfloat testBuffer[15][3];

void render_loop()
{
    glClearColor ( .7, .1, .1, 1.0f );
    glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glViewport ( 0, 0, 1024, 768 );
    glMatrixMode ( GL_PROJECTION );

    glLoadIdentity();
    glOrtho ( 0, 1024, 768, 0, 0, -1 );
    glMatrixMode ( GL_MODELVIEW );
    glLoadIdentity();

    //draw a test point
    glPointSize ( 10 );
    glBegin ( GL_POINTS );
    glColor4f ( 1, 1, 1, 1 );
    glVertex3f ( 512, 384, 0 );
    glEnd();

     glBindBuffer(GL_ARRAY_BUFFER,buffID);
     glBufferData(GL_ARRAY_BUFFER,3 * sizeof(GLfloat) * 15, testBuffer,GL_DYNAMIC_DRAW);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,testBuffer);
    glDrawArrays(GL_POINTS,0,15);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glDisableClientState(GL_VERTEX_ARRAY);

    glfwSwapBuffers();

}

15 個の頂点はすべて、ウィンドウの左上隅である 0,0 の位置にあります。ループから次の 3 行を削除すると、そこに白い点が表示されます。

glBindBuffer(GL_ARRAY_BUFFER,buffID);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat) * 15, testBuffer,GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);

すべてが期待どおりに機能します。いくつか質問があります。

1.頂点バッファの位置を変更したのは何ですか?

2.ちなみに、これらの呼び出しを使用すると、パフォーマンスはどのくらい向上しますか?

4

1 に答える 1

1

これを呼び出す必要があります:

glBindBuffer(GL_ARRAY_BUFFER,0);

機能の後glBufferData

また、これを変更する必要があることがわかりました:

//added this line before glVertexPointer:
glBindBuffer(GL_ARRAY_BUFFER,buffID);
//glVertexPointer(3,GL_FLOAT,0,testBuffer); change last param to 0:
glVertexPointer(3,GL_FLOAT,0,0);

それを追加した後、すべてがうまくいっているようです。

于 2012-11-15T13:32:34.677 に答える