Qt使用OpenGL实现立方体贴图

2023-11-01

效果如下:

在这里插入图片描述

实现代码3个文件,TestWidget.h、TestWidget.cpp、main.cpp。

TestWidget.h:

#ifndef TESTWIDGET_H
#define TESTWIDGET_H

#include <QGLWidget>

class TestWidget : public QGLWidget
{
    Q_OBJECT

public:
    explicit TestWidget(QWidget *parent = nullptr);
    ~TestWidget() override;

protected:
    virtual void initializeGL() override;
    virtual void resizeGL(int w, int h) override;
    virtual void paintGL() override;

    virtual void keyPressEvent(QKeyEvent *e) override;
    virtual void timerEvent(QTimerEvent *event) override;

private:
    void loadGLTexture();

private:
    GLfloat xRot;
    GLfloat yRot;
    GLfloat zRot;
    GLuint texture[1];
};

#endif // TESTWIDGET_H

TestWidget.cpp:

#include "TestWidget.h"
#include <QKeyEvent>
#include <QCoreApplication>

TestWidget::TestWidget(QWidget *parent)
    : QGLWidget(parent)
{
    xRot = 10.0;
    yRot = 10.0;
    zRot = 10.0;

    resize(500,400);
    startTimer(10);
}

TestWidget::~TestWidget()
{

}

// 加载纹理
void TestWidget::loadGLTexture()
{
    // 加载图片
    QImage buf;
    if(!buf.load(":/logo.png"))
    {
        QImage dummy(128, 128, QImage::Format_RGB32);
        dummy.fill(QColor(Qt::green).rgb());
        buf = dummy;
    }
    QImage tex = QGLWidget::convertToGLFormat(buf);

    // 创建一个纹理名字
    glGenTextures(1, &texture[0]);

    // 将纹理名字绑定到目标上
    glBindTexture(GL_TEXTURE_2D, texture[0]);

    // 创建纹理
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(),
                 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());

    // 设置显示图像时的放大、缩小的滤波方式
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

