在OpenGL中可以将图片设置为背景,具体操作如下:
1.切换为正交视角;
2.关闭深度测试;
3.将图片四个角的位置设置为正交窗口后裁剪面的四个角;
4.切换到透视视角;
5.开启深度测试;
6.显示三维场景;
具体实例代码如下:
void Display()
{
zoom = 300.f;
win_width = 1920;
win_height = 1080;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-zoom* win_width / win_height, zoom* win_width / win_height, -zoom, zoom, -300.0, 300.0); //切换为正交视角;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1.f, 1.f, 1.f);
glDisable(GL_DEPTH_TEST); //关闭深度测试;
texture = LoadTexture("C:\\Users\\Tiger\\Pictures\\308.bmp", 1920, 1080); //加载图片
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS); //将图片四个角的位置设置为正交窗口后裁剪面的四个角;
glTexCoord2d(0.0, 0.0); glVertex3d(-zoom * win_width / win_height, -zoom, -300);
glTexCoord2d(1.0, 0.0); glVertex3d(zoom * win_width / win_height, -zoom, -300);
glTexCoord2d(1.0, 1.0); glVertex3d(zoom * win_width / win_height, zoom, -300);
glTexCoord2d(0.0, 1.0); glVertex3d(-zoom * win_width / win_height, zoom, -300);
glEnd();
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST); //开启深度测试;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (float)win_width/win_height, 0.01, 3000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//显示三维场景;
glColor3f(0.1f, 0.1f, 0.1f);
glLineWidth(0.1f);
glBegin(GL_LINES);
for (int i = -100; i <= 100; i += 10)
{
glVertex3f(i, 0, -100);
glVertex3f(i, 0, 100);
glVertex3f(100, 0, i);
glVertex3f(-100, 0, i);
}
glEnd();
glutSwapBuffers();
}
其中,图片加载部分的代码如下所示
int LoadTexture(const char * filename, int width, int height)
{
GLuint texture;
unsigned char * data;
FILE * file;
//读文件
file = fopen(filename, "rb");
if (file == NULL) return 0;
data = (unsigned char *)malloc(width * height * 3);
fread(data, width * height * 3, 1, file);
fclose(file);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//线性滤图
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
free(data); //释放纹理
return texture;
}
最后程序运行结果如下图所示: