UE【材质编辑】Shader模板

news2024/9/22 13:07:41

【UE 4.27.2】

        在UE中双击材质球会进入材质编辑界面。PBR的材质参数呈现为材质蓝图的各个节点,提供数据源,传递进材质。最后材质对其进行组织,呈现为VS,PS等着色器代码,基本流程:

本文会刨析在UE4.27.2中材质模板是如何应用的。

1.认识编辑器中的材质

        打开任意材质球,双击进入材质编辑面板:

此界面形象展示了材质参数传递到材质(实例)的过程,而材质最终的呈现是Shader,我们可以打开“window->Shader Code->HLSL Code”展开Shader界面:

注意看顶上的注释:1.MaterialTemplate.ush;2.FHLSLMaterialTranslator::GetMaterialShaderCode

两个关键信息。

2.Shader模板文件

查看MaterialTemplate.usf文件(左侧),与展开的Shader界面(右侧)代码对比:

右侧标红部分为差异代码,绝大多数一致,其中差异部分如图:

不难看出,左侧模板文件在数值部分提供了一些占位符,而右侧则完成了字符的填充。

3.Shader模板填充

在编辑器中的Shader已完成了字符填充,而执行填充的位置如下:

3.1读取Shader模板

FHLSLMaterialTranslator::Translate

此时MaterialTemplate保留着最原始的模板字符串(含占位符)

3.2产生HLSL

原始的字符模板深拷贝,以供填充使用

主要解释一下PushParam函数:

void PushParam(const TCHAR* Data)
    {
        if(ProcessUntilPercentS())
        {
            // %s被跳过,然后此处直接替换为对应数据
            CurrentState += Data;
        }
        else
        {
            // internal error, more ReplacePercentS() calls than %s in MaterialTemplate.usf
            check(0);
        }
    }



bool ProcessUntilPercentS()
    {
        //查找CurrentInputPos中第一个%s
        const TCHAR* Found = FCString::Strstr(CurrentInputPos, TEXT("%s"));

        if(Found == 0)
        {
            return false;
        }

        // copy from input until %s
        // 将%s之前的内容给到CurrentState ,且CurrentInputPos设置到%s位置
        while(CurrentInputPos < Found)
        {
            // can cause reallocations we could avoid
            CurrentState += *CurrentInputPos++;
        }

        // jump over %s
        // 跳过后方便直接替换数据
        CurrentInputPos += 2;

        return true;
    }

巧妙地通过跳过%s和填充数据实现了替换,并通过 CurrentState 和CurrentInputPos实现对处理后数据与处理前数据的分离;

4.填充参数解析

关键填充参数来源

一共32项

获取一些公共代码

以上可以理解为Shader模板共有的一些代码,除此之外还有根据Material定义的一些数据:

这部分接口反映出了材质实例的特性;

最后填充在#line 后一个行数

以此表明之后的都是公共模板代码:

5.在材质模板中加入自己的代码

包含自己的usf文件

打开Shader模板,包含我们自己的usf文件;

我们在这个文件中可以实现自己的一套工具函数:

添加自定义节点

然后,添加一个Custom节点,在其中就可以调用我们这个函数:

值得一提的是,添加Custom节点,并把它连接到有效的Pin上,会调用FHLSLMaterialTranslator::CustomExpression我们可以在其中添加一段注释:

然后看一下此时的Shader实例文件:

我们自定义的文件及函数被使用,连接到的节点被压入Shader实例文件中。

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

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

相关文章

Postman注册使用

文章目录 介绍下载安装官网&#xff1a;[Postman API Platform | Sign Up for Free](https://www.postman.com/) 使用过程 介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 Postman原是Chrome浏览器的插件&#xff0c;可以模拟浏览器向后端服务器发起…

「Python程序设计」基本数据类型:列表(数组)

​列表是python程序设计中的一个基本的&#xff0c;也是重要的数据结构。我们可以把列表数据结构&#xff0c;理解为其它编程语言中的数组。 定义和创建列表 列表中的数据元素的索引&#xff0c;和数组基本一致&#xff0c;第一个元素的索引&#xff0c;或者是下标为0&#x…

CSS-径向渐变【看这一篇就够了!!!】

目录 线性渐变 未设置角度&#xff0c;默认从上向下渐变 关键字指定渐变方向 用度数来指定渐变方向 多个颜色值&#xff0c;并且可以用百分数定义它出现的位置 自定义转换中点 浏览器私有前缀 渐变色工具 径向渐变 简单的径向渐变 设置颜色节点出现的位置 设置径向渐…

(ECCV-2024)SwiftBrush v2:让你的一步扩散模型比它的老师更好

SwiftBrush v2&#xff1a;让你的一步扩散模型比它的老师更好 Paper Title&#xff1a;SwiftBrush v2: Make Your One-step Diffusion Model Better Than Its Teacher paper是VinAI Research发表在ECCV 2024的工作 paper地址 Code地址 Abstract. 在本文中&#xff0c;我们旨在…

Datawhale x李宏毅苹果书入门 AI夏令营 task03学习笔记

实践方法论 训练模型的基本步骤&#xff1a;&#xff08;如下图所示&#xff09; 用训练集训练模型&#xff0c;&#xff08;最终得出来最优的参数集&#xff09;将最优参数集带入模型中&#xff0c;用测试集测试模型&#xff08;人话&#xff1a;将最优参数集带入原来函数中…

观测云「可观测性解决方案」亮相 828 B2B 企业节

