OpenGL全屏显示背景贴图

在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;
}

最后程序运行结果如下图所示:

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值