位置: 编程技术 - 正文

Qt新渲染底层Scene Graph研究(三)(qt渲染引擎)

编辑:rootadmin
Qt新渲染底层Scene Graph研究(三)

推荐整理分享Qt新渲染底层Scene Graph研究(三)(qt渲染引擎),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:qt渲染机制,qwebengineview渲染,qml图形渲染,qml图形渲染,qml图形渲染,qt opengl渲染,qt opengl渲染,qt3d渲染,内容如对您有帮助,希望把文章链接给更多的朋友!

上一篇文章介绍了Qt Quick和SceneGraph的一些理论上的内容。这也是我最新的研究成果。接下来我要介绍一下如何使用Scene Graph来制作一些好玩的效果。这也是我进行一次SceneGraph的尝试。

我的目标是希望在Scene Graph这一套渲染框架下实现一个带有纹理的立方体,并且旋转。花了几天,虽然不是那么满意,但是已经告一段落了。

蒋彩阳原创文章,首发地址: 本文难度偏大,适合有经验的同行进行交流。

首先,对比C&#;&#;,QML这边的代码稍微简单一些,那么从最简单开始说起吧。

一个普通的窗口,背景是橙色的,在上面显示了我们的Cube。我希望我的Cube沿着一个轴进行旋转,所以设定了NumberAnimationon rotateAngle。此外,我希望每隔三秒Cube更换纹理,所以设定了一个Timer来更换纹理。每一个Item都有transform成员,它表示Item经过什么样的转换,目前transform支持Translation、Rotation以及Scale,有人想要让MouseArea成为不规则的,其实如果官方提供了Shear这个类,那么就更方便了。

我们看到的QML代码仅仅是表象,其实在幕后,是一个较为复杂的C&#;&#;类:TexturedCube。下面我们再来看看TexturedCube.h的内容:

在头文件我首先定义了一个方便的宏,包含了属性:Getter-Setter,以及Notifier。和QQuickItem的大多数属性一样,一旦某个属性发生了改变,那么就要发出改变的信号,也就是我们称的notifier,并且要告诉QQuickItem进行下一次更新。这里的update()并不是立即更新的意思,而是告诉QQuickItem在下个循环周期之前调用updatePaintNode()这个函数。接下来我们看看TexturedCube.cpp文件。

Qt新渲染底层Scene Graph研究(三)(qt渲染引擎)

经过实践,要渲染一个带六个纹理面的立方体,需要个顶点。所以我设定了一个宏VERTEX_COUNT,&#;是。此外,QtScene Graph默认的渲染是AoS(Array of Structure),这一点和Direct3D9一样的,所以我们需要定义自己的顶点&#;式。structTexturedCubeVertex里面包含了顶点位置以及纹理坐标(又称uv坐标)。在TexturedCube的构造函数,我们通过设定setFlag(ItemHasContents, true );来告诉Scene Graph,此项目有内容,需要调用updatePaintNode()函数,然后当source改变的时候,为了调用相应的处理函数,需要连接处理器。这里的核心就是updatePaintNode()函数。这个函数的作用类&#;于一个中转站,火车从远处来,进站,如果有什么变化,比如说上下客,那么车内的人员也会变化。最后火车驶离车站,开往下一个目的地。此函数颇有这一个意思。第一次,我们发现oldNode指针为空,那么我们创建几何体、材质和纹理。否则oldNode指针不为空,我们认为这不是第一次渲染了,我们取出它的几何体和纹理。如果纹理路径发生了改变,那么我们也需要进行重新载入,通过source2Path()来解析路径。这里可能没有Qt源码那么复杂,因为Qt里面如果来自网络,即以http协议开始的,那么需要调用QQmlEngine里面的QNetworkAccessManager,此外QtQuick的Image类还有cache功能,我们这个例子没有那么复杂,能根据source的改变同步改变纹理内容就可以了。

由于Qt的SceneGraph的灵活性,我们需要使用许多类一起写作才能按照我们的要求创建几何体。首先我们要创建QSGGeometry::Attribute的一个数组,以便告诉SceneGraph和OpenGL,我们需要什么样的顶点缓存。注意这个数组绝对不能在栈上,因为要在updatePaintNode()函数以外用到这个数组,因此我标记为static类型。随后,我们需要QSGGeometry::AttributeSet结构的对象标识我们所需要的属性。

在设置上、下、左、右、前、后面的顶点位置坐标以及纹理坐标之后,需要对坐标进行一次适配。因为QQuickItem毕竟是一个矩形的控件,所以指定了width和height之后,boundingRect()就有相应的&#;了。这里需要说明的是z&#;。如上面几篇文章所述,要将坐标&#;限制在x∈[0,Screen.width],y∈[0,Screen.height],z∈[0,stackLayer](其中stackLayer为Item堆叠的层数),这样才能在视口中看见。最后是Qt的source2Path()方法,用来处理路径的。

main.cpp文件也比较简单,这里我只介绍主要部分:

最后就是效果了。在Windows下的效果如下图所示:

