opengl
文章平均质量分 58
wangzai6378
喜欢游戏;但却没有做游戏
展开
-
opengl 纹理贴图
由于项目需要做了一个opengl的纹理贴图,想想还是要记下来。opengl纹理贴图,不仅要指明3维坐标,还要指明纹理坐标,纹理坐标第始终是左下角为0,0右上角为1,1。每一张在电脑上面显示的图片的每个像素都可以按这个坐标定位。像这样先在3维坐标第中指定顶点,再指明纹理坐标,就可以完美的把图贴上去。在Qt中用QOpenGLTexture类可以轻松的完成。假如我们要把一到六的数字正方形图片原创 2017-10-04 15:36:30 · 884 阅读 · 1 评论 -
qt opengl 2d纹理数组
2d纹理数组就是用一个纹理数组类型的变量保存数个纹理,这样就避免了使用多个单个的纹理对象。这再批处理一系列相同大小的纹理时,非常有用,我这里用到的场景是在点精灵中使用纹理数组使得每个精灵纹理上不同的图案。我用的图片有16张,当顶点为16个时,效果如下可以看到刚好一个图案一个顶点,当顶点大于16个时如下可以看到,当大于纹理数组个数的顶点时,超出的部分会重重其中一个纹理,至...原创 2018-10-21 22:51:24 · 1346 阅读 · 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 · 3099 阅读 · 2 评论 -
qt opengl 3d基本形状圆锥
圆锥与上一节的圆柱很相似,其侧面的顶点坐标同样拆分成很多个小三角形,顶点位于一点,底面顶点和圆柱计算底面顶点的方法一样,都是(r*cos(弧度),-h/2,r*sin(弧度));底面顶点纹理坐标的计算是一样的,而顶点的纹理坐标就是(0.5,1)了;其法向量计算有所不同; 顶点的法向量为各个棱所在法向量的平均值,由于圆锥为对称图形,可知法向量为(0,1,0); 底面...原创 2018-10-30 23:52:22 · 1705 阅读 · 1 评论 -
qt opengl 3d基本形状--圆环
画圆环体的方法为,用一个小圆绕y轴一定半径转一周,这样就能形成一个圆环,其生成顶点的公式如下 其纹理坐标可以使用上一节圆柱的方法,将圆环体剪开,再水平剪开,就能还原为一个矩形。所以纹理坐标计算方式为,当大圆周每转过一定角度时,用这个角度除以360就能得到纹理x坐标,将小圆周角度除以360就能得到纹理y坐标。我实现的圆环体效果如下 其渲染器实现如下 ...原创 2018-11-03 18:41:36 · 2870 阅读 · 3 评论 -
qt opengl 3d基本形状-螺旋管
螺旋管的做法和上一节的圆柱非常类似,就是在大圆径每转过一定角度时,将y值加上一定值。另个其纹理坐标生成的方法也和上一节一致。我做出的效果如下其渲染器实现如下#ifndef LUOXUANGUANRENDER_H#define LUOXUANGUANRENDER_H#include <QOpenGLShaderProgram>#include ...原创 2018-11-04 18:25:57 · 928 阅读 · 0 评论 -
qt opengl 几何球
上一次画球的方法是用基于角度切分做的,缺点是两极会收缩,赤道会被拉伸。这次的几何球将介绍使用正二十面体来画球,这样球就会被均匀的分布。其求解方法为,将二十面体的每一条边的外接圆弧等量划分,以生成球面的顶点。纹理坐标则是将二十面体展开再将其划分后计算纹理坐标。几何球也有一个缺点就是部分位置可以显示不到图像,因为正二十面体不能将整个图像占满。我实现的效果如下 其实现较为复杂...原创 2018-11-11 22:15:22 · 995 阅读 · 6 评论 -
qt opengl 贝塞尔曲线
opengl3维的贝塞尔曲线和平面的差不多,其实就是2维的贝塞尔曲线经过矩阵转换得到的。我们可以通过画多条贝塞尔曲线组合成一个漂亮的图形,我实现的是这样的 其渲染器实现如下#ifndef BEZIERRENDER_H#define BEZIERRENDER_H#include <QOpenGLShaderProgram>#include <QO...原创 2018-11-18 22:30:42 · 1450 阅读 · 0 评论 -
qt opengl 加载3d模型(obj格式)
和一般c++程序加载3d模型一样,解读出数据内容,再用一个常规的着色程序就可以了。我实现的效果如下,采用的免费模型 实现思路和前面的略有不同,就是把自己生成顶点、纹理、法线的过程变成从文件读取了。我的obj文件如下 mtllib C:\Users\Animation\Desktop\XNALara\data\dummy\Vanquish - Augmented ...原创 2018-11-30 00:19:11 · 27771 阅读 · 36 评论 -
qt opengl 双面光照
双面光照是为了应对像茶壶这种有内壳的物体,如果只才用一个正面光照的话,那么内壳里面就是黑的,显得不真实。其实现原理是非常简单的;就是在前面光照的基础上,计算一次原法向量的反法向量光照参数,并通过gl_FrontFacing参数来使用正面光照的因子,不是gl_FrontFacing的使用反面光照因子,如此而已。 我做用的就是一个茶壶模型,效果如下。不采用双面光照时...原创 2018-12-07 22:01:31 · 962 阅读 · 0 评论 -
qt opengl 混合实现半透明
在二维绘图里面的半透明很简单,把alpha通道的值不设置为1或者255就能看见后面的物体;后面物体的清晰度根据设置值的大小来决定。而在opengl中要实现半透明效果也很简单,但相比二维绘图还是要麻烦一些了。 其方法为启用GL_BLEND混合功能,设置混合因子;这样opengl就会用混合因子将前、后两个物体颜色进行混合;这里有很多种混合方式,可以只显示前面物体,也可以只显示后...原创 2018-12-16 22:20:17 · 2718 阅读 · 0 评论 -
qt opengl 雾特效
雾特效实现非常简单,加入雾化因子的计算;然后,把片元颜色和雾化因子加权就可以了。雾化因子计算方法如下: 我实现的效果如下:雾的颜色偏黄色。 大部分代码为上一节的内容,这里就不再做介绍了。只介绍雾的部分了在上一节的shader中加入uCamera参数,用于计算雾因子#version 330uniform mat4...原创 2018-12-23 23:33:36 · 834 阅读 · 4 评论 -
qt opengl 天空盒
这个效果比较简单,用一个立文体把我们要绘制的东西包起来即可,把摄像机的位置放到立文体内,这样就给人一个有天空,有陆地感觉。 我在这个工程中加入了以前的圆环体,其渲染器实现方法,可以查阅以前的文章。效果如下 我使用的是一个包含6个纹理图片的纹理数组,一次性把6个面都画好了,并完成了贴图。其渲染器实现如下:#ifndef BOXSHADER_H#define BOXS...原创 2019-01-01 22:33:33 · 1324 阅读 · 2 评论 -
qt opengl 天空穹
制作天空穹与前面的球体一样,只是这里画了个半球;还有就是绕线方式不一样,因为摄像机是放在球的里面。我实现的效果如下 其渲染器实现如下:#ifndef BALLTEXTURERENDER_H#define BALLTEXTURERENDER_H#include <QOpenGLExtraFunctions>#include <QOpenGLText...原创 2019-01-06 22:17:58 · 795 阅读 · 2 评论 -
qt opengl 3d纹理
3d纹理在现实世界中并不存在,也不能用图片工具查看。可以理解为一个实心的立文体数据块,可以通过,x,y,z坐标获取对应点的纹素(像素)。 这里我学习了一个梯子的3d纹理,在实现3d纹理的同时,在其中加入了光照,效果如下 其渲染器实现如下#ifndef TEXTURE3DRENDER_H#define TEXTURE3DRENDER_H#include &l...原创 2018-10-20 22:44:47 · 2013 阅读 · 1 评论 -
qt opengl 点精灵
点精灵就是在opengl中画点,在画点的同时指明点的大小,这样点就会变成一个实心的矩形(指明GL_POINT_SMOOTH可能不正确,大体是这个;就会是一个圆)。画每个矩形时,给每个矩形加载一个纹理图,就变成了点精灵;每个纹理坐标从内建变量gl_PointCoord获取。50个随机点32*32效果图如下 其渲染器实现如下#ifndef POINTSPRINTRENDER_...原创 2018-10-14 21:35:54 · 1173 阅读 · 2 评论 -
qt 使用opengl显示yuv实时视频流
我使用的是ffmpeg拉取实时流,并解码为yuv420p。然后用opengl转成rgb32渲染到qt中显示。用ffmpeg解码实时流和网上一样。参考:https://blog.csdn.net/su_vast/article/details/52214642进行修改和增加。 av_register_all(); avformat_network_init(); AV...原创 2018-03-25 09:48:04 · 20508 阅读 · 44 评论 -
Qt播放多路视频的理解
之前很久就考虑过这个问题,为什么视频在界面刷新那么快,而Qt的界面依然很流畅。在做过多路视频播放后,接触了SDL播放视频,自已也实现了opengl播放视频,也使用过Qt的MediaPlayer播放视频。对比效果终于有结果了,原来是视频这种高频率的刷新本来就有能用widget这种QPainter来画的,是使用的GPU渲染。以下是我对多路视频播放实践的一些效果对比。 1、SDL:(以下仅...原创 2018-04-01 14:03:35 · 6224 阅读 · 4 评论 -
QOpenglWidget 画动态矩形
使用的都是opengl的函数,只不过Qt再封装了一遍;在使用过程中有一些注意点,需要记下。我的头文件申明如下#ifndef GLDRAWWIDGET_H#define GLDRAWWIDGET_H#include <QOpenGLWidget>#include <QOpenGLFunctions>#include <QOpenGLBuffer>...原创 2018-03-27 09:46:20 · 5064 阅读 · 0 评论 -
qml实现离屏渲染视频(多线程渲染)
先看一个效果吧,由于这个抓图软件只有7.5fps,所以看其来很卡,但真实的程序运行起来比这个流畅多了。不能上传mp4,所以就弄了gif 我用的是Nvidia的硬解码SDK,并在其中加入了ffmpeg拉流或视频。解码出来的图片格式是nv12,这里我在shader里面实现的nv12转rgb的纹理,公式也是网上找的了。 看一下工程结构吧 要封装成qml的接口,要有opengl渲...原创 2018-04-23 23:20:19 · 5155 阅读 · 5 评论 -
qt 采用opengl渲染nv12视频到QSG并采用qml做显示
前面采用了离屏渲染,多线程的方式实现了nv12视频的播放,这次采用在QSG中渲染的方式实现,也就是在渲染线程中。原理同样是将图像纹理到一个FBO中,然后通过qt的接口带到QSG中进行显示。 采用opengl渲染并用qml显示的接口类为QQuickFramebufferObject,渲染线程会在刷新画面的时候调用其createRenderer()方法用于创建渲染,这里我留了一个设置视频...原创 2018-05-01 13:42:22 · 2251 阅读 · 0 评论 -
qml实现离屏渲染视频(多线程渲染) ----二
上次说完了在VideoThreadRender类中实现几个重要类之间的关系及通信,搭建好了一个初始化可以运行并调用的流程环境;这篇主要介绍后半分的子线程及解码 VideoThreadRender类中会实例TextureNode、RenderThread这两个类;TextueNode主要是将RenderThead类渲染好的视频帧的纹理id送到渲染线程中去(主要通过setTexture函...原创 2018-04-26 23:06:11 · 3117 阅读 · 7 评论 -
ffmpeg opengl 硬解视频并使用opengl在qt中显示nv12
之前做过用ffmpeg解码视频然后在qt中用opengl来显示yuv数据,这次介绍一下ffmpeg硬解的方法。在网上找的资料大多数是ffmpeg软解的,而且解码后的格式都是yuv;我们知道nvidia显示视频解码后的格式是NV12的,那么怎么在代码中实现呢? 在后来看见别人使用ffplay工具播放视频的时候发现可以指明decoder来解码视频,于是通过在360搜索中找到了ffmpeg中查...原创 2018-06-03 16:22:51 · 10048 阅读 · 12 评论 -
opengl 投影、摄像机、矩形转换与纹理,在Qt中实现
3维空间的物体比2维更真实,更酷炫;其变换大家都知道是通过矩阵转换来的;可具体到底是怎样转换的呢,网上大多都帖的一些理论,本文给出一个示例供大家学习。 本示例在Qt中显示,可以接收用户输入。同样也是开发opengl程序,步奏当然一样的。我这里将渲染器分离了出来以便能复用在Qt中的显示我使用的是QOpenglWidget。 显示部分申明如下...原创 2018-09-08 14:34:18 · 1108 阅读 · 1 评论 -
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 · 2079 阅读 · 2 评论 -
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 · 3979 阅读 · 2 评论 -
qt opengl 环境光、散射光、高光、定向光与每片无渲染
球是学习光照的很好参照物,也是因为如此上一篇更新了一个球的文章。这章利用上一章的成果,学习opengl中的各种光照效果以及在每片元渲染。本章主要介绍在qt中如何实现这些,将这些效果集成到qt的开发生态里面 先看一下效果 主框架和上一篇的球一样,不一样的是shader部分,两个球的示例工程cpp部分有一些变化,窗体、渲染器的声明与实现与前...原创 2018-09-22 20:08:52 · 1584 阅读 · 0 评论 -
qt opengl mipmap纹理
mipmap纹理适用于创建地形,墙壁等需要使用GL_REPEAT重复纹理拉伸的地方;还有就是应用于需要同一幅纹理,但是呈现的大小不同。 使用mipmap纹理可以使得近处的景物清晰,远处的景物模糊,符合现实生活情况。先看看示例效果 小窗口效果如下:大窗口效果如下:将地板也设置为mipmap的效果如下: 由此,我们可以看出,使用mipmap纹理方式,...原创 2018-10-06 22:35:28 · 1053 阅读 · 0 评论 -
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 · 662 阅读 · 0 评论 -
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 · 1853 阅读 · 1 评论