【UE5】使用基元数据对材质传参,从而避免新建材质实例

在项目中,经常会遇到这样的需求:多个模型(例如 100 个)使用相同的材质,但每个模型需要不同的参数设置,比如不同的颜色或随机种子等。

在这种情况下,创建 100 个实例材质不是最佳选择。正确的做法是通过模型的基元数据向材质传递参数。

这种方法不会因为新建实例材质而产生成本。

最重要的是,相同的模型,相同的材质,不会因为基元数据不同而影响合批。

在操作上StaticMeshInstancedStaticMesh是有少许区别的。
在这里插入图片描述

StaticMesh

先以StaticMesh为例。

创建材质

在流程上,虽然不是必须的,但通常需要先创建材质:
在这里插入图片描述

设置变量为基元数据

为材质勾选使用基元数据:
在这里插入图片描述
基元数据是一个浮点数组,一个4通道变量,占用了0123四个索引位置
在这里插入图片描述

所以第二个变量在勾选基元数据后,需要按顺序填4
在这里插入图片描述

自定义基元数据面板可以助你参考index设置
在这里插入图片描述
在这里插入图片描述

模型设置

将材质赋予模型,在细节面板,就可以看到材质中可以使用的基元数据。
在这里插入图片描述

关键一步

可以看到数据后面是+ 号,也就是并未启用。
点击+号,需要将其全部启用,变成有默认值的状态:
在这里插入图片描述

这样,你就可以手动为每个模型创建不同材质参数,而并不需要为其新建实例材质了。

在蓝图中设置

搜索基元,就可以看到可以使用的函数
在这里插入图片描述

基本上分为两种,一种是使用名字设置,一种是使用index设置
在这里插入图片描述

如果是构建函数

要特别强调的是,在构建函数中,要使用可以被序列化的"默认基元数据",这样你的设置才能保存到下次启动项目:

在这里插入图片描述


InstancedStaticMesh

在ISM中使用基元数据,要注意的是,ISM组件的基元数据,和ISM组件中实例的基元数据是并存的。

这是组件:
在这里插入图片描述
这是实例:
在这里插入图片描述
他们是并存的

看实例的基元数据如何实现的,假如ISM有2个实例,每个实例2个参数,那么一共记录为4个,所以实例并不是独立储存了参数

在这里插入图片描述

左侧是组件基元数据和之前一样。新增的是右侧的实例基元数据变量节点,除了不能"起名"用法和之前一样:
在这里插入图片描述

在蓝图中设置

关键一步

如果你的ISM组件也需要使用基元数据,千万要记得启用index!
在这里插入图片描述
实例的基元数据,你可以预设和动态修改:
在这里插入图片描述

在这里插入图片描述

设置数据相比静态网格体ISM多了一个InstanceIndex ,为设置基元数据的目标实例。
左侧为组件基元数据,右侧为实例基元数据。
在这里插入图片描述

演示

为了展现基元数据不同不影响合批的特性,这里用ISM作为示例。

基元设置

  1. 制作材质,注意组件和实例的基元index是单独计算的:
    在这里插入图片描述

  2. 选择组件,设置模型和材质,并设置基元数据数组长度1:
    在这里插入图片描述
    在这里插入图片描述

  3. 设置实例的基元数据长度3
    在这里插入图片描述
    等效:
    在这里插入图片描述

蓝图

红色为设置组件基元数据,给整体随机一个亮度
绿色为实例的基元数据,为每个基元随机一个颜色
在这里插入图片描述

效果

在这里插入图片描述

技巧

材质

在使用时,组件可以不预先设置材质,甚至模型。此时基元数据是这样的:
在这里插入图片描述
显示未声明是不影响实际使用的,但切记需要把可能使用的通道的最大数量的提前开启。
例如所切换的材质中,最复杂的材质需要使用10个基元数据,那么在一开始你就需要开启同样数量的基元数组。

通道使用

通过前面的例子可以看到,基元数据应尽可能压缩索引占用,例如ColorA通道并未使用,却占用了一个位置。
在实际使用中,你可以完全使用浮点类型变量,通过在材质中拆组通道来避免浪费(其实对性能影响微小)
在这里插入图片描述

也可以尽可能的打包参数
在这里插入图片描述
在这里插入图片描述
取决于你的风格

常见用法

提供一些举一反三的思路

  1. 为材质设置随机值
    在这里插入图片描述
  2. 为每个ISM实例指定不同贴图
    在这里插入图片描述

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

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

相关文章

av_image_get_buffer_size 和 av_image_fill_arrays

FFmpeg 4.3 音视频-多路H265监控录放C开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api,H264特殊参数说明_avframe转 avpacket-CSDN博客

力扣hot100-->栈/单调栈

栈/单调栈 1. 20. 有效的括号 简单 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每…

css水平居中+垂直居中

display:“flex”,position: “absolute”,top:“50%”,left:“50%”,transform: ‘translate(-50%, -50%)’

cesium for unity的使用

