十月 2023¶
Qt 3D UI
整了个花活0.0,在没改Qt源码的情况下,可以很轻松地将一个QWidget进行3D变换。 原理:
-
通过前后两个四边形区域算出中心投影变换矩阵
-
利用中心投影变换矩阵在QApplication中重新映射鼠标位置相关的事件
-
通过QRHI和GraphicsEffect的机制,结合变换矩阵,重新绘制图像
-
根据目标四边形的位置,自动伸缩绘制区域 目前还有一些问题:
-
弹出窗口的位置有偏差
-
焦点事件也对不上
不过现在能做好多有意思的东西了~
开放世界杂谈
开放世界(Open World) 是一个玩家可以在自由地实现目标的虚拟世界,而不是具有更线性和结构化游戏玩法的世界。其中的著名游戏包括《塞尔达传说》、《侠盗猎车手》、 《荒野大镖客》 、《上古卷轴》、《我的世界》,《艾尔登法环》...
开放世界的重点在于开放性,因此开放世界游戏一般在在内存上会动态且无缝的加载游戏世界,这类游戏的主要吸引力在于为玩家提供自主权,使得游戏进程可以按玩家预期的顺序和方式来推进,但不是在游戏中可以做他们想做的任何事情(这在当下的计算机技术几乎是不可能的)。
——摘自 《Wiki - Openg World》
关于开放世界的关卡设计,这里有一些非常优秀的文档:
笔者是一名入行不久的引擎工程师,本文主要用于记录和讨论,将以程序开发的视角去剖析开放世界,一些想法和思考方式可能过于片面,欢迎大家指正。
国庆内卷
国庆疯狂卷了5000+行代码0.0
把RenderGraph重构了一遍,之前的RenderGraph仅仅是实现了一个便于构造依赖图的结构
重构之后增加了以下功能:
- 异步执行渲染组织逻辑,借助QObject的ThreadQueue机制来完成线程间的数据通信。
- 在RenderGraph中对资源进行了封装,该层面的代码并不直接创建RHI资源,每帧的setup阶段只是创建资源描述,在complie阶段会对资源进行绑定和重建,可以通过资源池对无引用的资源进行复用,并调整了编辑器上的预览视图。
- 封装PrimitiveRenderProxy,主要用于搭建MeshPass(BasePass)中的渲染结构,它可以复用几何数据和流水线结构,来达到外部调用 drawAllMesh(OverrideFragmentShader, OverrideUniformBuffer,OverridePipelineState)的效果,目前用于鼠标的点选机制,后续将用于ShadowMap,屏幕空间反射效果的实现。
明天看下能不能把文章给赶完,忙不过来就得等到下周,弄完这篇文章我可能要跳票了~