大家可能觉得奇怪,本来不是设置的是立方体吗?怎么看起来像一个面片?其实如果设置QSG_VISUALIZE=overdraw的话,我们就明白了。

其实是有一个立方体显示的,只是因为视立方体的范围是x∈[0,Screen.width],y∈[0,Screen.height],z∈[0,stackLayer](其中stackLayer为Item堆叠的层数),在这种情况下,左右和上下共四个面被挤压得很小,所以我们几乎感觉不到它们的存在。

后记:也正是因为这样的原因,让我认识到,在Scene Graph下绘制出3D模型有些不合适。由于z和视口限制,所以让我们看3D对象都觉得是扁平一片。可能我半年前制作的示例更有实用价&#;吧。

vs配置OpenGL SuperBible5环境 刚拿到opengl编程宝典第五版,打算配置好书中源码的编程环境,折腾了一天,终于弄好了,现在记录下完整的过程:参考博客:

3D网络游戏开发学习书籍概览 这篇文章是接着前三篇文章学好C要阅读的书籍和学好Windows编程要看的书籍以及黑客修炼,反击黑客,安全问题要阅读的书籍的基础上而写的,如果想了

OpenGL ES 设置透明度不能【双面透明】的问题解决办法 spanstyle=font-family:Arial,Helvetica,sans-serif;background-color:rgb(,,);今天用OpenGLES绘制一个立方体,在立方体内部打上小孔,也就是在内部画上圆柱体/span立

标签: qt渲染引擎

本文链接地址:https://www.jiuchutong.com/biancheng/369655.html 转载请保留说明!

上一篇:OpenGL选择-拾取机制(转载自zwqxin)(opengl获取鼠标位置)

下一篇:vs2012配置OpenGL SuperBible5环境(vs2010配置opengl)

  • 小规模纳税人合理避税
  • 购买车位的税费是多少钱
  • 小规模纳税人企业所得税2023
  • 企业所得税汇算清缴退税怎么做账
  • 没有申报个税的工资怎么入账
  • 跨年的预收账款怎么记账
  • 对公账户可以支付给个人吗
  • 银行理财怎么做才能赚钱
  • 支付境外特许权所得需要交什么税
  • 承兑到期没兑现怎么处理
  • 现金短缺溢余求借多少短期借款?
  • 有限合伙企业分红个人所得税
  • 不同外币之间的折算
  • 没有房产证应该找谁
  • 个人所得税手续费返还账务处理
  • 个人所得税0申报操作流程
  • 接受实物投资的增值税会计核算方法
  • 商标转让增值税税目
  • 支付的专家费怎么入账
  • 土地增值税计算公式及举例
  • 进的货没有入库怎么处理
  • 记账凭证保存年限2019
  • 收到收入怎么做分录
  • 公司工资分两次发放算逃税吗
  • 费用应计入管理费用的有
  • 收到客户赔偿款计入什么科目
  • 出售房产会计账务处理
  • 期初摊余成本是初始入账价值吗
  • 临时股东大会的召开情形
  • 广告费和业务宣传费税前扣除基数
  • 可以转增资本的有哪些科目
  • pavsrv51.exe - pavsrv51是什么进程 有什么用
  • 无形资产的界定及特点
  • 盈余公积转增资本会计科目
  • 如何更改饿了么配送费
  • php use function
  • vue2+element-plus 密码校验及动态校验
  • 命令行查看ip地址
  • 核定征收的企业注销需要缴纳个人所得税吗
  • 一天看小说十几个小时的人
  • 明细分类账户定义
  • php读取xml文件
  • 正在加工的在产品是什么科目
  • css怎么调用
  • 3d检测软件
  • 转出多交增值税账务处理
  • 发票货物或应税劳务名称怎么填写
  • 电子口岸报关单在哪下载
  • 未经审计情况说明怎么写
  • 周转材料二级科目有哪些
  • react 16新特性
  • 织梦艺嫣跳舞
  • 营改增小规模纳税人认定标准
  • 新事业单位会计制度下固定资产的核算
  • sql2008混合模式
  • 普通发票开具的管理是?
  • 存货周转次数越高好还是越低好
  • 设计费勘察费计入固定资产吗
  • 手工账本应付账款怎么做
  • 对方开商业承兑汇票给我们
  • 专用发票冲红有时间有时间限制吗
  • 招待费发票怎么做分录
  • 请演员的费用账务处理
  • 个体户银行开户所需资料
  • 企业利润分为四个方面
  • 企业收付实现制还是权责发生制
  • 关于发票丢失的处罚
  • 工业产值是指
  • 租用办公楼的装修协议
  • 文本效果设置在哪
  • Win7 64位旗舰版系统打开应用程序提示“发生未知的软件异常0xc06d007e”的解决方法
  • 怎么禁止p2p下载器
  • win7系统自带游戏在哪
  • win7系统电脑开热点
  • 移动端网页开发技术
  • node创建服务
  • 增值税普通发票需要交税吗
  • 重庆黄桷垭在什么地方
  • 年终奖发4万扣多少税
  • 德勤 税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设