计算机图形学纹理水壶代码
时间: 2023-12-20 16:29:15 浏览: 73
计算机图形学实验代码(全)
算机图形学中的纹理映射是一种将图像或纹理映射到三维对象表面的技术。纹理映射可以用于增强三维对象的视觉效果,例如在三维场景中添加木纹或石纹等纹理。下面是一个使用OpenGL实现的纹理映射的水壶代码示例:
```OpenGL
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
GLuint texture[1];
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
// 加载纹理
glGenTextures(1, texture);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
int width, height;
unsigned char* image = SOIL_load_image("texture.jpg", &width, &height, 0, SOIL_LOAD_RGB);
if (image == NULL) {
printf("Failed to load texture image.\n");
exit(1);
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[0]);
// 绘制水壶
glColor3f(1.0, 1.0, 1.0);
glutSolidTeapot(1.0);
glFlush();
glDisable(GL_TEXTURE_2D);
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
```
在这个示例中,我们使用了SOIL库来加载纹理图像。在初始化函数中,我们首先生成了一个纹理对象,并将其绑定到GL_TEXTURE_2D目标上。然后,我们设置了纹理的一些参数,例如纹理的重复方式和过滤方式。接下来,我们加载了一张名为“texture.jpg”的纹理图像,并将其绑定到纹理对象上。在显示函数中,我们启用了纹理映射,并将纹理对象绑定到当前的纹理单元上。最后,我们使用OpenGL提供的glutSolidTeapot函数绘制了一个水壶,并在绘制过程中应用了纹理映射。
阅读全文