三角形纹理映射OpenGL

5
我正在使用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
} 

现在的问题是图片没有完全映射到三角形内部,程序会将图片裁剪成三角形的形状,所以我失去了一部分数据。 如何将整张图片映射到三角形内呢?


5
我不确定我听懂你的意思。你已经创建了一个带有纹理坐标的三角形,而纹理本身是一个矩形。所以你基本上是从纹理中剪切出一个三角形形状。你遇到了什么问题?你想要实现什么效果?也许你可以举个例子说明一下? - Bart
继续@Bart所说的,如果你想要将一个矩形纹理映射到三角形上,就不能避免出现严重的扭曲或未被纹理覆盖的空间。只需添加一个额外的纹理坐标和一个新的顶点,就可以完整地绘制整个纹理。 - NickLH
1个回答

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
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接