Qt
文章平均质量分 58
wangzai6378
喜欢游戏;但却没有做游戏
展开
-
cuda与opengl互调 在Qt中的实现
生成图的效果如下 本次主要是参考cuda的Sample将示例中的opengl es 130换成我常用的opengl es 300,并且在Qt中实现。主要包括cuda在windows平台的Qt环境中的一些配置,cuda访问opengl的纹理在gpu中的地址,实现在gpu上生成图像并且直接拷贝到opengl的纹理进行显示,不在需要从cpu传入;可以减少cpu到显卡之间的数据...原创 2019-04-05 13:05:41 · 1768 阅读 · 1 评论 -
qt opengl 3d纹理
3d纹理在现实世界中并不存在,也不能用图片工具查看。可以理解为一个实心的立文体数据块,可以通过,x,y,z坐标获取对应点的纹素(像素)。 这里我学习了一个梯子的3d纹理,在实现3d纹理的同时,在其中加入了光照,效果如下 其渲染器实现如下#ifndef TEXTURE3DRENDER_H#define TEXTURE3DRENDER_H#include &l...原创 2018-10-20 22:44:47 · 1976 阅读 · 1 评论 -
qt opengl 点精灵
点精灵就是在opengl中画点,在画点的同时指明点的大小,这样点就会变成一个实心的矩形(指明GL_POINT_SMOOTH可能不正确,大体是这个;就会是一个圆)。画每个矩形时,给每个矩形加载一个纹理图,就变成了点精灵;每个纹理坐标从内建变量gl_PointCoord获取。50个随机点32*32效果图如下 其渲染器实现如下#ifndef POINTSPRINTRENDER_...原创 2018-10-14 21:35:54 · 1141 阅读 · 2 评论 -
qt opengl 压缩纹理
压缩纹理与普通纹理的区别是,占用的内存空间变小了;es 2.0 es3.0都支持ETC1。es 3.0支持ETC2。ETC2支持带有透明通道的图片,ETC1不支持透明通道。我这里使用的是ETC1,png、jpg或其它格式转换为ETC1的pkm格式压缩图片,可以用网上下载的工具。 其渲染器实现非常简单,和渲染一帧普通图片,流程大致相同;只是在加载纹理的时候要设置纹理格式,并加载压...原创 2018-10-13 22:46:33 · 638 阅读 · 0 评论 -
qt opengl mipmap纹理
mipmap纹理适用于创建地形,墙壁等需要使用GL_REPEAT重复纹理拉伸的地方;还有就是应用于需要同一幅纹理,但是呈现的大小不同。 使用mipmap纹理可以使得近处的景物清晰,远处的景物模糊,符合现实生活情况。先看看示例效果 小窗口效果如下:大窗口效果如下:将地板也设置为mipmap的效果如下: 由此,我们可以看出,使用mipmap纹理方式,...原创 2018-10-06 22:35:28 · 1004 阅读 · 0 评论 -
qt opengl 环境光、散射光、高光、定向光与每片无渲染
球是学习光照的很好参照物,也是因为如此上一篇更新了一个球的文章。这章利用上一章的成果,学习opengl中的各种光照效果以及在每片元渲染。本章主要介绍在qt中如何实现这些,将这些效果集成到qt的开发生态里面 先看一下效果 主框架和上一篇的球一样,不一样的是shader部分,两个球的示例工程cpp部分有一些变化,窗体、渲染器的声明与实现与前...原创 2018-09-22 20:08:52 · 1548 阅读 · 0 评论 -
qt opengl 画球体
和一般写opengl的程序一样,就直接出代码不多说。 在qt中我使用qopenglwidget来操作opengl程序,声明如下#ifndef WIDGET_H#define WIDGET_H#include <QOpenGLWidget>#include "ballshader.h"class Widget : public QOpenGLWidget...原创 2018-09-15 13:41:57 · 3847 阅读 · 2 评论 -
qt opengl 2d纹理到3d球面
根据前面的实践,已能通过代码生成球面的顶点,要将2维图贴到球表面;只要能计算出每个顶点对应的纹理坐标就可以了;关于2维图贴到球面的公式如下: float pi = 3.14159265; U = arcsin(z / R)/pi + 0.5; V = arctan(y/x)/2/pi; x、y、z分别为顶点的三个坐标。由此我们便可...原创 2018-10-01 10:13:48 · 2020 阅读 · 2 评论 -
opengl 投影、摄像机、矩形转换与纹理,在Qt中实现
3维空间的物体比2维更真实,更酷炫;其变换大家都知道是通过矩阵转换来的;可具体到底是怎样转换的呢,网上大多都帖的一些理论,本文给出一个示例供大家学习。 本示例在Qt中显示,可以接收用户输入。同样也是开发opengl程序,步奏当然一样的。我这里将渲染器分离了出来以便能复用在Qt中的显示我使用的是QOpenglWidget。 显示部分申明如下...原创 2018-09-08 14:34:18 · 1061 阅读 · 1 评论 -
基于ffmpeg与nvidia-video-sdk-8.1.24视频硬解与软解多路rtsp,支持Qt的QOpenglWidget与qml接口显示
为了解决工程上的一个问题,我研究了nvidia较新的video-sdk-8.1.24,看完之后觉得这个sdk比较符合现代的编程规范,于是摒弃了以前的video-sdk-6.0,解决了工程上的问题。 我提供的封装支持软解和硬解,其中重要部分为做了视频复制,同一个视频源只解码一路;内存的细节管理;视频渲染;视频镜像等。 接口申明如下#ifndef...原创 2018-08-25 13:48:20 · 3853 阅读 · 34 评论 -
ffmpeg opengl 硬解视频并使用opengl在qt中显示nv12
之前做过用ffmpeg解码视频然后在qt中用opengl来显示yuv数据,这次介绍一下ffmpeg硬解的方法。在网上找的资料大多数是ffmpeg软解的,而且解码后的格式都是yuv;我们知道nvidia显示视频解码后的格式是NV12的,那么怎么在代码中实现呢? 在后来看见别人使用ffplay工具播放视频的时候发现可以指明decoder来解码视频,于是通过在360搜索中找到了ffmpeg中查...原创 2018-06-03 16:22:51 · 9557 阅读 · 12 评论 -
qml实现离屏渲染视频(多线程渲染) ----二
上次说完了在VideoThreadRender类中实现几个重要类之间的关系及通信,搭建好了一个初始化可以运行并调用的流程环境;这篇主要介绍后半分的子线程及解码 VideoThreadRender类中会实例TextureNode、RenderThread这两个类;TextueNode主要是将RenderThead类渲染好的视频帧的纹理id送到渲染线程中去(主要通过setTexture函...原创 2018-04-26 23:06:11 · 2968 阅读 · 7 评论 -
qt 采用opengl渲染nv12视频到QSG并采用qml做显示
前面采用了离屏渲染,多线程的方式实现了nv12视频的播放,这次采用在QSG中渲染的方式实现,也就是在渲染线程中。原理同样是将图像纹理到一个FBO中,然后通过qt的接口带到QSG中进行显示。 采用opengl渲染并用qml显示的接口类为QQuickFramebufferObject,渲染线程会在刷新画面的时候调用其createRenderer()方法用于创建渲染,这里我留了一个设置视频...原创 2018-05-01 13:42:22 · 2136 阅读 · 0 评论 -
qt opengl 2d纹理数组
2d纹理数组就是用一个纹理数组类型的变量保存数个纹理,这样就避免了使用多个单个的纹理对象。这再批处理一系列相同大小的纹理时,非常有用,我这里用到的场景是在点精灵中使用纹理数组使得每个精灵纹理上不同的图案。我用的图片有16张,当顶点为16个时,效果如下可以看到刚好一个图案一个顶点,当顶点大于16个时如下可以看到,当大于纹理数组个数的顶点时,超出的部分会重重其中一个纹理,至...原创 2018-10-21 22:51:24 · 1260 阅读 · 1 评论 -
qt opengl 3d基本形状-圆柱
圆柱的顶面和底面都是一个圆形,其顶点坐标为(R*cos(弧度),y,R*sin(弧度))其中R分别为圆柱高的峰值,比如正放于中心时y就是h/2或者-h/2,h/2表示顶面,-h/2表示底面。其纹理坐标为(0.5-0.5*cos(弧度),0.5-0.5*sin(弧度)),法向量为垂直向上或向下的单位向量。 圆柱的侧面可以将其分割为n份,用GL_TRIANGLE_FAN绘制三角...原创 2018-10-27 23:49:36 · 2948 阅读 · 2 评论 -
在Qt中使用g++与nvcc混合编译
转载自https://blog.csdn.net/bisheng250/article/details/53611237 这次是通过在pro文件中添加QMAKE_EXTRA_COMPILERS添加额外编译完成,其它就是配置参数之类的.pro配置如下#-------------------------------------------------## Project...转载 2019-03-31 18:01:21 · 1407 阅读 · 0 评论 -
qt opengl 天空穹
制作天空穹与前面的球体一样,只是这里画了个半球;还有就是绕线方式不一样,因为摄像机是放在球的里面。我实现的效果如下 其渲染器实现如下:#ifndef BALLTEXTURERENDER_H#define BALLTEXTURERENDER_H#include <QOpenGLExtraFunctions>#include <QOpenGLText...原创 2019-01-06 22:17:58 · 754 阅读 · 2 评论 -
qt opengl 天空盒
这个效果比较简单,用一个立文体把我们要绘制的东西包起来即可,把摄像机的位置放到立文体内,这样就给人一个有天空,有陆地感觉。 我在这个工程中加入了以前的圆环体,其渲染器实现方法,可以查阅以前的文章。效果如下 我使用的是一个包含6个纹理图片的纹理数组,一次性把6个面都画好了,并完成了贴图。其渲染器实现如下:#ifndef BOXSHADER_H#define BOXS...原创 2019-01-01 22:33:33 · 1234 阅读 · 1 评论 -
qt opengl 雾特效
雾特效实现非常简单,加入雾化因子的计算;然后,把片元颜色和雾化因子加权就可以了。雾化因子计算方法如下: 我实现的效果如下:雾的颜色偏黄色。 大部分代码为上一节的内容,这里就不再做介绍了。只介绍雾的部分了在上一节的shader中加入uCamera参数,用于计算雾因子#version 330uniform mat4...原创 2018-12-23 23:33:36 · 808 阅读 · 4 评论 -
qt opengl 混合实现半透明
在二维绘图里面的半透明很简单,把alpha通道的值不设置为1或者255就能看见后面的物体;后面物体的清晰度根据设置值的大小来决定。而在opengl中要实现半透明效果也很简单,但相比二维绘图还是要麻烦一些了。 其方法为启用GL_BLEND混合功能,设置混合因子;这样opengl就会用混合因子将前、后两个物体颜色进行混合;这里有很多种混合方式,可以只显示前面物体,也可以只显示后...原创 2018-12-16 22:20:17 · 2612 阅读 · 0 评论 -
qt opengl 双面光照
双面光照是为了应对像茶壶这种有内壳的物体,如果只才用一个正面光照的话,那么内壳里面就是黑的,显得不真实。其实现原理是非常简单的;就是在前面光照的基础上,计算一次原法向量的反法向量光照参数,并通过gl_FrontFacing参数来使用正面光照的因子,不是gl_FrontFacing的使用反面光照因子,如此而已。 我做用的就是一个茶壶模型,效果如下。不采用双面光照时...原创 2018-12-07 22:01:31 · 910 阅读 · 0 评论 -
qt opengl 加载3d模型(obj格式)
和一般c++程序加载3d模型一样,解读出数据内容,再用一个常规的着色程序就可以了。我实现的效果如下,采用的免费模型 实现思路和前面的略有不同,就是把自己生成顶点、纹理、法线的过程变成从文件读取了。我的obj文件如下 mtllib C:\Users\Animation\Desktop\XNALara\data\dummy\Vanquish - Augmented ...原创 2018-11-30 00:19:11 · 27315 阅读 · 36 评论 -
qt opengl 贝塞尔曲线
opengl3维的贝塞尔曲线和平面的差不多,其实就是2维的贝塞尔曲线经过矩阵转换得到的。我们可以通过画多条贝塞尔曲线组合成一个漂亮的图形,我实现的是这样的 其渲染器实现如下#ifndef BEZIERRENDER_H#define BEZIERRENDER_H#include <QOpenGLShaderProgram>#include <QO...原创 2018-11-18 22:30:42 · 1384 阅读 · 0 评论 -
qt opengl 几何球
上一次画球的方法是用基于角度切分做的,缺点是两极会收缩,赤道会被拉伸。这次的几何球将介绍使用正二十面体来画球,这样球就会被均匀的分布。其求解方法为,将二十面体的每一条边的外接圆弧等量划分,以生成球面的顶点。纹理坐标则是将二十面体展开再将其划分后计算纹理坐标。几何球也有一个缺点就是部分位置可以显示不到图像,因为正二十面体不能将整个图像占满。我实现的效果如下 其实现较为复杂...原创 2018-11-11 22:15:22 · 954 阅读 · 6 评论 -
qt opengl 3d基本形状-螺旋管
螺旋管的做法和上一节的圆柱非常类似,就是在大圆径每转过一定角度时,将y值加上一定值。另个其纹理坐标生成的方法也和上一节一致。我做出的效果如下其渲染器实现如下#ifndef LUOXUANGUANRENDER_H#define LUOXUANGUANRENDER_H#include <QOpenGLShaderProgram>#include ...原创 2018-11-04 18:25:57 · 872 阅读 · 0 评论 -
qt opengl 3d基本形状--圆环
画圆环体的方法为,用一个小圆绕y轴一定半径转一周,这样就能形成一个圆环,其生成顶点的公式如下 其纹理坐标可以使用上一节圆柱的方法,将圆环体剪开,再水平剪开,就能还原为一个矩形。所以纹理坐标计算方式为,当大圆周每转过一定角度时,用这个角度除以360就能得到纹理x坐标,将小圆周角度除以360就能得到纹理y坐标。我实现的圆环体效果如下 其渲染器实现如下 ...原创 2018-11-03 18:41:36 · 2726 阅读 · 3 评论 -
qt opengl 3d基本形状圆锥
圆锥与上一节的圆柱很相似,其侧面的顶点坐标同样拆分成很多个小三角形,顶点位于一点,底面顶点和圆柱计算底面顶点的方法一样,都是(r*cos(弧度),-h/2,r*sin(弧度));底面顶点纹理坐标的计算是一样的,而顶点的纹理坐标就是(0.5,1)了;其法向量计算有所不同; 顶点的法向量为各个棱所在法向量的平均值,由于圆锥为对称图形,可知法向量为(0,1,0); 底面...原创 2018-10-30 23:52:22 · 1614 阅读 · 1 评论 -
qml实现离屏渲染视频(多线程渲染)
先看一个效果吧,由于这个抓图软件只有7.5fps,所以看其来很卡,但真实的程序运行起来比这个流畅多了。不能上传mp4,所以就弄了gif 我用的是Nvidia的硬解码SDK,并在其中加入了ffmpeg拉流或视频。解码出来的图片格式是nv12,这里我在shader里面实现的nv12转rgb的纹理,公式也是网上找的了。 看一下工程结构吧 要封装成qml的接口,要有opengl渲...原创 2018-04-23 23:20:19 · 5005 阅读 · 5 评论 -
QOpenglWidget 画动态矩形
使用的都是opengl的函数,只不过Qt再封装了一遍;在使用过程中有一些注意点,需要记下。我的头文件申明如下#ifndef GLDRAWWIDGET_H#define GLDRAWWIDGET_H#include <QOpenGLWidget>#include <QOpenGLFunctions>#include <QOpenGLBuffer>...原创 2018-03-27 09:46:20 · 4963 阅读 · 0 评论 -
使用QStyle高端定制弹出菜单 QMenu源码剖析(二)
有了前一篇的基础后,为了定制出个性化的QMenu。很容易就可以知道,需要自己实现一个QStyle;而具体是实现哪些部分呢,这就需要知道QMenu源码里面是调用QStyle的哪些接口来绘制的了;从QPushButton的paintEvent可以看出它是使用的drawControl(CE_PushButton...)画出来的。而QMenu我们可以使用一样的方法,QMenu的paintEvent原创 2017-12-03 13:46:31 · 4193 阅读 · 3 评论 -
qml 动态创建TableView
在qml应用开发中,经常会用到TableView来显示数据,而有时表格又不是固定的,需要根据不同的情况来变换表格的标题和内容。本次博客将会介绍怎样在qml中动态的创建TableView。原创 2017-10-08 10:29:35 · 11566 阅读 · 9 评论 -
使用QStyle 高端定制弹出菜单 QPushButton源码剖析(一)
这段时间研究了一下,qt的样式源码。同时也顺便自己做了一个样式。为了使大家能够看下去,先贴一贴效果。以上效果,看似好像用qss采用setStyleSheet()的方式也可以更改;但结果证明是不行的,采用qss的方式只能设置一下颜色,皮肤。而上面的菜单背景为透明,子菜单的的三角标志已经是圆了,所以靠样式表是不行的。QStyle接口实现了qt在各种不同平台之间的各种控件的基本外观,原创 2017-12-02 17:14:15 · 8775 阅读 · 0 评论 -
使用qml 创建带不重叠线框Table
使用qml可以使用TableView轻松的自定义出个性化的表格,但我发现使用TableView创建表格时,如果将itemDelegate设置为矩形框那么边框会有重叠,导致粗细不一样于是开始了研究,以下为代码示例创建带表格线的Table。Window { //窗体根对象 visible: true width: 640 height: 480 title:原创 2017-11-16 21:57:08 · 1405 阅读 · 2 评论 -
qt QPainter QPropertyAnimation 实现翻转
前段时间用QGraphics框架实现过qq的翻转效果,当时也提到过其实这个功能还可以用QPainter来实现,原因是因为QPainter同样支持QTransform的转换操作。另外一个知识点就是,QWidget窗体在paintEvent中可以通过QWidget::render(QPainter *,QPoint offset,QRegion sourceRegion)函数画出来,这样如果我原创 2017-12-07 22:07:18 · 3271 阅读 · 1 评论 -
QPainter 中的setWindow与setViewPort
近段时间一直研究,QPainter绘图以及使用QPainter绘制动画;直到今天看到一篇博客中使用QPainter绘图之后,仅仅只是在绘图前使用了一个setWindow函数就能让图形自适应;于是做了研究。首先我们不启动以上两个函数,添加如下代码 QPainter painter(this); painter.setRenderHint(QPainter::Antialia原创 2017-12-08 16:36:55 · 8535 阅读 · 0 评论 -
qt 下载地址
Qt 各个开源版本下载地址http://download.qt.io/archive/qt/原创 2017-11-15 22:25:29 · 218 阅读 · 0 评论 -
Qt各种采样率录音 录音到内存
近段时间了解了Qt的录音模块,Qt的录音模块分为QAudioInput输入,QAudioOutput输出。输入用来录音,输出用于播放。当然还用其它的QMediaPlayer、QAudioRecorder,这类控件封装的比较上层了;QAudioRecorder只能将数据录入到文件,QMediaPlayer是用于根据文件格式播放,一般用于音乐播放器中。由于项目需要的是16k采样率的wav音频文件,原创 2017-11-18 11:53:09 · 9901 阅读 · 7 评论 -
opencv视频采集封装qml
这段时间由于项目要做银行卡识别,所以在很早以前就开始了解opencv了。项目前期是用qml搭建的界面,所以这里最好能封装成qml控件。我们都知道qml是c++的扩展,opencv原本就是用c++实现的,所以这个并不是很难。qml绘图的基元素是Item,Item是由QuickItem实现的。所以这里我们应该从QuickItem入手。为简单易用,我写成了qml插件的形式。第一步:新原创 2017-10-15 16:29:47 · 2205 阅读 · 2 评论 -
QtQuick 日期滚动控件
在用QtQuick来编写时间滚动控件有两种方式,一种是用PathView设置路径点,另一种则用用ListView。本次采用ListView来制作时间滚动控件。ListView可以直接驱动鼠标滚轮和触屏点击,非常有效。Hightlight控件在delegate控件的下面,如果delegate控件的纯文字,那么文字会显示在Highlight控件的上面,展示出文字和选中的背景。如果deleg原创 2017-10-03 16:24:08 · 2809 阅读 · 0 评论 -
QtEmbedded-4.7.3-arm 移植、触摸屏移植、去掉鼠标箭头
一、到网站上面下载如下两个源码包.tar.gz(也可以是其它格式)。 ①tslib-1.4.tar.gz②qt-everywhere-opensource-src-4.7.3.tar.gz。二、移植tslib。 ㈠将下载好的两个文件放到虚拟机的某个目录,用tar –zxvf解压tslib-1.4.tar.gz。 ㈡cd tslib-1.4。原创 2017-10-03 14:59:20 · 1234 阅读 · 0 评论