【UE5】在材质Custom写函数的方法

UE材质的Custom本身会构建为函数,所以并不能在Custom定义函数,但当然还是有办法的
总结一些在custom写函数的方法

常规办法

常规办法就是使用结构体作为函数使用

以一个Lerp功能函数演示
在这里插入图片描述

让我们看看写法:

struct VolBlendFunc //定义结构体
{
//在结构体中新建“结构体变量”,这里的变量名和 Custom 输入的变量无关
float A;
float B;//新建一个“函数”,这里的写法和函数基本一样float Blend(float Pos){return lerp(A, B, Pos);}
};VolBlendFunc VolSample; //为结构体"起名“//使用:
VolSample.A = A; //将“参数A”设置到“结构体变量A”
VolSample.B = B;
return VolSample.Blend(x);//和使用函数的方式基本一样,这里的x是custom输入的x,设置到了Pos

根据用法还有很多写法,这是另一种写法
在这里插入图片描述

struct BaseNumFunc  //定义一个结构体。
{float a;float2 b;float3 c;float4 d;BaseNumFunc Num()   //定义一个函数块。{BaseNumFunc l; //将结构体命名为l方便后续调用结构体中的变量;l.a = 1;l.b = float2(0.5,0.1);l.c = float3(1,1,0);l.d = float4(1,0,1,1);return l;}
}BaseNum; //返回结构体的名字。
a = BaseNum.Num().a;
b = BaseNum.Num().b;
d = BaseNum.Num().d;
return BaseNum.Num().c; //调用结构体中的函数里设置的数据。

泡芙注入

原理

这是一种利用Custom特性,用作弊手法将任何东西写入HLSL的实现。
先看看原理,例如你写了一个:
在这里插入图片描述

float C= lerp(A, B, X);
return C;

它会被编译为一个函数CustomExpression
在这里插入图片描述

但如果我们这么写呢?
在这里插入图片描述

return 0;}
float Blend(float Pos)
{return lerp(A, B, Pos);

会发现他是原样写在了这里
在这里插入图片描述

但你会注意到在格式上,Custom生成的CustomExpression被我们直接结束了,下面的内容形成了新的函数
在这里插入图片描述
这种作弊方法正是利用了这个特性,把任何东西写入HLSL,包括函数写入

只需要先写上return 0;},后面随便写任何HLSL的东西,最后记得编译器会补一个"}"

return 0;}//先手一个大比斗将其扇懵
float FA(float Pos)//写一个函数
{return lerp(A, B, Pos);
}float FB(float Pos) //又写一个函数
{return lerp(A, B, Pos);//最后一个“}”不写,等编译器自动补

使用

那么实际使用时就是这样
“加法”是为了在编译时会带着这个custom,这个custom输出0(大比兜的值)
一个+0的操作没有性能损耗,如果不连接这个Csutom,会作为无用节点被优化掉的
在这里插入图片描述

return 0;}//先手一个大比斗将其扇懵,然后对HLSL进行疯狂的注入/**接下来你可以在HLSL里写任何东西,不限于函数
//例如你可以写:
#if !MATERIAL_LWC_ENABLED
#define UE_DF_FORCE_FP32_OPS 1
#endif//也可以加include 
#include "/Engine/Private/xxxx.ush"
**///用注释画画都行,把hlsl疯狂注入成泡芙float MyFLerp(float X, float Y, float Pos)//写多少函数都行
{return lerp(X, Y, Pos);//总之切记,最后一个“}”不写,编译器需要补一个

Shader:
在这里插入图片描述

泡芙↓
在这里插入图片描述

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

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

相关文章

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员,终于找到一个真正免费的,遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:统计好节点的数目 代码与解题思路 先读题:题目要求我们找出好节点的数量,什么是好节点?“好节点的所有子节点的数量都是相同的”,拿示例一…

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)

在前端开发中,模块化是一个重要的概念,不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module,因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…

SystemVerilog学习笔记(十):进程/细粒度进程控制

