程序运行截图如下:

源码如下:

myglwidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H#include <QOpenGLWidget>
#include <QWidget>
class SkyBox;class MyGLWidget : public QOpenGLWidget
{Q_OBJECT
public:explicit MyGLWidget(QWidget *parent = 0);SkyBox *m_skybox;double m_axle_X;double m_axle_Y;double m_rotate_value;int m_verticalValue;public slots:protected:void initializeGL();void resizeGL(int w,int h);void paintGL();
};#endif // MYGLWIDGET_H

skybox.h

#ifndef SKYBOX_H
#define SKYBOX_H#include <GL/gl.h>
#include <GL/glu.h>
#include <QString>
class QImage;class SkyBox
{
public:SkyBox();void draw();void Init();
protected:GLuint CreateTexture2DFromBMP(const char*bmpPath);unsigned char * LoadFileContent(const char *path, int &filesize);unsigned char *DecodeBMP(unsigned char*bmpFileData, int&width, int&height);GLuint createTexture2D(unsigned char *piexlData, int width, int height, GLenum type);
private:GLuint m_textures[6];};#endif // SKYBOX_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void upBtnClicked();void downBtnClicked();void leftBtnClicked();void rightBtnClicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

myglwidget.cpp

#include "myglwidget.h"
#include <GL/glu.h>
#include <QDebug>
#include "skybox.h"MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{m_skybox=new SkyBox;m_axle_X=0.0;m_axle_Y=0.0;m_rotate_value=0.0;m_verticalValue=0;
}void MyGLWidget::initializeGL()
{glMatrixMode(GL_PROJECTION);gluPerspective(50.0f,800.0f/600.0f,0.1f,1000.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();m_skybox->Init();
}void MyGLWidget::resizeGL(int w, int h)
{Q_UNUSED(w)Q_UNUSED(h)
}void MyGLWidget::paintGL()
{glClearColor(0.0f,0.0f,0.0f,1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);m_skybox->draw();if(m_axle_X==1){if(m_verticalValue>=90||m_verticalValue<=-90){return;}}glRotatef(m_rotate_value,m_axle_X,m_axle_Y,0.0);
}

skybox.cpp

#include "skybox.h"
#include <QImage>
#include <QDebug>
#include <QFile>SkyBox::SkyBox()
{}void SkyBox::draw()
{glDisable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, m_textures[0]);glBegin(GL_QUADS);glColor4ub(255,255,255,255);glTexCoord2f(0.0f,0.0f);glVertex3f(-0.5f,-0.5f,-0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(0.5f,-0.5f,-0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(0.5f,0.5f,-0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(-0.5f,0.5f,-0.5f);glEnd();glBindTexture(GL_TEXTURE_2D, m_textures[1]);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3f(0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(-0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(-0.5f,0.5f,0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(0.5f,0.5f,0.5f);glEnd();glBindTexture(GL_TEXTURE_2D, m_textures[2]);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3f(-0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(-0.5f,-0.5f,-0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(-0.5f,0.5f,-0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(-0.5f,0.5f,0.5f);glEnd();glBindTexture(GL_TEXTURE_2D, m_textures[3]);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3f(0.5f,-0.5f,-0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(0.5f,0.5f, 0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(0.5f,0.5f,-0.5f);glEnd();glBindTexture(GL_TEXTURE_2D, m_textures[4]);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3f(-0.5f,0.5f,-0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(0.5f,0.5f,-0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(0.5f,0.5f,0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(-0.5f,0.5f,0.5f);glEnd();glBindTexture(GL_TEXTURE_2D,m_textures[5]);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3f(-0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,0.0f);glVertex3f(0.5f,-0.5f,0.5f);glTexCoord2f(1.0f,1.0f);glVertex3f(0.5f,-0.5f,-0.5f);glTexCoord2f(0.0f,1.0f);glVertex3f(-0.5f,-0.5f,-0.5f);glEnd();
}void SkyBox::Init()
{m_textures[0]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\front.bmp");m_textures[1]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\back.bmp");m_textures[2]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\left.bmp");m_textures[3]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\right.bmp");m_textures[4]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\top.bmp");m_textures[5]=CreateTexture2DFromBMP("E:\\Qt2018\\SkyOpenGL\\Res\\bottom.bmp");
}GLuint SkyBox::CreateTexture2DFromBMP(const char *bmpPath)
{int nFileSize=0;unsigned char *bmpFileContent=LoadFileContent(bmpPath,nFileSize);if (bmpFileContent==nullptr){return 0;}int bmpWidth=0,bmpHeight=0;unsigned char*pixelData=DecodeBMP(bmpFileContent,bmpWidth,bmpHeight);if (bmpWidth==0){delete bmpFileContent;return 0;}GLuint texture=createTexture2D(pixelData,bmpWidth,bmpHeight,GL_RGB);delete bmpFileContent;return texture;
}unsigned char *SkyBox::LoadFileContent(const char *path,int &filesize)
{unsigned char*fileContent=nullptr;filesize=0;FILE*pFile=fopen(path,"rb");if(pFile){fseek(pFile,0,SEEK_END);int nLen=ftell(pFile);if(nLen>0){rewind(pFile);fileContent=new unsigned char[nLen + 1];fread(fileContent,sizeof(unsigned char),nLen,pFile);fileContent[nLen] ='\0';filesize=nLen;}fclose(pFile);}return fileContent;
}unsigned char *SkyBox::DecodeBMP(unsigned char *bmpFileData,int &width,int &height)
{if (0x4D42==*((unsigned short*)bmpFileData)){int pixelDataOffset=*((int*)(bmpFileData+10));width=*((int*)(bmpFileData+18));height=*((int*)(bmpFileData+22));unsigned char*pixelData=bmpFileData+pixelDataOffset;for (int i=0;i<width*height*3;i+=3){unsigned char temp=pixelData[i];pixelData[i]=pixelData[i+2];pixelData[i+2]=temp;}return pixelData;}return nullptr;
}GLuint SkyBox::createTexture2D(unsigned char *piexlData, int width, int height, GLenum type)
{GLuint texture;glGenTextures(1,&texture);glBindTexture(GL_TEXTURE_2D,texture);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);glTexImage2D(GL_TEXTURE_2D,0,type,width,height,0,type,GL_UNSIGNED_BYTE,piexlData);return texture;
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "skybox.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->upPushButton,SIGNAL(clicked(bool)),this,SLOT(upBtnClicked()));connect(ui->downPushButton,SIGNAL(clicked(bool)),this,SLOT(downBtnClicked()));connect(ui->leftPushButton,SIGNAL(clicked(bool)),this,SLOT(leftBtnClicked()));connect(ui->rightPushButton,SIGNAL(clicked(bool)),this,SLOT(rightBtnClicked()));
}Widget::~Widget()
{delete ui;
}void Widget::upBtnClicked()
{ui->openGLWidget->m_axle_X=1.0;ui->openGLWidget->m_axle_Y=0.0;ui->openGLWidget->m_rotate_value=-2.0;ui->openGLWidget->m_verticalValue+=1;ui->openGLWidget->update();
}void Widget::downBtnClicked()
{ui->openGLWidget->m_axle_X=1.0;ui->openGLWidget->m_axle_Y=0.0;ui->openGLWidget->m_rotate_value=2.0;ui->openGLWidget->m_verticalValue-=1;ui->openGLWidget->update();
}void Widget::leftBtnClicked()
{ui->openGLWidget->m_axle_X=0.0;ui->openGLWidget->m_axle_Y=1.0;ui->openGLWidget->m_rotate_value=-2.0;ui->openGLWidget->update();
}void Widget::rightBtnClicked()
{ui->openGLWidget->m_axle_X=0.0;ui->openGLWidget->m_axle_Y=1.0;ui->openGLWidget->m_rotate_value=2.0;ui->openGLWidget->update();
}

Qt|OpenGL-天空盒子的创建相关推荐

  1. 使用opengl绘制立方体_一步步学OpenGL(25) -《Skybox天空盒子》

    教程 25 Skybox天空盒子 原文: http://ogldev.atspace.co.uk/www/tutorial25/tutorial25.html CSDN完整版专栏: https://b ...

  2. OpenGL应用:天空盒子(SkyBox)

    天空盒子(skyBox) SkyBox 制作3D游戏的一个经典技术应用. 原理 SkyBox 是基于正方体模型的渲染技术.将6个方向拍下来的天空图片分别贴在正方体的对应面上,从内部观察正方体就可以得到 ...

  3. threejs 创建场景,轨道控制器以及天空盒子

    ​​前言 一.新建场景 1 场景 2 相机 3 渲染器 4 坐标轴 5 辅助网格 二.引入轨道控制器 1.引入库 2.创建轨道控制器 三 创建天空盒子 ​​前言 快速认识threejs开发基础代码干货 ...

  4. 【一步步学OpenGL 25】-《Skybox天空盒子》

    教程 25 Skybox天空盒子 原文: http://ogldev.atspace.co.uk/www/tutorial25/tutorial25.html CSDN完整版专栏: http://bl ...

  5. C++ opengl 天空盒的创建

    天空盒要处在最远处,任何东西都可以遮挡天空盒,而天空盒不能去遮挡任何东西. 根据深度缓冲区(清空深度缓存区默认是1.0[白色]),如果是在视野范围内,那么他的深度缓冲区会写上最近一次物体的深度信息,深 ...

  6. OpenGL天空游戏

    OpenGL天空游戏 OpenGL天空游戏简介 源代码剖析 主要源代码 OpenGL天空游戏简介 天空游戏是一种在视觉上放大场景的方法,通过在环绕摄像机 360 度的观众周围创建纹理来使其更具表现力. ...

  7. OpenGL(十二)——Qt OpenGL绕着坐标轴旋转多边形

    OpenGL(十二)--Qt OpenGL绕着坐标轴旋转多边形 一.旋转多边形 前两篇介绍了如何绘制多边形,并且给多边形进行上色.本篇介绍如何旋转多边形. 多边形的旋转,在类中增加两个变量来控制这两个 ...

  8. Unity3D - 使用天空盒子(Using Skyboxes)

    在场景中,天空盒子(skybox)是代表天空或是远景的全景纹理图片. 理解天空盒子(Understanding skybox) 天空盒是一个全景视图,分为六个纹理,表示沿主轴(上,下,左,右,前,后) ...

  9. unity3d场景怎么添加天空盒子?

    unity3d场景中想要添加天空盒子,该怎么添加呢?下面我们就来看看详细的教程. 1.先下载组成天空盒子的天空图片 2.把天空图片拖进unity3d中创建的文件夹 3.新建一个材质球 4.把材质球的s ...

最新文章

  1. PTP NTP kernel 驱动讲解 (未完待续)
  2. SQL Server 2005 的版本和组件[转载]
  3. 数组排序(选择排序和冒泡排序)
  4. 将XML解析成DOM文档
  5. 支援日本/厄瓜多尔震区 Skype推免费通话
  6. 逻辑操作符的备选表示
  7. Xshell Xftp 免费版申请 官方正版 | 无需破解
  8. 多么乐alexa网站流量数据报告助手
  9. CSS实现div圆角
  10. 第18章 RS485通信和Modbus协议
  11. 全国哀悼日,英来网停站一天。
  12. Win8+CentOS7双系统安装
  13. 2016书单总结--看透SpringMvc源代码分析与实践-概述
  14. 语言表达的6c原则是指什么,第二讲 BEC写作的语言、语法、组织和文体
  15. 研究B站个人收藏中已失效的视频
  16. 对未来人工智能的一些预测和想法
  17. 三次握手和四次挥手知识总结(超详细)
  18. 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
  19. 如何使用Foobar2000将音乐文件按照专辑或者歌手名分出文件夹
  20. 流媒体学习-WebRTC全面入门学习-1

热门文章

  1. 请教DELPHI有没有GIS控件啊!在线等
  2. 01-第一章 Java开发中通用的方法和准则
  3. 如何做好会员用户画像分析,比消费者本身更懂自己?
  4. IT外包 OpenEIM 强调CMMI等级
  5. 小学生眼里的飞鸽传书
  6. 竞争者都是 飞鸽传书 高手
  7. vns可变领域_技师可变工程师!
  8. python多图合并成一张图_python使用PIL实现多张图片垂直合并
  9. ubuntu下ZED相机开发环境安装
  10. C++类构造函数与析构函数