当前位置: 首页 > news >正文

UE4 编写着色器以及各种宏的理解

参考链接:如何为 UE4 添加全局着色器(Global Shaders) - Unreal Enginehttps://docs.unrealengine.com/5.1/zh-CN/adding-global-shaders-to-unreal-engine/如何为 UE4 添加全局着色器(Global Shaders) - Unreal Engine

参考链接:虚幻4渲染管线入门 - 知乎 

参考链接:https://www.cnblogs.com/wellbye/p/5837108.html

编译失败可以参考文章:【UE·Editor篇】UE编辑器开发的常见编译失败原因总结_水曜日鸡的博客-CSDN博客_implement_module

1,如何让ue4读取并编译着色器

// This can go on a header or cpp file
class FMyTestVS : public FGlobalShader
{DECLARE_EXPORTED_SHADER_TYPE(FMyTestVS, Global, /*MYMODULE_API*/);FMyTestVS() { }FMyTestVS(const ShaderMetaType::CompiledShaderInitializerType& Initializer): FGlobalShader(Initializer){}static bool ShouldCache(EShaderPlatform Platform){return true;}
};

1,继承于FGlobalShader类

2,用 DECLARE_EXPORTED_SHADER_TYPE() 这个宏可以生成导出信息,对序列化该 shader 类型是必须的。在需要的时候,第三个参数是代码模块的外部链接类型,该 shader 模块位于这个代码模块中

3,两个构造函数,分别是默认构造和用于序列化。

4,ShouldCache() 函数需要用来判定该 Shader 是否需要在特定情形下进行编译(比如,我们应该并不希望在一个没有计算 Shader 能力的 RHI 上编译一个需要计算能力的 Shader)。

class FBlurLightShaftsPixelShader : public FGlobalShader
{
public:DECLARE_GLOBAL_SHADER(FBlurLightShaftsPixelShader);SHADER_USE_PARAMETER_STRUCT(FBlurLightShaftsPixelShader, FGlobalShader);BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )SHADER_PARAMETER_STRUCT_INCLUDE(FLightShaftPixelShaderParameters, LightShafts)SHADER_PARAMETER_RDG_TEXTURE(Texture2D, SourceTexture)SHADER_PARAMETER(FVector4, RadialBlurParameters)RENDER_TARGET_BINDING_SLOTS()END_SHADER_PARAMETER_STRUCT()static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters){return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5); }static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment){OutEnvironment.SetDefine(TEXT("NUM_SAMPLES"), GLightShaftBlurNumSamples);}
};
IMPLEMENT_GLOBAL_SHADER(FBlurLightShaftsPixelShader, "/Engine/Private/LightShaftShader.usf", "BlurLightShaftsMain", SF_Pixel);

其中,DECLARE_GLOBAL_SHADER(...)会设置一些默认的成员变量及函数SHADER_USE_PARAMETER_STRUCT(...)宏的用于将声明的FParameters结构体与shader中的字段进行绑定。

使用下面宏来声明FParameters结构体,此处的FParameters为固定用法,不能写成其他的名字

        BEGIN_SHADER_PARAMETER_STRUCT(FParameters,)

                ....//与Shader中的参数对应.....

                RENDER_TARGET_BINDING_SLOTS()

        END_SHADER_PARAMETER_STRUCT()

通过这种方式来声明参数结构体,将C++代码与shader中的参数对应,C++中参数可少写,即只会更新结构体中的参数。其中的RENDER_TARGET_BINDING_SLOTS()会添加RenderTarget接口。(看不懂)

这种声明方式与GraphBuilder相结合,可使开发得到极大的简化。若使用RenderPass的方式,可使用另外的方式来设置参数。

在声明了shader类后,使用IMPLEMENT_GLOBAL_SHADER(...)来将shader类与shader文件中的实现进行对应,即对shader进行实现。参数分别为IMPLEMENT_GLOBAL_SHADER(类名,shader文件路径,shader文件中的方法名,shader类型)

该结构体和实现可写在类的外面甚至另外的文件中,方便访问即可。

shader内容可以参考LigthShaftShader.usf,注意在写自己的shader时需包含#include "Common.ush"

