转载请声明出处:http://blog.youkuaiyun.com/xiaoge132/article/details/51448326
导言:
通常在OpenGL里面绘制的都是默认的黑色背景,对于有些时候,太过于单调了,现在我们可以对它加上背景,实现一个不错的图形.
在网上看到人家要实现星空图,找到一张星空图片贴在背景上面.
看一下效果图
原理:
看一下下面的这张图:
这是OpenGL里面摄像机的原理图,我们要绘制的物体在离摄像机近的地方,那个离摄像机远的矩形,就是要绘制背景的地方.
先定义个导入图片的函数
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;
}
在后面我们就可以调用这个函数来实现纹理的导入了.
接着再定义个设置背景的函数
Background()
{
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex2d(-1.0, -1.0);
glTexCoord2d(1.0, 0.0); glVertex2d(+1.0, -1.0);
glTexCoord2d(1.0, 1.0); glVertex2d(+1.0, +1.0);
glTexCoord2d(0.0, 1.0); glVertex2d(-1.0, +1.0);
glEnd();
return ;
}
最后在绘制函数里面调用并调整大小,就可以得到我们想要的背景了.
glDisable(GL_DEPTH_TEST);
glLoadIdentity();
//导入纹理
texture = LoadTexture("C:\\Users\\Administrator\\Desktop\\zuixin\\zuixin\\UI\\xiaoge.bmp", 640, 640);
glEnable(GL_TEXTURE_2D);
glPushMatrix();
glScalef(100, 70, 1);
glTranslatef(0, 0, -150);
Background(); //背景方块
glPopMatrix();
俗话说的好,不给源码的博客不是好博客