设置Unity URP管线中的渲染开关
在上一节中,我们添加了外轮廓线,但这个外轮廓线在所有使用该Shader的网格上是始终存在的。
如果我们想做一个开关,决定是否打开外轮廓线时,我们可以使用一个新的Uniform bool值,然后判断bool是否为true来开启外轮廓线。
但是这样会造成性能的浪费,因为就算我们没有开启这个功能,Shader还是会遍历每一个if条件。这与GPU的运行原理有关。
故我们使用Unity的多编译功能,将Shader多次编译成多个子Shader。
Shader中添加开关
定义开关名称
// 自定义关键字
[Toggle(_ENABLE_OUTLINE_ON)] _EnableOutline("Enable OutLine", Float) = 0.0
// 默认关键字(默认为 名称大写+_ON)
[Toggle] _EnableOutline("Enable OutLine", Float) = 0.0
// 默认关键字为(_ENABLEOUTLINE_ON)
在Input中声明变量
1.
half _EnableInline;2.
#ifdef UNITY_DOTS_INSTANCING_ENABLED
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)...UNITY_DOTS_INSTANCED_PROP(float , _EnableInline)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)3.
#define _EnableInline UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float , Metadata__EnableInline)
定义关键字
//pass中定义
#progma shader_feature _ENABLE_OUTLINE_ON//自定义关键字
#progma shader_feature _ENABLEOUTLINE_ON//默认关键字
使用关键字
#if defined(_ENABLE_OUTLINE_ON)#else#endif
在GUI中设置开关,来控制该关键字
在子GUI面板中添加按钮设置Shader中变量值
public static class Styles
{public static readonly GUIContent InlineEnable = new GUIContent("开启内勾边","");
}public struct LitProperties
{public MaterialProperty InlineEnabled;public LitProperties(MaterialProperty[] properties){InlineEnabled = BaseShaderGUI.FindProperty("_EnableInline", properties, false);}
}/// <summary>
/// 当滚轮滑动材质Inspector面板时,该函数调用4+次
/// 当修改参数或点击按钮时,该函数也会调用约8-12次
/// 因此可将该函数看作多次遍历的函数
/// </summary>
public static void DoDetailArea(LitProperties properties, MaterialEditor materialEditor)
{materialEditor.ColorProperty(properties.OutLineColor, Styles.OutLineColorContent.text);materialEditor.FloatProperty(properties.OutLineSize, Styles.OutLineSizeContent.text);// 显示按钮,设置GUI按钮的值,返回开关选中的状态bool inlineEnabled = EditorGUILayout.Toggle(Styles.InlineEnable, properties.InlineEnabled.floatValue > 0.5f);// 根据按钮的选中状态修改Shader值properties.InlineEnabled.floatValue = inlineEnabled ? 1f : 0f;// BeginDisabledGroup参数填True,则为禁用Begin至End直接的功能。在untiy面板上置灰。EditorGUI.BeginDisabledGroup(!inlineEnabled);{materialEditor.FloatProperty(properties.InlineSize, Styles.InlineSizeContent.text);materialEditor.FloatProperty(properties.Inlineluminance, Styles.InlineluminanceContent.text);materialEditor.FloatProperty(properties.HightLightTransition, Styles.HightLightTransitionContent.text);}EditorGUI.EndDisabledGroup();
}
此时,便可以通过按钮设置properties.InlineEnabled.floatValue的值了。
根据Shader中变量值,设置宏的值
根据Shader中变量值"_EnableInline",设置宏"_ENABLE_INLINE_ON"的值
public static void SetMaterialKeywords(Material material)
{if (material.HasProperty("_EnableInline")){bool isSnowEnabled = material.GetFloat("_EnableInline") > 0.5f;CoreUtils.SetKeyword(material, "_ENABLE_INLINE_ON", isSnowEnabled);}
}
当用户使用这个ShaderGUI将材质加载到内存中或者改变Inspector中的值时,编辑器调用下面这个方法。我们在这个方法中调用SetMaterialKeywords函数
public override void ValidateMaterial(Material material)
{CP_DragonOutLineGUI.SetMaterialKeywords(material);
}
该方法可用于设置材质中的各个宏定义。
相关文章:
设置Unity URP管线中的渲染开关
在上一节中,我们添加了外轮廓线,但这个外轮廓线在所有使用该Shader的网格上是始终存在的。 如果我们想做一个开关,决定是否打开外轮廓线时,我们可以使用一个新的Uniform bool值,然后判断bool是否为true来开启外轮廓线…...
神器抓包工具 HTTP Analyzer v7.5 的下载,安装,使用,破解说明以及可能遇到的问题
文章目录 1、HTTP Analyzer 工具能干什么?2、HTTP Analyzer 如何下载?3、如何安装?4、如何使用?5、如何破解?6、Http AnalyzerStd V7可能遇到的问题 1、HTTP Analyzer 工具能干什么? A1:HTTP A…...
虚幻引擎:代理
一、代理类型 1.单薄代理 特点:允许有返回值,允许有参数,只可以一对一的传递消息就算绑定多个,但是总会被最后一个覆盖 2.多播代理 特点:不允许有返回值,允许有参数允许一对多传递消息 3.动态代理 …...
Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现
文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…...
网络协议--Traceroute程序
8.1 引言 由Van Jacobson编写的Traceroute程序是一个能更深入探索TCP/IP协议的方便可用的工具。尽管不能保证从源端发往目的端的两份连续的IP数据报具有相同的路由,但是大多数情况下是这样的。Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过…...
Centos磁盘问题小纪
场景说明 放个windows的图片镇楼,在给一个centos的来说明问题,咋了,好好的系统,啥也不能干了 来先上一波命令分析下问题 查看挂载 mount 重新挂载数据 mount -o remount, rw / 查看磁盘 df -h 查看分区挂载详情 rw读写权限 mount …...
计算机网络第三章习题
1.假定1km长的CSMA/CD网络的数据率为1Gb/s。设信号在网络上的传播 速率为200000km/s。求能够使用此协议的最短帧长. 问题刨析: 逻辑链: 最短帧长数据传输率x争用期2τ(2倍端到端所需要的时间) 题目已经给出数据率为1Gb/s,所以我们要知道争用期2τ是多少. 端到端所需要的时间信…...
Layui弹出层关闭后页面自动刷新的用法以及建议
首先在HTML中定义一个查询按钮 <div class"layui-inline"><button class"layui-btn" id"searchBtn" lay-submit lay-filter"data-search-btn" > <i class"layui-icon layui-icon-search">查询</i&…...
PHP 在线考试管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp
一、源码特点 PHP 在线考试管理系统是一套完善的web设计系统 layUI技术布局 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 PHP 在线考试系统1 代码 https://download.csdn.net/download/qq_41…...
【茫茫架构路】1. Class File字节码文件解析
本文所有内容的JDK版本为 OpenJDK 11 JDK11 Class File官方说明。 Java解析字节码文件源码参考,以下为部分字节码解析源码展示。 public ClassFile(DataInputStream in) {try {//magic: 0xCAFEBABEthis.magic ClassReader.readInt(in);System.out.println("m…...
Golang笔记
01 = 和 := 的区别? 前者是赋值变量,后者是定义变量 02 指针的作用 指针指向变量的地址,在64位机器上占8个字节 【1 字节(Byte)= 8 位(bit) 1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】 作用 取址然后取值swap函数 交换变量的值指针接收器来改变结构体里面…...
在Linux上安装RStudio工具并实现本地远程访问【内网穿透】
文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…...
leetcode 128. 最长连续序列
2023.10.23 本题思路:遍历所有元素,对当前元素num进行查找:有无元素(num1)、有无元素(num2)......若有则继续查找下去,同时记录最大序列长度,无则遍历下一个元素。 考虑到数组中可能有重复元素需要去重,并且…...
k8s-----4、yaml文件,做资源编排和资源对象部署
yaml文件 1、YAML 文件概述2、YAML 文件书写格式3、资源清单描述方法4、yaml文件编写4.1 没有真正部署资源的过程4.2 资源已经存在的时候 5、yaml文件中必须存在的属性 1、YAML 文件概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML࿰…...
proteus中仿真arduino的水位测试传感器
一、原理介绍 我们这里使用的水位传感器,只能说是一个小实验用途的水位传感器。我们首先上图 如上图所示,线没有连接,传感器由许5对裸露在外的铜线片作为传感部分,当浸入水中时这些铜线片会被水桥接。 这些被水连接起来的铜线&a…...
设计模式-单例模式 (Singleton)
单例模式 (Singleton) 单例模式是一种创建型设计模式,它确保类只有一个实例,并提供了一种访问该实例的全局方法。这种模式有助于确保系统中的某些组件只有一个实例,并提供了一种方便的方法来访问该实例。 1、单例类只…...
程序包org.apache.ibatis.mapping不存在 符号找不到
找不到符号 符号: 类 Cursor和程序包org.apache.ibatis.mapping不存在 在idea中没有错误,但是在linux编辑时报了这两个错误,之前有遇见过符号找不到的问题, 当时的问题是编译的import xxx.xxx.xxx.* 识别不成功过,将*改为…...
Microsoft Edge浏览器中使用免费的ChatGPT
一、双击打开浏览器 找到:扩展,打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页,使用GPT 六、使用举例 提问 GPT回复...
Python 框架学习 Django篇 (五) Session与Token认证
我们前面经过数据库的学习已经基本了解了怎么接受前端发过来的请求,并处理后返回数据实现了一个基本的登录登出效果,但是存在一个问题,我们是将所有的请求都直接处理了,并没有去检查是否为已经登录的管理员发送的,如果…...
cocos creator 小游戏允许他人访问本地项目
需求背景: 发版成微信小游戏前,需要策划介入体验。不上传微信体验版本 实现: 1.发布平台选择web桌面端 2.构建完成后点击运行从浏览器上获取本地的运行地址 3.winR ——》 cmd 控制台 输入 ipconfig 找到IPv4地址,替换本地部分 …...
WSL2中Ubuntu主机名修改全攻略:告别大写字母烦恼
WSL2中Ubuntu主机名修改全攻略:告别大写字母烦恼 在开发者的日常工作中,WSL2已经成为连接Windows与Linux世界的桥梁。然而,这个看似完美的解决方案却隐藏着一个令人头疼的小问题——默认主机名中的大写字母。当你在Ubuntu终端中看到那个包含大…...
hadoop+Spark+Java基于搜索日志的图文推荐系统设计(源码+文档+调试+可视化大屏)
前言本文介绍了一款使用spring boot开发的搜索日志的图文推荐,及其设计与实现过程。根据软件工程对软件系统开发定制的规则和标准,详细的介绍了系统的分析与设计过程,并且详细的概括了系统的开发与测试过程,将其与JAVA语言紧密结合…...
FDTD实战:TFSF全场散射场光源的斜入射仿真与边界条件精解
1. TFSF光源与斜入射仿真的核心概念 第一次接触FDTD仿真时,我被各种光源类型搞得头晕眼花。直到实际用TFSF(Total Field Scattered Field)光源做了几个纳米颗粒散射案例,才发现这简直是处理散射问题的"瑞士军刀"。简单来…...
Hunyuan-OCR-WEBUI数据安全攻略:手把手教你设置自动备份
Hunyuan-OCR-WEBUI数据安全攻略:手把手教你设置自动备份 1. 为什么你的OCR数据需要自动备份 想象一下这样的场景:你刚刚用Hunyuan-OCR-WEBUI完成了1000份合同文档的识别工作,所有结果都已经整理归档。突然,服务器硬盘故障&#…...
实测对比:BEYOND REALITY Z-Image如何解决AI人像模糊、全黑图问题?
实测对比:BEYOND REALITY Z-Image如何解决AI人像模糊、全黑图问题? 在AI图像生成领域,人像创作一直是最具挑战性的任务之一。传统模型常常面临生成结果模糊、细节缺失,甚至出现全黑图像等问题。今天,我们将通过实测对…...
DIC分析中图像命名与种子点选择的实战技巧:以MultiDIC处理材料变形序列图为例
DIC分析中图像命名与种子点选择的实战技巧:以MultiDIC处理材料变形序列图为例 在材料力学性能研究中,数字图像相关技术(DIC)已成为测量物体表面位移和应变的重要工具。然而,许多研究者在实际操作中常常遇到分析结果不稳…...
NetworkX实战:从节点到图结构的特征提取全解析
1. NetworkX与图特征提取入门指南 第一次接触NetworkX时,我被这个强大的Python库震撼到了。它就像一把瑞士军刀,能轻松处理各种复杂的网络分析任务。记得当时我用它分析公司内部通讯网络,短短几行代码就找出了信息传递的关键节点,…...
GraphRAG v2.7.0实战:用《圣诞颂歌》小说快速构建你的第一个知识图谱问答系统
GraphRAG v2.7.0实战:用《圣诞颂歌》构建知识图谱问答系统 狄更斯的《圣诞颂歌》不仅是一部经典文学作品,更是一个充满丰富人物关系和情节转折的完美知识图谱样本。当技术爱好者第一次接触GraphRAG时,最迫切的需求往往不是理论讲解࿰…...
UR机器人实时数据解析-Python实战(30003端口篇)
1. 为什么需要解析UR机器人实时数据? 在工业自动化领域,UR(Universal Robots)协作机器人因其编程简单、部署灵活而广受欢迎。但很多开发者可能不知道,通过30003端口获取的实时数据,能让我们像给机器人做&qu…...
ConvNeXt 系列改进:二次创新 ConvNeXt:结合 RepVGG 结构重参数化,训练多分支、推理单路
关键词:ConvNeXt RepVGG 结构重参数化 推理加速 模型部署 写在前面 2026年的视觉模型赛道呈现出一种有趣的“返璞归真”趋势——在Transformer狂飙数年之后,卷积网络正以全新的姿态回归。这其中,ConvNeXt无疑是纯卷积阵营中最耀眼的明星。从2022年Meta AI首次提出至今,…...