2,IMPLEMENT_SHADER_TYPE

这个宏将类型 (FMyTestVS) 映射到 .usf 文件 (MyTest.usf) 上,该 Shader 的入口 (MainVS),以及 frequency/shader stage (SF_Vertex)。并且它也使得该 Shader

在 ShouldCache() 方法返回 true 时,能够加入到编译列表中

3,IMPLEMENT_MODULE

ue4的代码是模块的形式来组织。

在源码层面,一个包含*.build.cs的目录就是一个模块。

这个目录里的文件在编译后都会被链接在一起,比如一个静态库lib,或者一个动态库dll。

不管是哪种形式,都需要提供一个给外部操作的接口,也就是一个IModuleInterface指针。

*注意这里并不是说调用模块内任何函数(或类)都要通过该指针来进行,实际上外部代码只要include了相应的头文件,就能直接调用对应的功能了(比如new一个类,调一个全局函数等),因为实现代码要么做为lib被链接进exe,或是做为dll被动态加载了。

这个IModuleInterface指针是用来操作做为整体的模块本身的,比如说模块的加载、初始化和卸载,以及访问模块内的一些全局变量(向下转成具体的模块类型后)

外部获取这个指针,只有一个办法,就是通过FModuleManager上的LoadModule/GetModule。

而FModuleManager去哪里找需要的模块呢?

1、在动态链接情况下,根据名字直接找对应的dll就行了,做为合法ue4模块的dll,必定要导出一些约定的函数,来返回自身IModuleInterface指针。

2、在静态链接时,去一个叫StaticallyLinkedModuleInitializers的Map里找,这就要求所有模块已把自己注册到这个Map里。

以上2点基本就是FModuleManager::LoadModule的内容。

 

相关文章:

UE4 编写着色器以及各种宏的理解

参考链接:如何为 UE4 添加全局着色器(Global Shaders) - Unreal Enginehttps://docs.unrealengine.com/5.1/zh-CN/adding-global-shaders-to-unreal-engine/如何为 UE4 添加全局着色器(Global Shaders) - Unreal Engin…...

小笔记:Python 使用字符串调用函数

小笔记:Python中如何使用字符串调用函数/方法?jcLee95:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址:https://blog.csdn.net/qq_28550263/article/details/111874476 邮箱 :291148484163.co…...

红黑树的原理+实现

文章目录红黑树定义性质红黑树的插入动态效果演示代码测试红黑树红黑树 定义 红黑树是一个近似平衡的搜索树,关于近似平衡主要体现在最长路径小于最短路径的两倍(我认为这是红黑树核心原则),为了达到这个原则,红黑树所…...

