3

「過剰関数」表示のn体コードに取り組んでいます。bmp画像から各ボディを2Dテクスチャで表示したいと思います。現在、次のコードで単一のテクスチャ要素を描画できます。

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear The Screen And The Depth Buffer

        glBindTexture(GL_TEXTURE_2D, texture[0]);    // pick the texture.
        glBegin(GL_QUADS); // begin drawing the textured quad.
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
        glEnd(); // done drawing the textured quad.

私のコードの最初のバージョンでは、次の表示関数を使用して各ボディの位置を描画します。

void drawPoints()
{       
        GLuint vbo;

        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), pos);   
        glEnableClientState(GL_VERTEX_ARRAY);

        if (colorVBO) {
            glBindBuffer(GL_ARRAY_BUFFER, id_colorVBO);
            glColorPointer(4, GL_DOUBLE, 4*sizeof(double), pos);
            glEnableClientState(GL_COLOR_ARRAY);
            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        }

        glColor3f(1, 1, 0);
        glDrawArrays(GL_POINTS, 0, numBodies);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);
}

ここで、pos配列には各ボディの座標x、y、zが含まれています。関数を使用しglDrawArraysて、すべてのポイントを同時に描画しています。

1つだけでなく、すべてのテクスチャ要素をプロットする方法、つまり、座標pos配列を使用してすべてのテクスチャボディの位置を示し、それらを描画する方法を教えてください。

更新しました :

わかりました。次の表示関数でglTexCoordPointerを使用しようとしています。

void drawPoints()
{       
    glPushMatrix();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear The Screen And The Depth Buffer
    glBindTexture(GL_TEXTURE_2D, texture[0]);    // pick the texture.
    glLoadIdentity(); // reset the view before we draw each star.
    glTranslatef(0.0f, 0.0f, zoom);    // zoom into the screen. 

    glEnableClientState(GL_VERTEX_ARRAY);
    lEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), pos);   
    glTexCoordPointer(4, GL_DOUBLE, 4*sizeof(double), pos);

    // Assign A Color Using Bytes
    glColor4ub(30, 100, 120, 255);
    glBegin(GL_QUADS);  // Begin Drawing The Textured Quad
    glTexCoord2f(0.0f, 0.0f);  glVertex3f(-1.0f,-1.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
    glEnd();   // Done Drawing The Textured Quad

    glDrawArrays(GL_QUADS, 0, numBodies);           
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);   
    glDisableClientState(GL_VERTEX_ARRAY);  

    glPopMatrix();  
}

ただし、テクスチャ要素は1つだけ表示されます。

誰もが何が悪いのかわかりますか?

4

1 に答える 1

1

glVertexPointerに加えて、glTexCoordPointerを使用する必要があります。対応するクライアント状態を有効にすることを忘れないでください。公式ウィキには、属性がインターリーブされた完全なもあります。GL_TEXTURE_COORD_ARRAY

新しい(3.0+)方法は、シェーダーと一緒にglVertexAttribPointerを使用することであることに注意してください。そのウィキにも非常に説明的なページがあります。

于 2012-10-29T03:00:25.303 に答える