OpenGL
1. QOpenGLShaderProgram 着色器程序管理类头文件 #include QOpenGLShaderProgram1. 创建QOPenGLShaderProgram 对象2. 添加着色器源码 addShaderFromSourceCode / addShaderFromSourceFile3. 链接程序 link()4. 绑定启用bind()5. 绘制完成释放release()设置数据格式 setUniformValue(ourTexture, 0); // 设置着色器使用的纹理单元02. QOpenGLBuffer qt对OpenGL Buffer Object 的缓冲区#include QOpenGLBuffer创建 bool create();绑定 bool bind(); 将vbo绑定到GL_ARRAY_BUFFER解绑 bool release();分配显存空间 bool allocate(const void *data, int count);局部跟新缓冲区数据 void write(int offset, const void *data, int count); // 要写入的数据的首地址设置数据使用模式 void setUsagePattern(UsagePattern usage);enum UsagePattern {StreamDraw,StreamRead,StreamCopy,StaticDraw, // 静态数据一次上传多次绘制顶点坐标常用StaticRead,StaticCopy,DynamicDraw, // 动态数据CPU频繁修改GPU绘制粒子、动画顶点 DynamicRead,DynamicCopy};glBindBuffer(targer, 0); 0 解绑3. QOpenGLVertexArrayObject 存储顶点属性配置的容器bool create(); 创建void bind(); 绑定void release(); 解绑4. QOpenGLTexture OpenGL 纹理对象头文件 #include QOpenGLTexturesetMinificationFilter(QOpenGLTexture::LinearMipMapLinear); 缩小过滤图片的尺寸大于屏幕setMagnificationFilter(QOpenGLTexture::Linear); 放大过滤图片的尺寸小于屏幕QOpenGLTexture 枚举:Nearest 最近点像素风锯齿明显Linear 线性插值 线性平滑模糊抗锯齿LinearMipMapLinear 三线性 3D 场景远距离最优setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat); 设置纹理包裹模式纹理坐标超出0~1 如何处理Repeat 重复平铺ClampToEdge拉伸边缘像素ClampToBorder: 填充自定义边框色bool bind(int a) 绑定纹理单元abool release() 解绑纹理单元5. 设置位置属性glVertexAtrribPointer(0, 2, GL_FLOAT, GL_FALSE, 4* sizeof(float), (void*)0);void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer );6. 启用设置好的位置属性glEnableVertexAttribArray(int location); 启用location顶点属性7. glDrawArrays 绘制调用函数 绘制顶点Qt / 现代 OpenGL 核心模式下最基础的绘制调用函数按照已经配置好的 VAO 顶点属性连续读取顶点并进行图元组装、光栅化、着色。void glDrawArrays(GLenum mode, GLint first, GLsizei count);GLenum 图元绘制类型GLint first 起始顶点索引偏移 一般填0 从头读取VBO中的顶点GLsizei count 一共读取多少个顶点代码 initializeGL()void Widget::initializeGL() { initializeOpenGlFunctions(); // 动态初始化openGL glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 设置清屏颜色 // 加载图片并创建纹理 QImage img(); if(img.empty(){ qDebug() image初始化失败; return; } img img.converToFormat(QImage::Format_RGBA888); //垂直翻转因为OpenGL在原点左下 m_texture new QOpenGLTexture(QImage.mirrored()); // 设置纹理过滤和纹理包裹 m_texture-setMinitialficationFilter(QOpenGLTexture::Linear); m_texture-setMagnitialficationFilter(QOpenGLTexture::Linear); m_texture-setWrapMode(QOpenGLTexture::ClampToEdge); // 修改纹理数据 // 顶点数据: 位置 (x,y) 纹理坐标 (u,v) // 对应一个矩形 (两个三角形) float vertices[] { // 位置 // 纹理坐标 -1.0f, -1.0f, 0.0f, 0.0f, // 左下 1.0f, -1.0f, 1.0f, 0.0f, // 右下 1.0f, 1.0f, 1.0f, 1.0f, // 右上 -1.0f, -1.0f, 0.0f, 0.0f, // 左下重复 1.0f, 1.0f, 1.0f, 1.0f, // 右上 -1.0f, 1.0f, 0.0f, 1.0f // 左上 }; // 创建VAO VBO QOpenGLVertexArrayObject* m_vao new QOpenGLVertexArrayObject(this); m_vao-create(); m_vao-bind(); QOpenGLBuffer *m_vbo new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer); m_vbo-create(); m_vbo-bind(); m_vbo-setUsagePattern(QOpenGLBuffer::StaticDraw); m-vbo-allocate(vertices, sizeof(vertices)); // 位置属性 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // 纹理坐标属性 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float), (void*)(2 * sizeof(float))); m_vao.release(); m_vbo.release(); // 加载并编译着色器 program.addShaderFormSourceFile(QOpenGLShader::Vertex, xxxxx); // 顶点着色器 program.addShaderFormSourceFile(QOpenGLShader::Fragment, xxxxx);// 片段着色器 if(!program.link()){ qDebug() Shader link failed: program.log(); } }顶点着色器 transform.vert#version 330 core layout(location 0) int ver2 aPos; layout(location 1) int vec2 aTexCord; out vec2 TextCord; void main(){ gl_Position vec4(aPos, 0.0, 1.0); TextCord aTextCord; }片段着色器 transform.frag#version 330 core out vec4 FragColor; in vec4 TexCord; uniform sampler2D outTexture; void main(){ FragColor texture(outTexture, TextCord); }paintGL 绘制void Widget::paintGL() { // 1. 设置清屏颜色 glClear(GL_COLOR_BUFFER_BIT); // 2. 着色器程序绑定 program.bind(); // 3. 纹理绑定 告诉着色器使用纹理单元0 m_texture-bind(0); program.setUniformValue(outTexture, 0); // 4. vao绑定 绘制两个三角形 解绑 m_vao.bind(); glDrawArrays(GL_TRANGLES, 0, 6); m_vao.release(); // 5. 纹理解绑 小程序解绑 m_texture-release(); program.release(); }widget.h#ifndef MYGLWIDGET_H #define MYGLWIDGET_H #include QOpenGLWidget #include QOpenGLFunctions #include QOpenGLVertexArrayObject #include QOpenGLBuffer #include QOpenGLShaderProgram #include QOpenGLTexture class Widget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit Widget(QWidget *parent nullptr); ~Widget(); protected: // 必须重写的三个核心函数 void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; private: QOpenGLShaderProgram program; QOpenGLBuffer *m_vbo nullptr; QOpenGLVertexArrayObject *m_vao nullptr; QOpenGLTexture *m_texture nullptr; // 新增纹理对象 }; #endif // MYGLWIDGET_H

