Unity可视化Shader工具ASE介绍——4、ASE的自定义模板使用

news2024/11/15 14:24:15

  大家好,我是阿赵。
  继续介绍Unity可视化Shader编辑工具ASE。之前的文章介绍了在ASE里面可以选择不同的Shader类型。这一篇来继续探讨一下,这些Shader类型究竟是什么。

一、所谓的Shader类型是什么

  选择不同的Shader类型,会出现不同的选项,这看起来很神奇。实际上,这些可以供我们选择的Shader类型,是ASE给我们做好的一些Shader模板。
在这里插入图片描述
在这里插入图片描述

  在AmplifyShaderEditor/Plugins/EditorResources/Templates文件夹里面,可以看到模板文件夹,里面有各种各样的模板。有一些是Package文件,需要导入才能看到。
  直接打开这些模板文件,或者在ASE编辑器里面点击Edit Template按钮,都能打开模板文件。
在这里插入图片描述
在这里插入图片描述

二、模板的结构

  这里用一个UI的shader模板作为例子,打开看看模板是长什么样子的

Shader /*ase_name*/"Hidden/Templates/Legacy/UIDefault"/*end*/
{
	Properties
	{
		[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
		_Color ("Tint", Color) = (1,1,1,1)
		
		_StencilComp ("Stencil Comparison", Float) = 8
		_Stencil ("Stencil ID", Float) = 0
		_StencilOp ("Stencil Operation", Float) = 0
		_StencilWriteMask ("Stencil Write Mask", Float) = 255
		_StencilReadMask ("Stencil Read Mask", Float) = 255

		_ColorMask ("Color Mask", Float) = 15

		[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
		/*ase_props*/
	}

	SubShader
	{
		Tags
		{ 
			"Queue"="Transparent"
			"IgnoreProjector"="True"
			"RenderType"="Transparent"
			"PreviewType"="Plane"
			"CanUseSpriteAtlas"="True"
		}
		
		Stencil
		{
			Ref [_Stencil]
			Comp [_StencilComp]
			Pass [_StencilOp] 
			ReadMask [_StencilReadMask]
			WriteMask [_StencilWriteMask]
		}

		Cull Off
		Lighting Off
		ZWrite Off
		ZTest [unity_GUIZTestMode]
		Blend SrcAlpha OneMinusSrcAlpha
		ColorMask [_ColorMask]

		/*ase_pass*/
		Pass
		{
			Name "Default"
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 3.0

			#include "UnityCG.cginc"
			#include "UnityUI.cginc"

			#pragma multi_compile __ UNITY_UI_CLIP_RECT
			#pragma multi_compile __ UNITY_UI_ALPHACLIP
			
			/*ase_pragma*/
			
			struct appdata_t
			{
				float4 vertex   : POSITION;
				float4 color    : COLOR;
				float2 texcoord : TEXCOORD0;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				/*ase_vdata:p=p;uv0=tc0.xy;c=c*/
			};

			struct v2f
			{
				float4 vertex   : SV_POSITION;
				fixed4 color    : COLOR;
				half2 texcoord  : TEXCOORD0;
				float4 worldPosition : TEXCOORD1;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				UNITY_VERTEX_OUTPUT_STEREO
				/*ase_interp(2,):sp=sp.xyzw;uv0=tc0.xy;c=c;uv1=tc1.xyzw*/
			};
			
			uniform fixed4 _Color;
			uniform fixed4 _TextureSampleAdd;
			uniform float4 _ClipRect;
			uniform sampler2D _MainTex;
			/*ase_globals*/
			
			v2f vert( appdata_t IN /*ase_vert_input*/ )
			{
				v2f OUT;
				UNITY_SETUP_INSTANCE_ID( IN );
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
				UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
				OUT.worldPosition = IN.vertex;
				/*ase_vert_code:IN=appdata_t;OUT=v2f*/
				
				OUT.worldPosition.xyz += /*ase_vert_out:Offset;Float3*/ float3( 0, 0, 0 ) /*end*/;
				OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

				OUT.texcoord = IN.texcoord;
				
				OUT.color = IN.color * _Color;
				return OUT;
			}

			fixed4 frag(v2f IN /*ase_frag_input*/ ) : SV_Target
			{
				/*ase_frag_code:IN=v2f*/
				half4 color = /*ase_frag_out:Color;Float4*/(tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color/*end*/;
				
				#ifdef UNITY_UI_CLIP_RECT
                color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
                #endif
				
				#ifdef UNITY_UI_ALPHACLIP
				clip (color.a - 0.001);
				#endif

				return color;
			}
		ENDCG
		}
	}
	CustomEditor "ASEMaterialInspector"
}

  可以看到,在这个模板文件里面,总体上的结构和我们平常看到的shader并没有太大的差异。不过在一些关键的地方,出现了/**/备注。比如/ase_name/或者/ase_props/这种。
  很显然,ASE模板是通过这种备注的形式,把一个模板shader划分了很多段,并且通过备注让生成最终代码时识别到每一个段的作用,并且用后面生成的代码作为替代。
  所以,这些包含了特定格式的备注,是必须存在的,不能随手把它们删掉了。如果我们需要修改模板,就要在理解了每个部分的作用的情况下,在允许的范围内添加或者减少内容。

三、自定义一个多Pass的模板

  虽然ASE已经提供了很多Shader类型的模板给我们用,但有时候,我们还是觉得这些Shader类型不够用。既然知道了模板的格式,那么我们自己也可以创建一些模板供自己使用。
  这里我打算写一个多个Pass的模板作为例子。
  原来的模板里面,基本上都只有一个输出,这是因为这些模板都只有一个Pass
在这里插入图片描述

  但有时候的效果,一个Pass是不够的,所以我们可能需要2个或者更多的Pass,比如这样:
在这里插入图片描述

  下面开始制作这个模板。

1、复制一个Unlit的模板,并自行改一个名字

在这里插入图片描述

2、打开这个模板文件,把里面的Shader名也改了

在这里插入图片描述

3、给当前的Pass命名

在这里插入图片描述

4、复制当前的Pass

在这里插入图片描述

  在复制的时候,记得要包含着/ase_pass/一起复制,复制完之后,把第二个pass的名字也改一下。
在第二个pass的结尾,需要加上/ase_pass_end/
在这里插入图片描述

5、查看模板

  如果一切正确,那么现在ShaderType里面,应该有刚刚制作的模板选择了。
在这里插入图片描述
在这里插入图片描述

  可以看到,第一个pass的名字,是和当前这个Shader的名字一样的,而第二个pass的名字,就是刚才在模板里面输入的UnitPass2了。

6、根据需要自定义选项

  可以看到,在生产的shader里面,可以选择所有的shader选项。
在这里插入图片描述

  有时候我们并不想所有的选项都是可选的,想隐藏一些。这里先看看为什么所有的选项都能看得到。
在这里插入图片描述

  这是因为在模板里面有一句注释/ase_all_modules/。这句话代表了,所有的属性都会显示出来。
  如果不想那样,那就把/ase_all_modules/删掉。这时候,就不是所有的选项都可以看得到了。
在这里插入图片描述

  接下来,如果需要什么属性,就在模板里面写,比如需要可以修改Blend混合模式,就把BlendMode加到模板里面
在这里插入图片描述

  这时候,该模板的shader就可以选择混合模式了
在这里插入图片描述

  如果把混合模式写在pass里面
在这里插入图片描述

  那么模板里面的混合模式选项也会到了pass里面
在这里插入图片描述

  其他的属性也是这样的原理,你想它出现在哪里,就在模板里面加在哪里。

四、总结

  介绍到了这一篇,ASE的神秘面纱已经被掀开了一大部分了。所谓的Shader类型,其实就是各种预先写好的模板文件。编辑节点,实际上就是用节点来生成中间的算法,然后再把这些算法通过模板文件指定的位置替代原有的内容,最终生成出Shader代码。
  理解了这些东西之后,就更容易发现,ASE是一个很方便的可视化工具,但它的一切还是建立在本身已经对Shader有一定了解的基础上的,而并不是通过使用ASE,就能把一个完全不懂写Shader的人变得会写Shader。ASE只是通过模板和节点,把写代码的过程加快或者省略掉,让编写Shader的人的精力集中于节点算法的连接,最后直接生成出可以用的代码。

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

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

相关文章

Unity 之 EditorGUILayout.BeginHorizontal/EndHorizontal异常报错问题

报错内容: 缘由:由于在EditorGUILayout.EndHorizontal()之前执行了类似打开窗口的逻辑 解决办法: 在EditorGUILayout.EndHorizontal()之前执行GUIUtility.ExitGUI();

vulnhub_driftingblues7靶机渗透测试

Driftingblues7靶机 文章目录 Driftingblues7靶机信息收集web渗透获取权限另外思路靶机总结 信息收集 使用nmap扫描得到靶机ip为192.168.78.174,开放发端口有很多,而且开放了443端口,所以访问网站是需要https协议的 再对该网站进行目录扫描&…

10-09 周一 图解机器学习之深度学习感知机学习

10-09 周一 图解机器学习之深度学习感知机学习 时间版本修改人描述2023年10月9日14:13:20V0.1宋全恒新建文档 简介 感知机是神经网络中的概念,1958年被Frank Rosenblatt第一次引入。感知机作为一种基本的神经网络模型,它模拟了人脑神经元的工作原理。感…

解决Feign的自定义解码器在接口返回值为void时不执行的问题

项目的接口有一个全局的响应包装器,将接口的所有返回,包括各种类型如List、Entity,或者void,以及抛出的异常,封装成统一的结构给到前端,所以在使用Feign发起远程调用的时候,需要一个自定义的解码…

详解 ElasticSearch 基础教程

🌹 分享 ElasticSearch 基础,请指教。🌹🌹 如你对技术也感兴趣,欢迎交流。🌹🌹🌹 如有对阁下帮助,请👍点赞💖收藏🐱‍🏍分…

Python 自动化Web测试

限于作者水平有限,以下内容可能是管窥之见,希望大家高抬贵手,且让我斗胆抛砖引玉。 公司产品迪备主要是通过网页操作来进行数据库的备份与恢复,监控与管理,因此在测试的过程中,可以用python测试脚本来模拟…

运维知识点汇总

一.公共基础 linux常用目录 链接一 链接二 linux系统启动 链接一 链接二 LVM 链接一 磁盘挂载 链接一 文件权限 链接一 二.VLAN详解 链接 三.中间件 单体部署: 优点: (1)小团队成型即可完成开发-测试-上线&am…

3D机器视觉:解锁未来的立体视野

原创 | 文 BFT机器人 机器视觉领域一直在不断演进,从最初的二维图像处理,逐渐扩展到了更复杂的三维领域,形成了3D机器视觉。3D机器视觉技术的涌现为计算机系统带来了全新的感知和理解能力,这一领域的发展正日益受到广泛关注。本文…

Android系统为什么采用Binder作为IPC机制

Android系统提供了多种进程间通信(IPC)的机制,用于不同进程之间的数据交换和通信。以下是Android系统中常用的几种IPC机制: Intent:Intent是Android系统中常用的一种进程间通信方式。通过发送Intent,可以在…

链表去重Java

去除掉链表中重复的元素,两种方法: static class ListNode{private int val;private ListNode next;public ListNode(int val, ListNode next) {this.val val;this.next next;}Overridepublic String toString() {return "ListNode{" "val" val ",…

【jvm】程序计数器

目录 一、介绍二、作用三、示例3.1 代码3.2 javap -v Test1.class3.2.1 操作指令及地址 一、介绍 1.jvm中的程序计数寄存器中(program counter register),register的命名源于cpu的寄存器,寄存器存储指令相关的现场信息 2.cpu只有把…

C++学习之指针和数组

指针和一维数组 一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既可以指向变量,当然也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。 eg: int a[6]; //定义一个整数数组a…

web:[HCTF 2018]admin

题目 点击页面显示如下 点击hctf显示 没有账号,先注册一个 随便注册一个试试看 输入账号密码显示如下 页面没有其他的提示,查看源代码 这里提示不是admin 先注册一个admin账号试一下 显示admin已经被注册了,所以知道用户名为admin&#xff0…

【图像分割】SAM、FastSAM与MobileSAM原理

文章目录 前言:Segment Anything一、FastSAM二、MobileSAM框架实验 总结 前言:Segment Anything Meta 今年发布了图像分割模型 Segment Anything Model (SAM) 。SAM 已经学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mas…

基于共生生物优化的BP神经网络(分类应用) - 附代码

基于共生生物优化的BP神经网络(分类应用) - 附代码 文章目录 基于共生生物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.共生生物优化BP神经网络3.1 BP神经网络参数设置3.2 共生生物算法应用 4.测试结果…

JDBC-day03(BLOB类型字段,批量插入)

四:操作BLOB类型字段 1.MySQL BLOB类型 在MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。可以用来存储图片,视频等 插入BLOB类型的数据必须使用PreparedStatement&#x…

redis,mongoDB,mysql,Elasticsearch区别

Redis: Redis是一种高性能键值存储数据库,基于内存操作,支持数据持久化,支持数据类型丰富灵活,如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、主从同步等功能,适用于访…

学习记忆——数学篇——案例——代数——函数——一元二次函数

记忆宫殿法 一元二次函数: y a x 2 b x c yax^2bxc yax2bxc a > 0 a>0 a>0,开口向上; a < 0 a<0 a<0,开口向下; x − b 2 a x-\frac{b}{2a…

2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录

摘要: 2023-10-09 python-使用psd_tools-读取psd信息及导出图层图片-记录 相关文档: Usage — psd-tools 1.9.28 documentation 读取psd的信息: py代码: from psd_tools import PSDImagepsd PSDImage.open(example.psd) #psd PSDImage.open(one.psd)print(psd)for layer in …

DirectX C++项目调试时报错:The FX file cannot be complied.

文章目录 遇到的问题错误排除方法经验总结 遇到的问题 在编虚拟现实的课程作业的时候,打算基于上一次的作业项目改一改来交,于是把上次项目的代码复制过来。生成解决方案的过程没有报错,但是在调试该项目时,报错内容如下图所示&a…