use*_*002 5 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
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是图片没有完全映射在三角形内,程序为三角形剪切了图像,所以我丢失了部分数据。如何将整个图像映射到三角形中?
如果您尝试将整个纹理加载为矩形/正方形,则必须使用四边形或两个三角形在 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
}
Run Code Online (Sandbox Code Playgroud)