RHI即RenderHardwareInterface, 即渲染硬件接口, 是UE为实现跨平台而实现的一套API. 每个RHI接口都为OpenGL, Vulkan, DX11等做了不同的实现. 在引擎初始化时使用的绘图接口就已经确定, 引擎就可以确定RHI所使用接口的版本.

  针对于不同的绘图API(DX11, DX12, OpenGL, Vulkan乃至于Metal), 会有不同的FRHICommandContext类对RHI方法做不同的实现(以RHIDrawIndexedPrimitive方法为例):

              

  作为RHI使用者, 我们不必关心具体到每种绘图API的实现差异, 只需要关注RHI这一抽象绘图接口. 可以想象在这么多绘图API中实现相似的各种效果需要多大的开发与维护成本...

  而创建RHI对象, 不仅需要关注绘图接口, 对于不同的运行系统也会需要有不同的实现. 对于方法PlatformCreateDynamicRHI(), 也会有如下方法:

  与想象中的不同, 并没有抽象出一套对应不同平台的接口来做RHI创建方法的不同Implementations, 而是会有这样几个全局方法.

  看到这几个方法的时候我是懵逼的(菜是原罪...), 这么几个同名全局方法, 是怎么通过编译的, 又是怎么makefile的?

  一顿思考之后我觉着肯定是在Build的时候排除了这几个.cpp, 之后针对不同平台#include不同的PlatformDynamicRHI.cpp来获取到对应的实现体. 创建一个新工程来测试:

                        

  在AllCppTest_A/B.cpp中有全局函数char Test();的不同实现, 对应会返回a/b. 在main.cpp中:

#include "pch.h"
#define A 1
#if defined A
#define Header "AllCppTest_A.cpp"
#include Header
#else defined B
#define Header "AllCppTest_B.cpp"
#include Header
#endif
#include <iostream> int main()
{
std::cout << Test()<< std::endl;
system("pause"); }

  选择性#include不同的.cpp文件. 这样VS在编译时会排除掉两个源文件, 而在编译main.cpp时, 宏Header会被替换为对应的Test源文件名, 对应源文件被#include, 对应的Test();函数实现会被编译.

  上图对应的输出:

                              

  这也就是条件式编译....

  折腾了一晚上, RHI没看成补了节Cpp...Cpp底子还是不行啊...不禁感叹还是要多看书...整天闷头敲码不可取...

UE4 RHI与条件式编译的更多相关文章

  1. UE4 RHI与Render模块简解

    UE4中的RHI指的是Render hardware interface,作用像Ogre里的RenderSystem,针对Dx11,Dx12,Opengl等等平台抽象出相同的接口,我们能方便能使用相同 ...

  2. [UE4]OnComponentBeginOverlap.AddDynamic 的编译错误

    以 Character 类为例,假设有 PacManCharacter 派生自 Character类首先在 PacManCharacter.h 头文件中添加碰撞函数的声明: OnCollision 为 ...

  3. UE4 RHI(2)

    在上篇简单说明RHI的作用后, 我们在引擎中探索一下RHI的种种细节与实现. 在解决方案资源管理器中搜索RHI, 会有这些文件: (1)对应不同运行平台的PlatformDynamicRHI.cpp( ...

  4. 记一次UE4源码编译和游戏项目打包过程

    1.首先我们需要注册一个Epic账户,网址如下 http://api.unrealengine.com/CHN/GettingStarted/Installation/index.html#bookm ...

  5. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  6. UE4游戏开发基础命令

    在个人的Unrealengine账户中关联自己的GitHub账户成功之后,就可以访问UE4引擎的源码了. git clone -b release https://github.com/EpicGam ...

  7. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  8. 使用UE4公布安卓平台游戏

    使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...

  9. UE4制作插件的插件神器pluginCreator

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/45644007 作者:car ...

随机推荐

  1. python_字符串方法

    1.字符串大小写转 value = "wangdianchao" # 转换为大写 big_value = value.upper() print(big_value) # 转换为小 ...

  2. .Net优秀应用界面大PK!DevExpress年度大赛,群雄逐鹿花落谁家

    DevExpress 优秀界面图片火热征集中! 只要您晒出来,慧都就为您颁奖! 角逐前三,百度AI音箱.小米行李箱等惊喜大礼等您Pick! 活动时间:12月1日-12月31日 立即参与 活动详情 活动 ...

  3. 关于Python中正则使用findall和分组的一个坑

    版权声明:本文为sam的原创文章,转载请添加出处:http://blog.csdn.net/samed https://blog.csdn.net/samed/article/details/5055 ...

  4. 后端数据中含有html标签和css样式,前端如何转译展示样式效果。

    后端含有html标签和css样式的数据: domain="<span style='color:red'>www.baidu.com</span>" (vu ...

  5. BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )

    题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...

  6. paramiko远程上传下载文件

    import paramiko import sys user = "root" pwd = " # 上传文件 def sftp_upload_file(server_p ...

  7. Codeforces Round #598 (Div. 3) A,B,C,D{E,F待补}

    A. Payment Without Change   #include<bits/stdc++.h> using namespace std; #define int long long ...

  8. java新建excel文件导出(HSSFWorkbook)

    public ActionForward exportExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, ...

  9. 51nod 1076

    * 无向图的割边将图分为不连通的两部分 * 对于是否有不想交的两条路径将s -> t 相连 * 只需判断是否处于同一部分 * Tarjan即可 #include <bits/stdc++. ...

  10. npm传参技巧

    博主今天遇到一个问题,使用vue-cli-serve,想要用shelljs来执行vue-cli-serve,动态给它传“--port xxxx"但是发现”--port“怎么传都穿不进去,后面 ...