今年&#xff0c;随着第三届828 B2B企业节与中国国际大数据产业博览会的同步盛大开幕&#xff0c;我们迎来了企业发展和技术创新的崭新篇章。作为国内可观测性领域的领军企业&#xff0c;观测云不断深化在监控观测技术与能力上的探索&#xff0c;致力于为全球用户提供全面而统一…

如何用网络分析仪测试软件测试天线?

随着射频技术的发展&#xff0c;对于天线性能的精确测试需求日益增长&#xff0c;矢量网络分析仪因此成为测试环节中不可或缺的工具之一。今天天宇微纳为大家介绍网络分析仪测试天线S参数的方法与流程。 网络分析仪测试天线的方法 S参数是衡量和评估天线性能和通信质量的重要指…

springboot接收时间类型参数的方式

参数直接跟在url上面用DateTimeFormat接收 参数写在实体类中 用JsonFormat接收 注意&#xff1a; pattern 中的表达式要和接受的数据类型格式一致。不然会报错。例如表达式是 yyyy-MM-dd 就只能匹配LocalDate ,不能用 LocalDateTime去接收。即使LocalDateTime是更细化的时间类型…

Redis过期键监听

在 Redis 中&#xff0c;为了监听过期键事件&#xff0c;需要使用 Redis 的 Keyspace Notifications 功能。这一功能允许客户端订阅某些事件的发生&#xff0c;比如键过期、键删除等。 启用过期键监听 在 Redis 的配置文件 redis.conf 中&#xff0c;确保配置项 notify-keysp…

恒电流间歇滴定法 (GITT) 测试教程

文章目录 恒电流间歇滴定法 (GITT) 测试教程1. GITT 测试原理2. 实验准备2.1 设备与材料2.2 配置实验装置 3. GITT 测试步骤3.1 设定测试参数3.2 执行 GITT 测试 4. 数据分析4.1 电压变化分析4.2 扩散系数计算4.3 电荷传输阻抗分析 5. 总结与应用 恒电流间歇滴定法 (GITT) 测试…

【最新发布】OpenCV实验大师工作流引擎 - 实现OpenCV算法从设计到交付零代码

点击查看 更多 OpenCV工作流引擎案例与代码教程&#xff0c;QT集成案例 OpenCV实验大师工具软件介绍 一款能够提升OpenCV教学质量与OpenCV工程化开发质量与速度的OpenCV算法设计与流程验证 工具软件 - OpenCV实验大师平台。 一款OpenCV工程化开发效率提升与OpenCV教学质量提升…

一步迅速了解Spring框架中的几大特点

一&#xff0c;Spring框架的特点1 &#xff1a;AOP 1, AOP全称&#xff1a; Aspect Oriented Programming 2, AOP主要是用面向切面编程思想处理问题&#xff0c;面向切面编程是对面向对象编程的补充和延续 3,面向切面编程思想 面向切面编程思想是将我们程序中的非业务代码&am…

[SimCLR v2] Big Self-Supervised Models are Strong Semi-Supervised Learners

1、目的 借助无监督预训练来提升半监督学习的效果 2、方法 1&#xff09;unsupervised/self-supervised pretrain -> task-agnostic -> big (deep and wide) neural network可以有效提升准确性 -> improvements upon SimCLR larger ResNet models&#xff1b;deeper …

03:logic软件操作界面及常用设置

1.打开logic软件 2显示工具栏 3.logic软件常用设置 3.1常规页设置 3.2设计页设置 3.3颜色设置

在发布您的插件之前,如何在 ONLYOFFICE 插件市场中进行测试?

ONLYOFFICE 插件为我们提供了强大的定制和拓展功能。作为插件开发人员&#xff0c;您可能希望在发布之前&#xff0c;在插件管理器中预览您的插件。这篇文章将指导您如何在 ONLYOFFICE 插件市场中预览插件。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c;由领先…

大数据智能风控核心:模型

概述 模型 线性判别分析方法&#xff0c;Sir Ronald Fisher最早提出模型评分的概念。 个人FICO模型信用分。 巴塞尔委员会发布巴塞尔Ⅱ协议&#xff0c;推出内部评级法&#xff08;Internal Rating Based Approach&#xff0c;IRB&#xff09;​。IRB综合考虑客户评级和债项…

HLS报错之:Export RTL报错 “ERROR: [IMPL 213-28] Failed to generate IP.“

原因&#xff1a;官方bug 解决办法&#xff1a;下载补丁&#xff08;补丁适用于2014年至2021年的多个Vivado版本&#xff09;&#xff0c;并添加到对应路径下即可。 注意&#xff1a;windows下该方法试用。 补丁连接 我这里下载到xilinx的目录下并解压&#xff1a; 点进去找…

微服务集成 Seata

文章目录 引入依赖配置TC地址其它服务使用 本篇文章介绍分布式架构下, 各个微服务之间要达成分布式事务, 引入 Seata 的步骤和使用方式. 引入依赖 首先&#xff0c;在 order-service 服务中引入依赖&#xff1a; <!--seata--> <dependency><groupId>com.al…

YOLOv8改进 | 模块缝合 | C2f融合多尺度表征学习模块 【含OD、RTDETR、OBB等yaml文件】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

String框架基础补充

前言 本文将继续上一篇文章的内容对 Spring 数据访问层管理,Spring集成mybatis等知识进行补充,未看过上一篇文章的小伙伴可以点击下方链接,跳转观看上一篇文章Spring框架基础https://mp.csdn.net/mp_blog/creation/editor/141639879 Spring数据访问层管理 首先,我们需要知道 : …