// 初始化opengl
void TestWidget::initializeGL()
{
    // 载入纹理
    loadGLTexture();

    // 启用纹理
    glEnable(GL_TEXTURE_2D);

    // 其他初始化
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

// 尺寸改变
void TestWidget::resizeGL(int w, int h)
{
    h = (h == 0) ? 1 : h;

    glViewport(0, 0, (GLint)w, (GLint)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
//    gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0);

    GLfloat zNear = 0.1;
    GLfloat zFar = 100.0;
    GLfloat aspect = (GLfloat)w / (GLfloat)h;
    GLfloat fH = tan(GLfloat(90.0 / 360.0 * 3.14159)) * zNear;
    GLfloat fW = fH * aspect;
    glFrustum(-fW, fW, -fH, fH, zNear, zFar);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

// 绘制代码,着色分为两种:平滑着色GL_SMOOTH、单调着色GL_FLAT
void TestWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glBindTexture(GL_TEXTURE_2D, texture[0]);

    // 立方体
    glPushMatrix();
    glTranslatef(-0.5, -0.5, -3.0);
    glRotatef(xRot, 1.0, 0.0, 0.0);
    glRotatef(yRot, 0.0, 1.0, 0.0);
    glRotatef(zRot, 0.0, 0.0, 1.0);

    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 0.0, 0.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(0.0, 1.0, 0.0);

        glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 1.0, 1.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(0.0, 0.0, 1.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 0.0, 1.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 1.0);

        glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(0.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 1.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(0.0, 0.0, 1.0);

        glTexCoord2f(0.0, 0.0); glVertex3f(1.0, 0.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 0.0, 1.0);

        glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 1.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(0.0, 1.0, 1.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);

        glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(0.0, 0.0, 1.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 0.0, 1.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 0.0, 0.0);
    }
    glEnd();
    glPopMatrix();
}

// 全屏切换
void TestWidget::keyPressEvent(QKeyEvent *e)
{
    switch(e->key())
    {
    case Qt::Key_Escape:
        showNormal();
        break;
    case Qt::Key_F1:
        showFullScreen();
        break;
    default:
        break;
    }
}

// 定时滚动
void TestWidget::timerEvent(QTimerEvent *event)
{
    xRot += 0.5;
    yRot += 0.5;
    zRot += 0.5;
    updateGL(); // 重新绘制
}

main.cpp:

#include <QApplication>
#include "TestWidget.h"

int main( int argc, char **argv )
{
  QApplication a(argc,argv);

  TestWidget w;
  w.show();
  
  return a.exec();
}

本文涉及工程代码:

https://gitee.com/bailiyang/cdemo/tree/master/Qt/60OpenGLTest/OpenGlTest

参考链接:

《Qt OpenGL纹理映射》

《Qt OpenGL教程》

《QT5.7中使用OpenGL开发记录(一)---- 第一个工程》

《立方体贴图》



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt使用OpenGL实现立方体贴图 的相关文章

  • 如何安装适用于 Windows C++ 的最新版本 OpenGL?

    我正在使用 Visual Studio 2010 运行 Windows 7 包含的 OpenGL 版本 include 是版本 1 1 我希望使用合理的当前版本 某种版本 3 或 4 我需要做什么才能达到该状态 OpenGL SDK 页面位
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 为什么 OpenGL 给对象提供句柄而不是指针?

    OpenGL 的传统是让用户使用 unsigned int 句柄来操作 OpenGL 对象 为什么不直接给出一个指针呢 与指针相比 唯一 ID 有何优点 TL DR OpenGL ID 不会双射映射到内存位置 单个 OpenGL ID 可能
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 在 GLUT 中使用鼠标滚轮

    我想在 OpenGL GLUT 程序中使用鼠标滚轮来放大和缩小场景 我怎么做 Freeglut 的 glutMouseWheelFunc 回调与版本相关 并且在 X 中不可靠 使用标准鼠标功能并测试按钮 3 和 4 OpenGlut 对 g
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提
  • OpenGL:伽玛校正图像看起来不线性

    我使用 OpenGL 进行渲染 当我将线性值写入默认帧缓冲区 没有任何伽玛校正 时 它们在我的显示器上显示为线性 这违背了我认为我所知道的关于伽马校正的一切 如下所述 http gamedevelopment tutsplus com ar
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • LWJGL3:重载的 glBufferData 方法

    我正在使用 LWJGL 调用 OpenGL 函数 方法org lwjgl opengl GL15 glBufferData http javadoc lwjgl org org lwjgl opengl GL15 html glBuffer
  • 重新创建窗口而不破坏上下文

    这个问题是关于使用 OpenGL 的图形应用程序 当时我正在使用 GLFW 框架 但我考虑更改它 我的目标是让用户 尽可能 在全屏模式和窗口模式之间不断切换 此过程应该花费不到一秒的时间 并且可以在运行时发生 例如 看看游戏 我的世界 用户
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 帧缓冲区/颜色缓冲区?

    有人可以指出我两者是否相同吗 我的意思是我一直在阅读有关它的信息 这里的红皮书说 颜色缓冲区本身可以由多个子缓冲区组成 系统上的帧缓冲区包含所有这些缓冲区 here http glprogramming com red chapter10
  • 为什么 glClear 不清除我的屏幕?

    这是我编写的一个简单的 opengl 程序 我试图在绘制三角形之前清除屏幕 我在 init 函数中调用了 glClear 但是 它似乎无法清除屏幕 include
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • 移动/调整大小期间 opengl 窗口冻结

    我正在使用 LWJGL 开发游戏 移动窗口时 计划将来添加调整大小代码 渲染循环冻结 我希望它在移动时继续以某种方式运行 LWJGL 不包括 glutMainLoop Display属于OpenGL 而不是Java 相关代码 regular

随机推荐

  • jsp页面,EL表达式失效

    检查pom文件引入的依赖
  • C++ 集合

    目录 1 Vector 容器 2 Stack 栈 3 Queue 队列 4 Map 关联容器 5 Set 关联容器 C 的集合 较为简单 但容易混淆 所以总结一下 1 Vector 容器 Vector 是 C 的一种数据结构 确切的说是一个
  • Bing搜索核心技术BitFunnel原理

    1 概述 转载 Bing搜索核心技术BitFunnel原理 相似文章 guava 大数据量下的集合过滤 Bloom Filter 导语 从90年代中期开始 人们普遍认识 对于内容索引来说 文件签名技术比反向链接效果更差 最近几年必应搜索引擎
  • 应对当今的医疗器械软件测试开发挑战,如何选择测试软件

    随着计算机科学与技术的发展 计算机软件控制技术在医疗设备中的应用越来越广泛 并已成为医疗设备的核心技术之一 大到高端的大型医疗设备 如螺旋CT 核磁共振 直线加速器或全自动生化分析仪等 小到家用的电子血压计 血糖仪或微波理疗仪等 计算机软件
  • 修改python的默认版本

    如果电脑上安装了多个python环境 那么如何设置某一个版本的python为默认打开方式呢 我们尝试将2 7设置为默认的python环境 方法如下 此电脑 gt 属性 gt 高级系统设置 gt 环境变量 选择系统变量 然后点击编辑 将2 7
  • 前后端交互与接口设计学习

    目录 前言 介绍目录内容和目的 前后端交互概述 解释前后端交互的基本概念和作用 2 强调前后端分离的架构模式 2 前后端交互逻辑设计 1 讨论前后端交互的一般逻辑流程 2 探索不同的数据传输方式 3 提供实际案例加深理解 4 接口设计与文档
  • 太原理工大学python考试题总结

    已知x 1 2 3 那么x 3的值为 1 2 3 1 2 3 1 2 3 已知x 1 2 和y 3 4 那么x y的结果是 1 2 3 4 Python 不具备运行速度快的特点 具备扩展库丰富 跨平台 支持函数式编程的特点 Python是面
  • 15. 线性代数 - 克拉默法则

    文章目录 克拉默法则 矩阵运算 Hi 大家好 我是茶桁 上节课我们在最后提到了一个概念 克拉默法则 本节课 我们就来看看到底什么是克拉默法则 克拉默法则 之前的课程我们一直在强调 矩阵是线性方程组抽象的来的 那么既然我们抽象出来了 有没有一
  • 选中物体高亮显示(MR开发日志)

    业务逻辑 屏幕中央扫到物体 点亮该物体 离开物体 取消高亮 程序逻辑 射线选中物体 配合Outline Effect高亮显示物体 场景设置 下载插件Outline Effect 1 摄像机设置添加Outline Effect脚本 2 然后那
  • Linux防火墙端口

    在服务器上使用某些软件时需要开启相应的防火墙端口号 简单了解下Linux防火墙端口 防火墙策略 防火墙策略可以基于流量的源目地址 端口号 协议 应用等信息来定制 然后防火墙使用预先定制的策略规则监控出入的流量 若流量与某一条策略规则相匹配
  • strlen、strcpy、strcmp、strcat函数的实现

    目录 一 strlen函数的实现 二 strcpy函数的实现 三 strcmp函数的实现 四 strcat函数的实现 五 代码示例展示 strlen strcpy strcmp strcat四个函数都包含在 include
  • ios safari 开启无痕浏览(隐私模式)报QuotaExceededError: DOM Exception 22异常解决办法...

    检测safari是否开启无痕浏览 function var testKey test var storage window sessionStorage try storage setItem testKey testValue stora
  • 域适应(Domain Adaptation)综述

    根据李宏毅老师的视频所归纳的笔记 视频链接 https www bilibili com video BV1TL411p7Us spm id from 333 999 0 0 假设我们在训练集上训练黑底白字的手写数字集后 如下图 再把它用在
  • undefined symbol 问题解决记录(二)

    昨天上车自测本模块功能稳定性 顺便pull小弟分支 帮忙一起验证 结果小包上车后无法运行 一查发现一直报 undefined symbol XXXXXX 晚上下班后开始帮忙排查 今日记录以便后期回顾 前两年写过一篇关于undefined s
  • git clone 使用用户名和密码

    git clone 使用用户名和密码 一般git仓库的用户 都是用户名和密码登录 git clone命令如下 模板 git clone http 邮箱 或用户名 密码 仓库 git clone http username password
  • Java读取和写入Excel表格

    Java读取和写入Excel表格 1 绪论 2 JXL篇之程序范例 2 1 JXL 创建低版本Excel文件 2 2 JXL 读取低版本Excel文件 3 POI篇之程序范例 3 1 POI 创建低版本Excel文件 3 2 POI 读取低
  • 阿里云移动测试

    阿里云移动测试 买服务 上传APP 勾选需要的服务 提交之后 阿里云帮进行测试 这个是自动的还是人工的
  • [SQL]经典的sql语句

    一 基础 1 说明 创建数据库 CREATE DATABASE database name 2 说明 删除数据库 drop database dbname 3 说明 备份sql server 创建 备份数据的 device USE mast
  • getClass().getClassLoader()为null

    想获取resources下的文件 之前用过this getClass getClassLoader getResourceAsStream path 可以获取到 但最近的一个工程中需要在一个静态方法中获取该文件 没有了this 我直接用了C
  • Qt使用OpenGL实现立方体贴图

    效果如下 实现代码3个文件 TestWidget h TestWidget cpp main cpp TestWidget h ifndef TESTWIDGET H define TESTWIDGET H include