用于非线性时间序列预测的稀疏局部线性和邻域嵌入(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

使用 Vue3 重构 Vue2 项目

目录前言:一、项目整体效果展示二、项目下载使用方法三、为什么要重构项目四、重构的流程五、步骤中的 bug 以及解决方式六、未解决的问题总结:前言: 2020年9月18日,vue3正式版发布了,前几天学习完成后,我决…...

Hive学习——单机版Hive的安装

目录 一、基本概念 (一)什么是Hive (二)优势和特点 (三)Hive元数据管理 二、Hive环境搭建 1.自动安装脚本 2./opt/soft/hive312/conf目录下创建hive配置文件hive-site.xml 3.拷贝一个jar包到hive下面的lib目录下 4.删除hive的guava,拷贝hadoop下的guava 5…...

uprobe 实战

观测数据源 目前按照我的理解,和trace相关的常用数据源–探针 大致分为四类。 内核 Trace point kprobe 用户程序 USDT uprobe 在用户程序中,USDT是所谓的静态Tracepoint。和内核代码中的Trace point类似。实现方式是在代码开发时,使用USDT…...

华为OD机试 - 求最大数字(Python)| 真题+思路+考点+代码+岗位

求最大数字 题目 给定一个由纯数字组成以字符串表示的数值,现要求字符串中的每个数字最多只能出现2次,超过的需要进行删除;删除某个重复的数字后,其它数字相对位置保持不变。 如34533,数字3重复超过2次,需要删除其中一个3,删除第一个3后获得最大数值4533 请返回经过删…...

雨水情测报与大坝安全监测系统

压电式雨量传感器产品概述传感器由上盖、外壳和下盖组成,壳体内部有压电片和电路板,可以固定在外径50mm立柱上和气象站横杆上。传感器采用冲击测量原理对单个雨滴重量进行测算,进而计算降雨量。雨滴在降落过程中受到雨滴重量和空气阻力的作用…...

抖音广告投放形式有哪些?新品牌进入抖音怎么建立口碑

坐拥5亿用户的抖音平台,已经成为各大品牌的兵家必争之地。想要在这块宣传的“高地”,做出声量,就必须了解抖音广告投放形式有哪些。这里整理的这份抖音广告投放指南,你一定不能错过。一、抖音为何如此牛想要弄清楚抖音广告的投放形…...

Beefxss使用教程图文教程(超详细)

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 Beefxss一、首次使用二、修改账号密码三、自带练习页面四、简单使用五、工具界面介绍六、功能演示1、网页重定向2、社工弹窗3、功能颜色标识…...

【Python学习笔记】35.Python3 CGI编程(2)

前言 本章继续介绍Python的CGI编程。 通过CGI程序传递checkbox数据 checkbox用于提交一个或者多个选项数据&#xff0c;HTML代码如下&#xff1a; 实例 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>csdn教程(csd…...

博客等级说明

CSDN 博客等级是按照用户的博客积分数量进行的设定&#xff0c;为 Lv1 至 Lv10 共 10 个等级&#xff0c;不同的等级创作者可以享受到不同的权益待遇。例如&#xff0c;皮肤奖励、自定义域名、客服优先处理、自定义文章标签等特权。您需要提高博客积分进一步提升等级&#xff0…...

STL——容器适配器、deque

一、容器适配器 1.适配器 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的、多数人所知晓的、经过分类编目的、代码设计经验的总结&#xff09;&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 2.STL标准库中stack和queue的底层结构 stack…...

VBA数组和Excel工作表数据传递

本文介绍如何利用 VBA 的数组&#xff08;Array) 来提高 Excel 单元格和外部数据传输的性能。如果数量比较大&#xff0c;通过 Array 来传输数据比直接操作单元格要快若干倍。 将 Range 的数据写入 VBA Array 将 Range 数据写入 VBA 的数组非常简单。下面的例子演示了用法&am…...

PyQt5保姆级入门教程——从安装到使用

目录 Part1&#xff1a;安装PyQt5 Part 2&#xff1a;PyCharm配置PyQt5 Part 3&#xff1a;PyQt5设计界面介绍 Part 4&#xff1a;PyQt5设计UI 今天看了多个大佬的教程&#xff0c;总算是把PyQt5开发弄好了&#xff0c;每个部分都要看几个人的十分不方便&#xff0c;我十分…...

1.6 epoll实战使用

文章目录1、连接池2、epoll两种工作模式2.1、LT模式2.2、ET模式3、后端开发面试题4、epoll验证1、连接池 将每一个套接字和一块内存进行绑定&#xff0c;连接池就是一个结构体数组&#xff0c;通过链表来维护一个空闲连接。 1、ngx_get_connection(int fd)从空闲链表取一个空闲…...

JDK定时、Spring定时、时间轮定时小结

Timer使用一个线程&#xff0c;一个小根堆。线程执行根上的任务&#xff0c;小根堆会根据执行时间戳重新调整&#xff0c;根上的任务是下一个执行的任务。 DelayedQueue维护一个优先级队列&#xff0c;本质也是一个数组方式的堆。任务生成时也有时间戳&#xff0c;只提供存储。…...

关于cFosSpeed如何配置

cFosSpeed配置一、检查Calibration Done情况二、优化Ping时间和线路校准三、测网速四、cFosSpeed控制台五、配置参数一、检查Calibration Done情况 安装完毕&#xff0c;激活成功后。 右键------>选项------>设置&#xff0c; 打开适配器信息&#xff0c;查看Calibra…...

YOLOV5输出的txt里面有什么猫腻(用于图像分类竞赛中提升图像信息密度)

背景概括&#xff1a; kaggle最近举办了一场医学乳腺癌检测的比赛&#xff08;图像分类&#xff09; 比赛官网地址 给的数据是dcm的专业的医学格式&#xff0c;自己通过DICOM库转为png后&#xff0c;发现该图像胸部不同的患者乳腺大小不一&#xff0c;简言之乳腺的CT有效图在…...

群晖NAS进阶指南:借助Docker容器部署全能DDNS服务,实现多平台域名与公网IP智能同步

1. 为什么需要全能DDNS服务&#xff1f; 家里有群晖NAS的朋友可能都遇到过这样的烦恼&#xff1a;明明设置了外网访问&#xff0c;但过几天就失效了。这是因为大多数家庭宽带分配的都是动态公网IP&#xff0c;运营商会定期更换你的IP地址。想象一下&#xff0c;这就像你的手机…...

实战指南:5分钟掌握ImageToSTL图片转3D模型技术

实战指南&#xff1a;5分钟掌握ImageToSTL图片转3D模型技术 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. 项目…...

别再傻傻分不清了!舵机、步进、无刷、永磁同步,这四种电机到底怎么选?

机器人开发者必读&#xff1a;四大电机选型实战指南 当你在深夜调试机器人关节时&#xff0c;是否曾被电机的异常啸叫声惊醒&#xff1f;三年前我参与四足机器人项目时&#xff0c;就因选错电机类型导致整机功耗超标。本文将用真实项目经验&#xff0c;帮你避开电机选型的那些坑…...

WeChatMsg:如何用开源工具构建你的个人数字记忆库

WeChatMsg&#xff1a;如何用开源工具构建你的个人数字记忆库 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg…...

超高清电视普及困境解析:从技术参数到生态系统的完整思考

1. 超高清电视的“非主流”开局&#xff1a;一场始于2013年的行业迷思 如果你在2013年初的拉斯维加斯CES展上&#xff0c;听到关于“Ultra HDTV”&#xff08;超高清电视&#xff0c;后文简称UHDTV&#xff09;的喧嚣&#xff0c;感觉就像身处一场盛大的交响乐彩排现场——乐手…...

自动化测试系统开关架构与继电器选型指南

1. 自动化测试系统中的开关架构选择在自动化测试系统中&#xff0c;开关架构的选择直接影响着测试效率、信号完整性和系统成本。根据测试需求和被测设备(DUT)特性&#xff0c;我们可以将开关架构分为四种基本类型。1.1 无开关架构无开关架构是最直接的连接方式&#xff0c;每个…...

别再花钱买板卡了!手把手教你用NI-MAX虚拟PCI6224玩转LabVIEW数字IO

零成本玩转LabVIEW数字IO&#xff1a;NI-MAX虚拟设备全攻略 在工程教育与原型开发领域&#xff0c;硬件成本往往是阻碍学习进程的第一道门槛。一块标准的NI PCI-6224数字IO板卡市场价超过万元&#xff0c;而学生和独立开发者可能需要反复实验数十次才能掌握基础操作。但鲜为人知…...

Visual C++ 运行库终极修复指南:一键解决系统兼容性问题

Visual C 运行库终极修复指南&#xff1a;一键解决系统兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist VisualCppRedist AIO 是解决 Windows 系统 Vis…...

AI编码助手技能开发:基于Agent Skills打造智能命令行速查工具

1. 项目概述&#xff1a;一个能“听懂人话”的开发者命令行技能如果你和我一样&#xff0c;每天在终端和代码编辑器里花费大量时间&#xff0c;那你肯定对“命令遗忘症”深有体会。明明上周才用过git worktree来并行处理两个功能分支&#xff0c;今天突然想不起来具体的参数顺序…...

Smart_rtmpd配置全解:从单局域网到跨网段,你的OBS推流服务器搭建指南

Smart_rtmpd高阶配置指南&#xff1a;从局域网到跨网段的OBS推流实战 在当前的数字内容创作浪潮中&#xff0c;实时视频流传输已成为游戏直播、在线教育、企业内训等场景的刚需。对于技术爱好者和小型团队而言&#xff0c;自建推流服务器不仅能避免第三方平台的限制&#xff0c…...