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

news2024/11/18 10:32:23

参考链接:如何为 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的内容。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

睡眠影响寿命,这几个睡眠习惯赶紧改掉!

我们知道,现在睡眠不足已经成为普遍问题,但你知道睡眠的时长会影响寿命吗?熬夜对身体不好,已是老生常谈。但睡得过早,也可能影响寿命!2021年《睡眠医学》杂志一项针对21个国家11万名参与者的研究中发现&…

重生之我是赏金猎人-SRC漏洞挖掘(十)-某大厂从废弃sso登陆口到多思路fuzz获取各地高管信息

0x01 前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎亲们点个star 作者Catm78sec 前期通过灯塔 ffuf oneforall 等工具组合进行子域名收集,得到目标站点,漏洞挖掘中多次踩坑成功get腾讯某后台 0x02 渗透日常——单点登录 目标URL&…

【vcpkg】cpprestsdk之64位编译链接及踩坑

▒ 目录 ▒🛫 问题描述1️⃣ 多版本vs报错指定VS路径2️⃣ error LNK2001: 问题排查通过IDA打开lib文件,确认导出内容查看源码增加参数--editable,重新编译3️⃣ error LNK2001: 外部符号__imp_?close_...去除__imp_🛬 结论vcpkg…

浅谈估值模型:从Grinold Kroner(GK)模型看投资的本质

摘要及声明 1:本文主要介绍Grinold Kroner(GK)模型的运用,并以上证指数为例实现一个GK模型; 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的一孔之见,若有…

buffer和cache的区别

一,计算机硬件组成 计算机硬件组成:CPU,存储器,输入输出设备(I/O),其他(主板,电源等) CPU:运算器,控制器 存储器:内部存储…

蓝桥云课-声网编程赛(声网编程竞赛7月专场)题解

比赛题目快速链接:https://www.lanqiao.cn/contests/lqENT02/challenges/ 让时钟转起来(考点:css:transform) // index.js function main() {// 题解前理解一个东西:// 时针每过一小时,转30 原…

博客等级说明

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

矩阵理论复习(十二)

已知方阵A的不变因子: 求谱半径求矩阵级数判断矩阵幂级数的收敛性 若矩阵B的某个算子范数小于1,则I-B可逆。 矩阵分析 任何相容矩阵范数都存在与之相容的向量范数。 盖尔圆盘定理一的证明 椭圆范数的证明 若||.||是Cm上的向量范数,A为…

单元测试工具——JUnit的使用

⭐️前言⭐️ 本篇文章主要介绍单元测试工具JUnit的使用。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码…

C++11--lambda表达式

目录 lambda表达式的概念 lambda表达式语法 lambda表达式的书写格式 捕捉列表 参数列表 mutable 返回值类型 函数体 lambda表达式交换两个数 函数对象与lambda表达式 lambda表达式的概念 lambda表达式是一个匿名函数 它能让代码更加地简洁 提高了代码可读性 首先定义…

2021年欧空局10米土地覆盖数据(分省/分市)

土地覆盖数据是我们平时最常用的地理数据之一,土地覆盖数据的来源也有很多种,之前我们介绍共过两个的30米精度的土地覆盖数据,分别为GlobeLand30土地覆盖数据和CLCD土地覆盖数据,(可查看之前推送的文章)&am…

佳能镜头EOS系统EF协议逆向工程(三)解码算法

目录 数据结构 解码算法 解码效果 这篇文章基于上两篇文章继续, 佳能镜头EOS系统EF协议逆向工程(一)转接环电路设计_佳能ef自动对焦协议_岬淢箫声的博客-CSDN博客本文属于专栏——工业相机。此专栏首先提供我人工翻译的法语文档部分&…

Python解题 - CSDN周赛第29期 - 争抢糖豆

本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿。因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍。苦心人,天不负,感谢官方大大! 第…

ChatGPT 人工智能革命从实验室走入公众生活

11 月底,人工智能研究实验室OpenAI 发布了 ChatGPT 聊天机器人首个测试版本,这是一款基于人工智能的新型聊天机器人,可以与人类进行对话,经过测试后,新款机器人便踏上了社交网站之旅,尤其是在推特平台上&am…

机器学习+西瓜书笔记第2章【贝叶斯分类器】

机器学习笔记第2章【贝叶斯分类器】一、贝叶斯决策论1.相关知识补充2.生成模型与判别模型贝叶斯公式: 实际上,分母为全概率公式,分子为联合概率。在机器学习中,更常见的形式为 贝叶斯公式的作用在于将P(B|A)的估计转化为估计P(A…

做一个短视频应用,如何选择服务器配置?

大家好我是明杰,最近听说了“两微一抖”这个词。很容易联想到,“两微”指的是微信和微博,“一抖”指的是抖音,它描述的是今年开始互联网行业呈现的一种新的变化。抖音奇迹般地杀出重围,与微博、微信一起造就了流量市场“三权分立”的现象。抖音能与微信、微博齐名,与…

vue全家桶(四)前端工程化

vue全家桶(四)前端工程化1.模块化的相关规范1.1模块化概述1.2模块化的分类A.浏览器端的模块化B.服务器端的模块化C.ES6模块化1.2.1 Node.js中通过bable体验ES6模块化1.2.2 ES6模块化的基本语法1.2.2.1 默认导出与默认导入1.2.2.2 按需导出与按需导入1.2.…

vue - vue项目中解决 IOS + H5 滑动边界橡皮筋弹性效果

问题: 最近遇到一个问题,我们在企业微信中的 H5 项目中需要用到table表格(支持懒加载 上划加载数据)。但是他们在锁头、锁列的情况下,依旧会出现边界橡皮筋效果。就会显示的很奇怪。 什么是ios橡皮筋效果: 我们知道元素…

华为MateBook E Go电脑使用U盘怎么安装Win10系统?

华为MateBook E Go电脑使用U盘怎么安装Win10系统?有用户购买这款电脑之后,发现系统默认安装的电脑系统是Win11版本的。但是自己不习惯使用这个系统,所以想要去将系统重新安装到Win10来使用。那么要怎么去进行系统重装呢?一起来看看…

微服务门神-Gateway与Sentinel的集成

目录 引言 概述 集成Sentinel 限流维度 网关集成 Route维度 API分组 精准匹配 前缀匹配 正则匹配 自定义限流返回格式 转视频版 引言 书接上篇:微服务门神-Gateway过滤器Filter,讲完了解Gateway过滤器之后,接下来看下Gateway与…