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函数同时绘制所有点。

你能告诉我如何绘制所有纹理元素,而不仅仅是一个,即一种使用坐标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();  
}

但只显示一个纹理元素。

有人看到有什么问题吗?

4

1 回答 1

1

除了glVertexPointer之外,您还应该使用glTexCoordPointer。不要忘记启用相应的客户端状态,GL_TEXTURE_COORD_ARRAY. 官方 wiki 上也有一个完整的示例,具有交错的属性。

请注意,新的(3.0+)方法是使用glVertexAttribPointer和着色器。wiki 上也有一个非常描述性的页面。

于 2012-10-29T03:00:25.303 回答