2011-11-24 151 views
3

我正在使用Marching Cubes算法并将数据更改为3D模型。现在我想在我的3D模型中使用OpenGL中的纹理映射。我已经尝试过一个简单的例子,它将图片映射到三角形上。三角形纹理映射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); 

    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

+0

继续@Bart的说法,你不能将所有的矩形纹理映射到一个三角形,而不会产生严重的失真或显着的无纹理空间。只需添加一个纹理坐标和一个新顶点,您就可以绘制整个纹理。 – NickLH

回答

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 
}