进程 进程或线程是作为独立实体执行的任何代码片段。fork-join块创建并行运行的不同线程。在下面的图-1中,可以看到进程的类型和进程控制。 序号进程描述1.fork-join只有所有子线程执行完毕时,父线程才会执行。2.fork-join_any只有任何一个子线程执行完…

javascript用来干嘛的?赋予网站灵魂的语言

javascript用来干嘛的?赋予网站灵魂的语言 在互联网世界中,你所浏览的每一个网页,背后都有一群默默工作的代码在支撑着。而其中,JavaScript就像是一位技艺精湛的魔术师,它赋予了网页生命力,让原本静态的页…

Golang | Leetcode Golang题解之第553题最优除法

题目: 题解: func optimalDivision(nums []int) string {n : len(nums)if n 1 {return strconv.Itoa(nums[0])}if n 2 {return fmt.Sprintf("%d/%d", nums[0], nums[1])}ans : &strings.Builder{}ans.WriteString(fmt.Sprintf("%d…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

InternVL 多模态模型部署微调实践

目录 0 什么是MLLM 1 开发机创建与使用 2 LMDeploy部署 2.1 环境配置 2.2 LMDeploy基本用法介绍 2.3 网页应用部署体验 3 XTuner微调实践 3.1 环境配置 3.2.配置文件参数解读 3.3 开始微调 4.体验模型美食鉴赏能力 0 什么是MLLM 多模态大语言模型 ( Multimodal Larg…

pgSQL-timescaledb复制表出现的问题

今日在工作中,需要复制一张timescaledb表,pgAdmin上复制一直未成功,或者我找错位置了。 1.我使用Navicate连接pgSQL,连上后选中相应表,右键复制结构即可 2.复制结构后,到pgAdmin中,将对应表下的…

Docker:技术架构的演进之路

前言 技术架构是指在软件开发和系统构建中,为了满足业务需求和技术要求,对系统的整体结构、组件、接口、数据流以及技术选型等方面进行的详细设计和规划。它是软件开发过程中的重要组成部分,为开发团队提供了明确的指导和规范,确…

A029-基于Spring Boot的物流管理系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

【flutter】flutter2升级到3.

文章目录 背景flutter2-3升级的修改之处界面效果其它 背景 以这个 https://github.com/aa286211636/Flutter_QQ 为例子, 升级下看看 flutter2-3升级的修改之处 flatButton变为TextButton设备屏幕尺寸获取: Screen.width(context)变为MediaQuery.of(context).size…

自由学习记录(21)

感觉反而 还复杂一点,关系并不纯粹,游戏里用的少...的确 是知道为什么游戏不用了 理解思想就可以了,实际操作也是动态的分析,硬套某种模式也不是怎么很合适 MVC的了解应该是差不多了,重点还是实际中的使用了 所以删了…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣(LeetCode) 二、数据表结构 表:SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

2023年高校大数据挑战赛A题中文文本纠错求解全过程文档及程序

2023年高校大数据挑战赛 A题 中文文本纠错 原题再现: 中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正,属于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公文、裁判文书、新闻出版等,中文文本纠错…

catchadmin-webman 宝塔 部署

1:宝塔的php 中删除禁用函数 putenv 问题: 按照文档部署的时候linux(php) vue (本地) 无法访问后端api/login 的接口 。 解决办法: webman 没有配置nginx 反向代理 配置就能正常访问了

力扣515:在每个树行中找最大值

给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < Node.val &l…

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

《FreeRTOS列表和列表项篇》

FreeRTOS列表和列表项 1. 什么是列表和列表项&#xff1f;1.1 列表list1.2 列表项list item 2. 列表和列表项的初始化2.1 列表的初始化2.2 列表项的初始化 3. 列表项的插入4. 列表项末尾插入5. 列表项的删除6. 列表的遍历 列表和列表项是FreeRTOS的一个数据结构&#xff0c;是F…