先聊聊导入 看到这里的因该能够知道,官网以及网上绝大多数的方法都导入不进来,那么解决方法如下: 两个链接:按照顺序依次下载这两个tgz和zip,其中tgz为主要部分,zip为示例工程项目 如果您要查看示例工程项目的话&am…

【网络】Socket编程TCP/UDP序列化和反序列化理解应用层(C++实现)Json::Value

主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.基于Socket的UDP和TCP编程介绍 1.1 基本TCP客户—服务器程序设计基本框架 ​编辑1.2 基本UDP客户—服务器程序设计基本框…

Linux下安装NVIDIA显卡驱动(全流程通俗教程)

1、确认显卡型号 查明你的NVIDIA显卡型号,以确保下载驱动程序的版本: lspci | grep -i vga 2、下载NVIDIA驱动 前往官方网站:NVIDIA官网 选择显卡信息:使用下拉菜单选择正确的显卡型号、Linux操作系统和系统架构。 下载驱动…

VIM的下载使用与基本指令【入门级别操作】

VIM——超级文本编辑器 在当今时代,功能极其复杂的代码编辑器和集成开发环境(IDE)有很多。 但如果只想要一个超轻量级的代码编辑器,用于 Unix、C 或其他语言/系统,而不需要那些华而不实的功能,该怎么办呢&…

Xcode 项目内 OC 混编 Python,调用 Python 函数,并获取返回值(基于 python 的 c函数库)

1:新建 Xcode 工程 2:工程添加 Python.framework 1597052861430.jpg 3:在当前工程下新建一个名字为 googleT 的 python 文件(googleT.py) 1597052584962.jpg 在 googleT.py 文件内写入一个测试 python 函数 def lgf_translate( str ):var1 Hello World!print (str var1)retu…

[第五空间 2021]pklovecloud 详细题解

知识点: 构造POP链 PHP类的作用域 NULL强比较 目录穿越 源码如下: <?php include flag.php; class pkshow { function echo_name() { return "Pk very safe^.^"; } } class acp { protected $cinder; public $neutron;public $n…

elment-ui的折叠tree表单实现纯前端搜索,展开收起功能

好久没更新博客了~ 记录一下本次做的一个很扯的需求 纯前端去实现这个查询的功能,后台返回的是个数组对象,前端要给他包装成树结构先展示 之后参考代码路径src\views\goods\category\index.vue 需求描述: 搜索输入任何一个关键字,都会展开他的父级,两个栏目都包含了,那么两个父…

Redis面试篇笔记(持续更新)

一、redis主从集群 单节点redis的并发能力是由上限的&#xff0c;要进一步提高redis的并发能力可以搭建主从集群&#xff0c;实现读写分离&#xff0c;一主多从&#xff0c;主节点写数据&#xff0c;从节点读数据 部署redis主从节点的docker-compose文件命令解析 version: &q…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…

GCC编译过程(预处理,编译,汇编,链接)及GCC命令

使用 gcc&#xff08;GNU Compiler Collection&#xff09; 编译一个 C 或 C 程序时&#xff0c;整个编译过程可以分为以下几个阶段&#xff1a; 1. 预处理&#xff08;Preprocessing&#xff09; 命令&#xff1a;gcc -E source.c -o source.i 在这一步&#xff0c;编译器处理…

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…

【机器学习】超简明Python基础教程

Python是一种简单易学、功能强大的编程语言&#xff0c;适用于数据分析、人工智能、Web开发、自动化脚本等多个领域。本教程面向零基础学习者&#xff0c;逐步讲解Python的基本概念、语法和操作。 1. 安装与运行 安装Python 从官网 Welcome to Python.org 下载适合自己系统的…

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务&#xff0c;并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码&#xff1a;小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

形态学图像处理(Morphological Image Processing)

形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写&#xff0c;并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像&#xff0c;毕竟个人还不能达到那种信手拈来的境界&#xff0c;忘了就是从零开始训练&#xff0…

[webgis 0基础到找工作]------JavaScript--DOM事件进阶 day10

1.事件流 事件流是对事件执行过程的描述&#xff0c;了解事件的执行过程有助于加深对事件的理解&#xff0c;提升开发实践中对事件运用的灵活度。 简言之&#xff0c;捕获阶段是【从父到子】的传导过程&#xff0c;冒泡阶段是【从子向父】的传导过程。 1.1捕获和冒泡 如果事件…

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了&#xff01;这篇是讲讲里面的东西。 再简单说一下强引用和弱引用&#xff0c;举个例子&#xff0c;我们平常new出来的对象就是强引用的&#xff0c;在栈中有强引用&#xff0c;所以在gc的时候&#xff0c;堆中的实例对象不会被清除掉。 弱引…

第一次shell作业

#接受用户输入的服务名称 read -p"输入需要部署的服务名称: " server_name if [ "service_name" "nginx" ]; then #判断服务是否安装 if command -v nginx > /dev/null 2>&1; then echo "nginx 已安装" #自定义网…