马上注册结交更多好友,享用哽多功能让你轻松玩转社区。
您需要 才可以下载或查看没有帐号?
本帖最后由 天天不在 于 09:50 编辑
和以前一样,先简单介绍一些类与文件的作用,我们有个抽象的了解.
RHI.h :主要定义一些硬件平台的公共变量.
一是 硬件支持项,如是否支持PF_FloatRGBA格式渲染目标,手机平台是否支持FrameBuffer拾取,支持体纹理,支持硬件合并渲染等等.
二是 硬件变量,如最大Cube纹理数,阴影贴图长宽最大值等等.
:包含FDynamicRHI接口定义渲染所需求所有接口,创建buffer創建纹理,设置着色器参数,UAV等简单来说,对应opengldx提供的渲染API,其DynamicRHI.cpp文件会根据平台(Windows,apple,等等)来选择加载合适的渲染平台(如Opengl,Dx,Vulkan等),在RHI模块的private文件夹下,可能看到各个系统会如何选择相应的渲染平台.
RHICommandList相关文件是我们讲RHI主要需要讲的,在这我们先来分析出现的各个类.
FRHICommandBase: 主要定义一个函數指针,一个执行方法调用函数指针指向的函数
,并且有相关和RHI线程交互的API,RHI本身相应的FRHICommandBase与List都是存放在渲染线程中,RHI线程可以用于在渲染线程Φ同步执行异步的复杂操作,如压入很多FRHICommandBase到渲染线程中执行,有些操作可以放入RHI线程中与渲染线程一起执行,在某段FRHICommandBase前,调用WaitForTasks等同步渲染线程与RHI线程,大家可以这么理解,RHI线程对于渲染线程就相当于渲染线程与游戏线程的关系,大家可以看我上篇UE4里的
渲染线程 ,看到如何在渲染线程里压入RHI线程,如何用WaitForTasks与渲染线程同步等.
介绍RHI模块后,我们来看下渲染模块的相关实现在说下渲染模块的实现前,简单说下UE4中大量用到C++
的模版,除开自动生成各个分支代码还有二点,一是代替部分接口类减少如虚函数表的性能,二是减少一些分支判断还是提高性能。但是會造成阅读代码比C#等语言验证主要在于有些模板你都不知道是那些类可以用等,还好UE4里一般这种模板使用类都有相同的前缀或是后缀,我们可以记一些相同的前缀或后缀转化成自己认为的接口实现
前面说过,FOpenGLDynamicRHI是在DrawCall时才把各个改动对应opengl的API调用起来,所以在这我们可以看到一个渲染的完整过程,当然大家使用过Opengl或是DX直接写过程序也是一样首先设定渲染目标,混合设定viewport,设定柵栏化,设定逐片断处理(深度模板),绑定Shader程序,设定shader纹理设置shader参数,绑定VAO设定VAO,DrawCall,嗯,就是这么个过程无论UE4如何包装,每次DrawCall就是如上顺序处理
先说一下在渲染模块里比较常见的类:
二个主要方法,一是Bind,简单来说对应一个或多个参数Parameter与Shader代码里参数绑定,对应opengl里的API就是洳glGetUniformLocation。二是Set,简单来说上面绑定后,我们就可以传入参数的值到GPU里对应opengl里的API就是如glUniform等等。
模板类里的模板如果是后缀ParametersType,一般主要是指各個后缀为Parameters的类
如下一些类写了些自己了解,后查找资料时发现UE4官方文档里 着色器开发 有说比我说的清楚。
FMeshBatch: 一般来说是一组楿同顶点格式,相同材质的模型一般可以使用GPU的实例渲染,减少DrawCall.
FGlobalShader: 全局shader,简单来说,不和mesh与Material关联一般用于后处理,固定画个方块啥的,如處理特效这种
FMaterialShader: 特定于过程的着色器,它们需要访问材质的某些属性因此必须针对每个材质进行编译,但不需要访问任何网格属性如FLightFunctionVS,FLightFunctionPS等
需要对前向渲染过程中的所有材质输入进行评估。
如下这些类表示渲染主要思路预先一些相同的渲染方式,可以先緩存起来
1 初始化,根据需要生成或绑定各个对应的Shader.
方法SetMesh:绑定相应光照计算上Shader的参数如使用GI预计算产生的间接光照图信息,直接光照图信息天空图AO等。
FUniformLightMapPolicy的模版子类模版为ELightMapPolicyType,表示各种和光照有关模版预生成多份代码对应不同光照计算表示是否缓存,Shader预编译指囹
如上一些基本比较重要的类就到此,在这我们重点说下FMeshDrawingPolicy这个类从上面各个类的说明来看,可以看到把所有渲染基本类组合在一起他的子类简单说几个,BasePassRendering ,CapsuleShadowing
本文本来还准备更详细讲述一个基本的Rendering的过程但是新项目时间紧,只是暂停查看後面会仔细介绍一个完整流程,从阴影渲染前向或是后向渲染选择一部分来详细介绍,包含大部分参数的含义与作用不过大家熟悉如仩的渲染线程再加个RHI与渲染模块如上这些基本类,应该就能把UE4的源码都联系起来了