【学习日志】2022.11.18 Technical Artist Training Tutorial----Unlit Shader Of Unity
创始人
2024-02-08 14:08:58

着色器 - Unity 手册 (unity3d.com)icon-default.png?t=M85Bhttps://docs.unity3d.com/cn/current/Manual/Shaders.html

常用板块(Properties)

_MainTex("MainTex",2D)="black"{}
_Float("Float",Float)=0.0
_Range("Range",Range(0.0,1.0))=0.0
_Vector("Vector",Vector)=(1,1,1,1)
_Color("Color",Color)=(0.5,0.5,0.5,0.5)

Shader "CS02/MiniShader"  

 

Shader "CS02/MiniShader" //Shader的真正名字  可以是路径式的格式
{/*材质球参数及UI面板https://docs.unity3d.com/cn/current/Manual/SL-Properties.htmlhttps://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.htmlhttps://zhuanlan.zhihu.com/p/93194054*/Properties {_MainTex ("Texture", 2D) = "" {}_Float("Float", Float) = 0.0_Slider("Slider", Range(0.0,1.0)) = 0.07_Vector("Vector", Vector) = (.34, .85, .92, 1) }/*这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader或者配合LOD机制一起使用。一般写一个即可*/SubShader{/*标签属性,有两种:一种是SubShader层级,一种在Pass层级https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://docs.unity3d.com/cn/current/Manual/SL-PassTags.html*/Tags { "RenderType"="Opaque" } /*Pass里面的内容Shader代码真正起作用的地方,一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行*/Pass {CGPROGRAM  // Shader代码从这里开始#pragma vertex vert //指定一个名为"vert"的函数为顶点Shader#pragma fragment frag //指定一个名为"frag"函数为片元Shader#include "UnityCG.cginc"  //引用Unity内置的文件,很方便,有很多现成的函数提供使用//https://docs.unity3d.com/Manual/SL-VertexProgramInputs.htmlstruct appdata  //CPU向顶点Shader提供的模型数据{//冒号后面的是特定语义词,告诉CPU需要哪些类似的数据float4 vertex : POSITION; //模型空间顶点坐标half2 texcoord0 : TEXCOORD0; //第一套UVhalf2 texcoord1 : TEXCOORD1; //第二套UVhalf2 texcoord2 : TEXCOORD2; //第二套UVhalf2 texcoord4 : TEXCOORD3;  //模型最多只能有4套UVhalf4 color : COLOR; //顶点颜色half3 normal : NORMAL; //顶点法线half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)};struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据{float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据float2 uv : TEXCOORD0; //自定义数据体//注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。//插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader//最多可以写16个:TEXCOORD0 ~ TEXCOORD15。float3 normal : TEXCOORD1;};/*Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接*/sampler2D _MainTex;float4 _MainTex_ST;//Unity内置变量:https://docs.unity3d.com/560/Documentation/Manual/SL-UnityShaderVariables.html//Unity内置函数:https://docs.unity3d.com/560/Documentation/Manual/SL-BuiltinFunctions.html//顶点Shaderv2f vert (appdata v){v2f o;float4 pos_world = mul(unity_ObjectToWorld, v.vertex);float4 pos_view = mul(UNITY_MATRIX_V, pos_world);float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);o.pos = pos_clip;//o.pos = mul(UNITY_MATRIX_MVP, v.vertex);//o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;//o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.normal = v.normal;return o;}//片元Shaderhalf4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标){//fixed4 col = tex2D(_MainTex, i.uv);half4 col = float4(i.uv,0.0,0.0);return col;}ENDCG // Shader代码从这里结束}}
}

Shader "CS02/Texturing" 

Shader "CS02/Texturing" //Shader的真正名字  可以是路径式的格式
{/*材质球参数及UI面板https://docs.unity3d.com/cn/current/Manual/SL-Properties.htmlhttps://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.htmlhttps://zhuanlan.zhihu.com/p/93194054*/Properties {_MainTex ("Texture", 2D) = "" {}_Float("Float", Float) = 0.0_Debug("_Debug", Range(0.0,1.0)) = 0.0_Vector("Vector", Vector) = (.34, .85, .92, 1) [Enum(UnityEngine.Rendering.CullMode)]_CullMode("CullMode", float) = 2}/*这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader或者配合LOD机制一起使用。一般写一个即可*/SubShader{/*标签属性,有两种:一种是SubShader层级,一种在Pass层级https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://docs.unity3d.com/cn/current/Manual/SL-PassTags.html*/Tags { "RenderType"="Opaque" "DisableBatching"="True"} /*Pass里面的内容Shader代码真正起作用的地方,一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行*/Pass {Cull [_CullMode]CGPROGRAM  // Shader代码从这里开始#pragma vertex vert //指定一个名为"vert"的函数为顶点Shader#pragma fragment frag //指定一个名为"frag"函数为片元Shader#include "UnityCG.cginc"  //引用Unity内置的文件,很方便,有很多现成的函数提供使用//https://docs.unity3d.com/Manual/SL-VertexProgramInputs.htmlstruct appdata  //CPU向顶点Shader提供的模型数据{//冒号后面的是特定语义词,告诉CPU需要哪些类似的数据float4 vertex : POSITION; //模型空间顶点坐标half2 texcoord0 : TEXCOORD0; //第一套UVhalf2 texcoord1 : TEXCOORD1; //第二套UVhalf2 texcoord2 : TEXCOORD2; //第二套UVhalf2 texcoord4 : TEXCOORD3;  //模型最多只能有4套UVhalf4 color : COLOR; //顶点颜色half3 normal : NORMAL; //顶点法线half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)};struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据{float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据float2 uv : TEXCOORD0; //自定义数据体//注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。//插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader//最多可以写16个:TEXCOORD0 ~ TEXCOORD15。float3 pos_local : TEXCOORD1;//float3 pos_pivot : TEXCOORD2;};/*Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接*/sampler2D _MainTex;float4 _MainTex_ST;float _Debug;//顶点Shaderv2f vert (appdata v){v2f o;float4 pos_world = mul(unity_ObjectToWorld, v.vertex);float4 pos_view = mul(UNITY_MATRIX_V, pos_world);float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);o.pos = pos_clip;//o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;//o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.pos_local = v.vertex.xyz;return o;}//片元Shaderhalf4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标){float dist = distance(i.pos_local,float3(0.0,0.0,0.0));float arc = (atan2(i.pos_local.x, i.pos_local.y) / (UNITY_PI) + 1.0) * 2.0;float2 uv_fix = float2(arc, dist);half4 col = tex2D(_MainTex, i.uv.xy);half4 col_fix = tex2D(_MainTex, uv_fix);half4 finalcolor = lerp(col, col_fix, _Debug);return finalcolor;}ENDCG // Shader代码从这里结束}}
}

Shader "CS02/Clip" 

Shader "CS02/Clip" //Shader的真正名字  可以是路径式的格式
{/*材质球参数及UI面板https://docs.unity3d.com/cn/current/Manual/SL-Properties.htmlhttps://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.htmlhttps://zhuanlan.zhihu.com/p/93194054*/Properties {_MainTex ("Texture", 2D) = "" {}_MainColor("Main Color",Color) = (1,1,1,1)_NoiseMap("NoiseMap", 2D) = "" {}_Cutout("Cutout", Range(0.0,1.1)) = 0.0_Speed("Speed", Vector) = (.34, .85, .92, 1)}/*这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader或者配合LOD机制一起使用。一般写一个即可*/SubShader{/*标签属性,有两种:一种是SubShader层级,一种在Pass层级https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://docs.unity3d.com/cn/current/Manual/SL-PassTags.html*/Tags { "RenderType"="Opaque" "DisableBatching"="True"} /*Pass里面的内容Shader代码真正起作用的地方,一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行*/Pass {CGPROGRAM  // Shader代码从这里开始#pragma vertex vert //指定一个名为"vert"的函数为顶点Shader#pragma fragment frag //指定一个名为"frag"函数为片元Shader#include "UnityCG.cginc"  //引用Unity内置的文件,很方便,有很多现成的函数提供使用//https://docs.unity3d.com/Manual/SL-VertexProgramInputs.htmlstruct appdata  //CPU向顶点Shader提供的模型数据{//冒号后面的是特定语义词,告诉CPU需要哪些类似的数据float4 vertex : POSITION; //模型空间顶点坐标half2 texcoord0 : TEXCOORD0; //第一套UVhalf2 texcoord1 : TEXCOORD1; //第二套UVhalf2 texcoord2 : TEXCOORD2; //第二套UVhalf2 texcoord4 : TEXCOORD3;  //模型最多只能有4套UVhalf4 color : COLOR; //顶点颜色half3 normal : NORMAL; //顶点法线half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)};struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据{float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据float4 uv : TEXCOORD0; //自定义数据体//注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。//插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader//最多可以写16个:TEXCOORD0 ~ TEXCOORD15。float3 pos_local : TEXCOORD1;//float3 pos_pivot : TEXCOORD2;};/*Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接*/sampler2D _MainTex;float4 _MainTex_ST;float _Cutout;float4 _Speed;sampler2D _NoiseMap;float4 _NoiseMap_ST;float4 _MainColor;//顶点Shaderv2f vert (appdata v){v2f o;float4 pos_world = mul(unity_ObjectToWorld, v.vertex);float4 pos_view = mul(UNITY_MATRIX_V, pos_world);float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);o.pos = pos_clip;//o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;o.uv.zw = v.texcoord0 * _NoiseMap_ST.xy + _NoiseMap_ST.zw;//o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.pos_local = v.vertex.xyz;return o;}//片元Shaderhalf4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标){half gradient = tex2D(_MainTex, i.uv.xy + _Time.y * 0.1f * _Speed.xy).r * (1.0 - i.uv.y);half noise = 1.0 - tex2D(_NoiseMap, i.uv.zw + _Time.y * 0.1f * _Speed.zw).r;clip(gradient - noise -  _Cutout);return _MainColor;}ENDCG // Shader代码从这里结束}}
}

Shader "CS02/Blending"  

Shader "CS02/Blending" //Shader的真正名字  可以是路径式的格式
{/*材质球参数及UI面板https://docs.unity3d.com/cn/current/Manual/SL-Properties.htmlhttps://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html*/Properties {_MainTex ("Texture", 2D) = "" {}_MainColor("Main Color",Color) = (1,1,1,1)_Emiss("Emiss", Float) = 1.0_Speed("Speed", Vector) = (.34, .85, .92, 1)}/*这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader或者配合LOD机制一起使用。一般写一个即可*/SubShader{/*标签属性,有两种:一种是SubShader层级,一种在Pass层级https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://docs.unity3d.com/cn/current/Manual/SL-PassTags.html*/Tags { "Queue" = "Transparent" }/*Pass里面的内容Shader代码真正起作用的地方,一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行*/Pass {//Blending:https://docs.unity3d.com/Manual/SL-Blend.htmlZWrite Off//Blend SrcAlpha OneMinusSrcAlpha Blend One OneMinusSrcAlpha//Blend SrcAlpha One//Blend DstColor ZeroCGPROGRAM  // Shader代码从这里开始	#pragma vertex vert //指定一个名为"vert"的函数为顶点Shader#pragma fragment frag //指定一个名为"frag"函数为片元Shader#include "UnityCG.cginc"  //引用Unity内置的文件,很方便,有很多现成的函数提供使用//https://docs.unity3d.com/Manual/SL-VertexProgramInputs.htmlstruct appdata  //CPU向顶点Shader提供的模型数据{//冒号后面的是特定语义词,告诉CPU需要哪些类似的数据float4 vertex : POSITION; //模型空间顶点坐标half2 texcoord0 : TEXCOORD0; //第一套UVhalf2 texcoord1 : TEXCOORD1; //第二套UVhalf2 texcoord2 : TEXCOORD2; //第二套UVhalf2 texcoord4 : TEXCOORD3;  //模型最多只能有4套UVhalf4 color : COLOR; //顶点颜色half3 normal : NORMAL; //顶点法线half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)};struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据{float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据float4 uv : TEXCOORD0; //自定义数据体//注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。//插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader//最多可以写16个:TEXCOORD0 ~ TEXCOORD15。float3 pos_local : TEXCOORD1;//float3 pos_pivot : TEXCOORD2;};/*Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接*/sampler2D _MainTex;float4 _MainTex_ST;float _Cutout;float4 _Speed;sampler2D _NoiseMap;float4 _NoiseMap_ST;float4 _MainColor;float _Emiss;//顶点Shaderv2f vert (appdata v){v2f o;float4 pos_world = mul(unity_ObjectToWorld, v.vertex);float4 pos_view = mul(UNITY_MATRIX_V, pos_world);float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);o.pos = pos_clip;//o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;o.uv.zw = v.texcoord0 * _NoiseMap_ST.xy + _NoiseMap_ST.zw;//o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.pos_local = v.vertex.xyz;return o;}//片元Shaderhalf4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标){half4 gradient = tex2D(_MainTex, i.uv.xy + _Time.y * 0.1f * _Speed.xy);float4 final_color = gradient.rrrr * _MainColor * _Emiss;return final_color;}ENDCG // Shader代码从这里结束}}
}

Shader "CS02/Rim" 

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "CS02/Rim" //Shader的真正名字  可以是路径式的格式
{/*材质球参数及UI面板https://docs.unity3d.com/cn/current/Manual/SL-Properties.htmlhttps://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html*/Properties {_MainTex ("Texture", 2D) = "" {}_MainColor("Main Color",Color) = (1,1,1,1)_Emiss("Emiss", Float) = 1.0_Speed("Speed", Vector) = (.34, .85, .92, 1)}SubShader{/*标签属性,有两种:一种是SubShader层级,一种在Pass层级https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://docs.unity3d.com/cn/current/Manual/SL-PassTags.html*/Tags { "Queue" = "Transparent" }Pass {Cull Off ZWrite On ColorMask 0CGPROGRAMfloat4 _Color;#pragma vertex vert #pragma fragment fragfloat4 vert(float4 vertexPos : POSITION) : SV_POSITION{return UnityObjectToClipPos(vertexPos);}float4 frag(void) : COLOR{return _Color;}ENDCG}Pass {//Blending:https://docs.unity3d.com/Manual/SL-Blend.htmlZWrite Off//Blend SrcAlpha OneMinusSrcAlpha Blend SrcAlpha One//Blend DstColor ZeroCGPROGRAM  // Shader代码从这里开始	#pragma vertex vert //指定一个名为"vert"的函数为顶点Shader#pragma fragment frag //指定一个名为"frag"函数为片元Shader#include "UnityCG.cginc"  //引用Unity内置的文件,很方便,有很多现成的函数提供使用struct appdata  //CPU向顶点Shader提供的模型数据{float4 vertex : POSITION; //模型空间顶点坐标half2 texcoord0 : TEXCOORD0; //第一套UVhalf3 normal : NORMAL; //顶点法线};struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据{float4 pos : SV_POSITION; float2 uv : TEXCOORD0;float3 pos_world : TEXCOORD1;float3 normal_world : TEXCOORD2;};/*Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接*/sampler2D _MainTex;float4 _MainTex_ST;float _Cutout;float4 _Speed;sampler2D _NoiseMap;float4 _NoiseMap_ST;float4 _MainColor;float _Emiss;//Unity内置变量:https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html//顶点Shaderv2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;float4 pos_world = mul(unity_ObjectToWorld, v.vertex);o.pos_world = pos_world.xyz;o.normal_world = normalize(mul(float4(v.normal,0.0), unity_WorldToObject).xyz);return o;}//片元Shaderhalf4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标){float3 normal_world = normalize(i.normal_world);float3 view_world = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);float NdotV = saturate(dot(normal_world, view_world));float alpha = saturate(_MainColor.a / NdotV);return float4(_MainColor.xyz * _Emiss, alpha);}ENDCG // Shader代码从这里结束}}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...