高真实感复杂光照环境光照场景模拟-软件设计方案
作者:互联网
前言:
上一次笔者对高真实感的复杂光照进行了系统的需求设计和分析,给出了相应的用例图和类图进行说明。这次将对软件设计方案进行详细的阐述。
一、软件设计方案
1.软件架构
本项目是基于UE4的,采用的是“MVC”架构。将整个工作流程划分成了三个层次,分别是Model,View,Controller。
Model主要指的是Actor,Mesh,Material,Level,Resource等各种数据元素的内存表示。
Controller可以是各种算法,包括渲染算法,AI寻路,物理模拟等等。
View指的游戏的UI,可以是手柄的输入,也可以是与玩家直接交互的载体。
本项目主要是在移动渲染管线中实现延迟渲染,并且在Shader上有一定的表现能力(海水,风场等)。在Model层主要是GBuffer,VertexBuffer,ZBuffer,Texture,Lighting以及各种细化的RHI资源。Controller层则是实现延迟渲染算法,主动提交切换Render Target的Command给Render Thread,放入CmdList。在之后异步执行RHICommandList中的命令,对所有的渲染操作全部渲染到指定的GBuffer中,对ZBuffer不符合条件的片段,不予渲染,实现延迟渲染。View层则更注重相应Shader的表现。
2.设计模式
本项目主要是使用类模式中的模板方法模式 + 命令模式。
模板方法模式最大的特点是可以直接继承已有的父类特征,不需要书写过多的代码就可以实现相应的效果。缺点就是耦合性太强,如果父类做出了某些改变,子类也要相应变化。但是在UE4已经经过了很久的演变,并且它的架构已经十分成熟了,不存在太大的变化。而且继承自UOjbect,不仅可以提供诸如反射,GC,元数据,序列化等特性。还可以实现父类已定义好的接口,实现类接口的统一化。
选择命令模式则更出于对UE4的MVC架构以及三大Thread工作的机制的考虑。UE4的三大Thread:Game Thread,Render Thread,RHI Thread,为了不干涉各自的模块工作。采用的是异步工作方式,类似Windons下的事件机制。例如:当Render Thread有某个渲染Task,会生成很多的RHI Command,但Render Thread并不会直接跨模块的去执行RHI Command,而是将这些命令放入到RHI Command队列中。同时在需要执行的时候下发一个Task,然RHI Thread依次执行RHI队列中所有的Command。这样做的做法有很多的优点,显而易见的有两点:
1)模块之间的划分十分清晰并且耦合性很低
2)十分符合“开闭原则”,我们不需要去重写Thread的工作方式,只需要实现自己的命令类,在合适的地方放入相应的队列即可。
3.接口API
二、视图描述
1.依赖视图
2.泛化视图
3.实现视图
4.执行视图
三、运行环境
基本环境:
Android移动端
支持OpenglES
推荐环境:
内存:4GB
CPU:高通骁龙636以上
四、技术选型
C++开发,UE4移动开发,计算机图形学开发,OpenglES,HLSL,延迟渲染
五、核心工作机制
延迟渲染的核心工作机制有以下三点:
1.生成自定义命令类型,该命令完成下列工作:请求相应的RHI Resource(g-buffer),对RHI Resource进行跟踪和绑定,Push到Render Thread Task队列中
2.生成相应的渲染命令,在执行RHI Command队列中的命令时。令所有的命令先跟z-buffer对比,并且如果不符合条件,予以丢弃。
3.对g-buffer进行像素采样,并结合光照,生成相应的RHI Command。
海水和风场等效果实现的核心工作机制则更取决于HLSL Shader的编写。
致谢
标签:Render,Thread,渲染,软件设计,视图,RHI,Command,真实感,光照 来源: https://www.cnblogs.com/lirenwei/p/14208421.html