三角纹理映射OpenGL

时间:2011-11-24 15:52:30

标签: opengl mapping textures

我正在使用Marching Cubes算法并将数据更改为3D模型。现在我想在OpenGL中为我的3D模型使用纹理映射。我尝试了一个简单的例子,它将图片映射到一个三角形上。

这是我的代码:

int DrawGLScene(GLvoid)    // Here's Where We Do All The Drawing
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
    glLoadIdentity();                            // Reset The Current Matrix
    glTranslatef(1.0f,0.0f,-6.0f);               // Move Into The Screen 5 Units
    glRotatef(xrot,1.0f,0.0f,0.0f);              // Rotate On The X Axis
    glRotatef(yrot,0.0f,1.0f,0.0f);              // Rotate On The Y Axis
    glRotatef(zrot,0.0f,0.0f,1.0f);              // Rotate On The Z Axis
    glBindTexture(GL_TEXTURE_2D, texture[0]);    // Select Our Texture
    glBegin(GL_TRIANGLES);

    glTexCoord2f(0, 0); glVertex3f( -2,  0, -2 );
    glTexCoord2f(1, 0); glVertex3f(  2,  0, -2 );
    glTexCoord2f(0.5, 1); glVertex3f(  0,  2, -2 );

    glEnd();

    xrot+=0.3f;                             // X Axis Rotation
    yrot+=0.2f;                             // Y Axis Rotation
    zrot+=0.4f;                             // Z Axis Rotation
    return true;                            // Keep Going
} 

现在问题是图片没有在三角形内完全映射,程序会剪切三角形的图像,所以我丢失了部分数据。 如何将整个图像映射到三角形?

1 个答案:

答案 0 :(得分:3)

如果您尝试将整个纹理加载为矩形/正方形,则必须使用四边形或两个三角形在OpenGL中制作正方形,然后将纹理的一半映射到每个三角形。

像这样:

int DrawGLScene(GLvoid)    // Here's Where We Do All The Drawing
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
    glLoadIdentity();                            // Reset The Current Matrix
    glTranslatef(1.0f,0.0f,-6.0f);               // Move Into The Screen 5 Units
    glRotatef(xrot,1.0f,0.0f,0.0f);              // Rotate On The X Axis
    glRotatef(yrot,0.0f,1.0f,0.0f);              // Rotate On The Y Axis
    glRotatef(zrot,0.0f,0.0f,1.0f);              // Rotate On The Z Axis
    glBindTexture(GL_TEXTURE_2D, texture[0]);    // Select Our Texture
    glBegin(GL_TRIANGLES);

    // first triangle, bottom left half
    glTexCoord2f(0, 0); glVertex3f( -2,  0, -2 );
    glTexCoord2f(1, 0); glVertex3f(  2,  0, -2 );
    glTexCoord2f(0, 1); glVertex3f( -2,  2, -2 );

    // second triangle, top right half
    glTexCoord2f(1, 0); glVertex3f(  2,  0, -2 );
    glTexCoord2f(0, 1); glVertex3f( -2,  2, -2 );
    glTexCoord2f(1, 1); glVertex3f(  2,  2, -2 );

    glEnd();

    xrot+=0.3f;                             // X Axis Rotation
    yrot+=0.2f;                             // Y Axis Rotation
    zrot+=0.4f;                             // Z Axis Rotation
    return true;                            // Keep Going
}