opengl - 使用2D纹理绘制多个元素

时间:2012-10-29 02:43:23

标签: opengl textures glut texture2d

我正在研究一个带有“过剩功能”显示的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();  
}

但只显示一个纹理元素。

有人看到了什么问题吗?

1 个答案:

答案 0 :(得分:1)

glVertexPointer外,您还应使用glTexCoordPointer。不要忘记enable相应的客户端状态GL_TEXTURE_COORD_ARRAY。官方维基上还有一个完整的example,具有交错属性。

请注意,新的(3.0+)方式是使用glVertexAttribPointer和着色器。在维基上也有一个非常descriptive page