计算机图形学【纹理映射】
·
纹理映射是一种图形渲染技术,用于给三维模型表面添加细节和视觉效果。
步骤描述
① 纹理图像:首先,准备一个二维图像(即纹理),该图像包含了希望应用于模型表面的视觉信息,如颜色、图案或表面细节。
② UV坐标:每个三维模型的表面都有对应的UV坐标。UV坐标是将三维空间的点映射到二维纹理图像上的方式。U和V分别代表纹理图像的水平和垂直坐标。
③ 映射过程:在渲染时,计算每个模型表面点的UV坐标,从而确定该点在纹理图像上的位置。然后,将纹理图像的颜色信息应用到这些点上。
④ 插值与抗锯齿:在实际渲染中,会使用插值算法来平滑纹理的显示效果,并减少边缘锯齿现象。
⑤ 渲染:使用图形处理单元(GPU)将纹理应用到模型上,生成最终的图像。
OpenGL加载图片纹理后,根据投影原理,把其投射到可视空间内3D物体的表面(Surface),不同的表面形状会对纹理产生各自不同的扭曲。不同物体表面的投影:

操作实践
(记得首先下载需要的程序包和库)
结果展示:
(使用的纹理)

(映射结果)

源代码:(不够立体,同志们改进吧)
#include <GL/glut.h> // 包含 OpenGL 的 GLUT 库,用于创建窗口和处理输入
#include <SOIL2/SOIL2.h> // 包含 SOIL2 库,用于加载图像
#include <stdio.h> // 包含标准输入输出库,用于打印信息
GLuint texture; // 声明一个GLuint类型的变量,用于存储纹理ID
// 加载纹理的函数
void loadTexture(const char* filename) {
// 声明变量以存储图像的宽度和高度
int width, height;
// 使用 SOIL 库加载图像,并获取其宽度和高度
unsigned char* image = SOIL_load_image(filename, &width, &height, 0, SOIL_LOAD_RGBA);
// 检查图像是否成功加载
if (image == NULL) {
printf("Failed to load texture\n"); // 打印错误信息
return; // 退出函数
}
// 创建一个纹理对象
glGenTextures(1, &texture); // 生成一个纹理ID,并存储在texture变量中
glBindTexture(GL_TEXTURE_2D, texture); // 绑定该纹理为当前纹理
// 设置纹理的参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // 设置S轴的纹理环绕方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // 设置T轴的纹理环绕方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 设置缩小过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 设置放大过滤方式
// 上传图像数据到纹理对象
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image); // 释放加载的图像数据
}
// 初始化OpenGL状态的函数
void init(void) {
glEnable(GL_DEPTH_TEST); // 启用深度测试,用于处理物体的前后关系
glEnable(GL_TEXTURE_2D); // 启用2D纹理映射
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置清除颜色为白色
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
gluPerspective(45.0, 1.0, 1.0, 100.0); // 设置透视投影参数:视角、宽高比、近剪裁面和远剪裁面
glMatrixMode(GL_MODELVIEW); // 返回到模型视图矩阵
loadTexture("texture.jpg"); // 加载纹理,替换为你的图片路径
}
// 渲染场景的函数
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓冲和深度缓冲
glLoadIdentity(); // 重置模型视图矩阵
glTranslatef(0.0f, 0.0f, -5.0f); // 移动视点,使其远离物体
// 绑定当前纹理
glBindTexture(GL_TEXTURE_2D, texture);
// 创建一个四面体对象
GLUquadric* quadric = gluNewQuadric(); // 创建四面体对象
gluQuadricTexture(quadric, GL_TRUE); // 启用纹理映射
gluSphere(quadric, 1.0, 32, 32); // 绘制实心球体,半径为1.0,32个切片和32个堆叠
gluDeleteQuadric(quadric); // 删除四面体对象,释放资源
glFlush(); // 强制执行所有OpenGL命令
}
// 主函数
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化 GLUT
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); // 设置显示模式(单缓冲、RGB颜色和深度缓冲)
glutInitWindowSize(500, 500); // 设置窗口大小
glutCreateWindow("Textured Sphere"); // 创建窗口,标题为“Textured Sphere”
init(); // 调用初始化函数
glutDisplayFunc(display); // 注册显示回调函数
glutMainLoop(); // 进入 GLUT 事件处理循环
return 0; // 程序正常结束
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)