相关新闻

AI算力博弈:从硬件堆料到效率优化的技术转型

AI算力博弈:从硬件堆料到效率优化的技术转型

上周,当我在调试一个本地大模型推理服务时,又一次遇到了显存不足的报错。这让我下意识地打开购物网站,看了一眼RTX 4090的价格,然后默默关掉。这种“算力焦虑”几乎是每个深入AI领域的开发者都有的日常。而就在这种焦虑的背景下&a…

2026/8/21 6:45:32 阅读更多 →
基于RSS与电子墨水屏打造个人专属信息终端:从原理到实践

基于RSS与电子墨水屏打造个人专属信息终端:从原理到实践

之前为了获取信息,每天都要在手机和电脑上打开一堆网站和App,不仅信息流杂乱,还容易被算法推荐和无关推送干扰。后来尝试用RSS订阅来聚合内容源,虽然信息获取效率提升了,但依然需要盯着屏幕,长时间下来眼睛…

2026/8/21 6:45:32 阅读更多 →
Mathtype在Word/WPS中的完整安装、集成与疑难问题解决指南

Mathtype在Word/WPS中的完整安装、集成与疑难问题解决指南

这次我们来看一个在学术写作和文档编辑中绕不开的实用工具:如何在 Word 中嵌入 Mathtype。对于理工科学生、科研人员和经常需要处理复杂公式的编辑来说,Mathtype 几乎是公式编辑的代名词。但很多人在安装、嵌入和日常使用中会遇到各种问题,比…

2026/8/21 6:45:32 阅读更多 →

最新新闻

独立游戏开发中AI工具合规应用与风险规避指南

独立游戏开发中AI工具合规应用与风险规避指南

最近和几个做独立游戏的朋友聊天,发现一个挺有意思的现象:大家聊起AI工具时,态度变得比以前复杂多了。以前是“哪个AI画图强?”“哪个AI写代码快?”,现在更多是“这个AI生成的内容,平台审核能过…

2026/8/21 9:02:49 阅读更多 →
AI Agent面试指南与核心技术解析

AI Agent面试指南与核心技术解析

1. 项目概述"2026智能体(AI Agent)面试&学习指南"是一份面向AI从业者的综合性资源,旨在帮助开发者系统掌握智能体技术的核心知识体系。这份指南以100道高频面试真题为线索,覆盖从基础原理到生产级架构的全栈内容&am…

2026/8/21 9:02:49 阅读更多 →
告别弹窗广告!7-Zip美化增强版:开源免费的终极解压方案

告别弹窗广告!7-Zip美化增强版:开源免费的终极解压方案

你有没有遇到过这种情况:电脑里装了三四个解压缩软件,每次右键菜单都长得不一样,有的弹广告,有的要会员,有的解压到一半报错,最后还得老老实实装回那个界面丑、但从不掉链子的老家伙——7-Zip。是的&#x…

2026/8/21 9:02:48 阅读更多 →
PCA主成分分析实战:从sklearn参数详解到业务洞察

PCA主成分分析实战:从sklearn参数详解到业务洞察

1. 项目概述:从数据降维到特征洞察主成分分析,这四个字在数据科学和机器学习领域出现的频率,可能仅次于线性回归。但很多朋友在初次接触时,总觉得它像是一个“黑箱”:丢进去一堆高维数据,跑出来几个叫“主成…

2026/8/21 9:02:48 阅读更多 →
AI智能体循环架构:从感知-思考-行动到自主任务执行

AI智能体循环架构:从感知-思考-行动到自主任务执行

在探索AI智能体开发的过程中,你是否遇到过这样的困境:智能体只能被动响应单次请求,无法记住上下文,更别提自主规划、执行多步任务了?这背后缺失的,正是一个能让智能体“思考”和“行动”起来的关键机制——…

2026/8/21 9:02:48 阅读更多 →
手机存储扩容新思路|四款主流云盘工具功能实测与对比

手机存储扩容新思路|四款主流云盘工具功能实测与对比

一、前言当下手机高清影像、原创素材、办公文档与社交缓存数据持续增长,设备自带的本地存储空间很容易出现容量不足的情况,影响日常存储与使用体验。更换大容量设备、硬件拆机扩容存在成本高、硬件改动风险大的问题,云端软件扩容凭借无需改动…

2026/8/21 9:01:48 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →