• 【学习日志】2022.11.18 Technical Artist Training Tutorial----Unlit Shader Of Unity


    着色器 - 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"  

     

    1. Shader "CS02/MiniShader" //Shader的真正名字 可以是路径式的格式
    2. {
    3. /*材质球参数及UI面板
    4. https://docs.unity3d.com/cn/current/Manual/SL-Properties.html
    5. https://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html
    6. https://zhuanlan.zhihu.com/p/93194054
    7. */
    8. Properties
    9. {
    10. _MainTex ("Texture", 2D) = "" {}
    11. _Float("Float", Float) = 0.0
    12. _Slider("Slider", Range(0.0,1.0)) = 0.07
    13. _Vector("Vector", Vector) = (.34, .85, .92, 1)
    14. }
    15. /*
    16. 这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。
    17. 提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader
    18. 或者配合LOD机制一起使用。
    19. 一般写一个即可
    20. */
    21. SubShader
    22. {
    23. /*
    24. 标签属性,有两种:一种是SubShader层级,一种在Pass层级
    25. https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.html
    26. https://docs.unity3d.com/cn/current/Manual/SL-PassTags.html
    27. */
    28. Tags { "RenderType"="Opaque" }
    29. /*
    30. Pass里面的内容Shader代码真正起作用的地方,
    31. 一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)
    32. 一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行
    33. */
    34. Pass
    35. {
    36. CGPROGRAM // Shader代码从这里开始
    37. #pragma vertex vert //指定一个名为"vert"的函数为顶点Shader
    38. #pragma fragment frag //指定一个名为"frag"函数为片元Shader
    39. #include "UnityCG.cginc" //引用Unity内置的文件,很方便,有很多现成的函数提供使用
    40. //https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html
    41. struct appdata //CPU向顶点Shader提供的模型数据
    42. {
    43. //冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
    44. float4 vertex : POSITION; //模型空间顶点坐标
    45. half2 texcoord0 : TEXCOORD0; //第一套UV
    46. half2 texcoord1 : TEXCOORD1; //第二套UV
    47. half2 texcoord2 : TEXCOORD2; //第二套UV
    48. half2 texcoord4 : TEXCOORD3; //模型最多只能有4套UV
    49. half4 color : COLOR; //顶点颜色
    50. half3 normal : NORMAL; //顶点法线
    51. half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
    52. };
    53. struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
    54. {
    55. float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
    56. float2 uv : TEXCOORD0; //自定义数据体
    57. //注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。
    58. //插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader
    59. //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
    60. float3 normal : TEXCOORD1;
    61. };
    62. /*
    63. Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接
    64. */
    65. sampler2D _MainTex;
    66. float4 _MainTex_ST;
    67. //Unity内置变量:https://docs.unity3d.com/560/Documentation/Manual/SL-UnityShaderVariables.html
    68. //Unity内置函数:https://docs.unity3d.com/560/Documentation/Manual/SL-BuiltinFunctions.html
    69. //顶点Shader
    70. v2f vert (appdata v)
    71. {
    72. v2f o;
    73. float4 pos_world = mul(unity_ObjectToWorld, v.vertex);
    74. float4 pos_view = mul(UNITY_MATRIX_V, pos_world);
    75. float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);
    76. o.pos = pos_clip;
    77. //o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    78. //o.pos = UnityObjectToClipPos(v.vertex);
    79. o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;
    80. //o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    81. o.normal = v.normal;
    82. return o;
    83. }
    84. //片元Shader
    85. half4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
    86. {
    87. //fixed4 col = tex2D(_MainTex, i.uv);
    88. half4 col = float4(i.uv,0.0,0.0);
    89. return col;
    90. }
    91. ENDCG // Shader代码从这里结束
    92. }
    93. }
    94. }

    Shader "CS02/Texturing" 

    1. Shader "CS02/Texturing" //Shader的真正名字 可以是路径式的格式
    2. {
    3. /*材质球参数及UI面板
    4. https://docs.unity3d.com/cn/current/Manual/SL-Properties.html
    5. https://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html
    6. https://zhuanlan.zhihu.com/p/93194054
    7. */
    8. Properties
    9. {
    10. _MainTex ("Texture", 2D) = "" {}
    11. _Float("Float", Float) = 0.0
    12. _Debug("_Debug", Range(0.0,1.0)) = 0.0
    13. _Vector("Vector", Vector) = (.34, .85, .92, 1)
    14. [Enum(UnityEngine.Rendering.CullMode)]_CullMode("CullMode", float) = 2
    15. }
    16. /*
    17. 这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。
    18. 提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader
    19. 或者配合LOD机制一起使用。
    20. 一般写一个即可
    21. */
    22. SubShader
    23. {
    24. /*
    25. 标签属性,有两种:一种是SubShader层级,一种在Pass层级
    26. https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.html
    27. https://docs.unity3d.com/cn/current/Manual/SL-PassTags.html
    28. */
    29. Tags { "RenderType"="Opaque" "DisableBatching"="True"}
    30. /*
    31. Pass里面的内容Shader代码真正起作用的地方,
    32. 一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)
    33. 一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行
    34. */
    35. Pass
    36. {
    37. Cull [_CullMode]
    38. CGPROGRAM // Shader代码从这里开始
    39. #pragma vertex vert //指定一个名为"vert"的函数为顶点Shader
    40. #pragma fragment frag //指定一个名为"frag"函数为片元Shader
    41. #include "UnityCG.cginc" //引用Unity内置的文件,很方便,有很多现成的函数提供使用
    42. //https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html
    43. struct appdata //CPU向顶点Shader提供的模型数据
    44. {
    45. //冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
    46. float4 vertex : POSITION; //模型空间顶点坐标
    47. half2 texcoord0 : TEXCOORD0; //第一套UV
    48. half2 texcoord1 : TEXCOORD1; //第二套UV
    49. half2 texcoord2 : TEXCOORD2; //第二套UV
    50. half2 texcoord4 : TEXCOORD3; //模型最多只能有4套UV
    51. half4 color : COLOR; //顶点颜色
    52. half3 normal : NORMAL; //顶点法线
    53. half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
    54. };
    55. struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
    56. {
    57. float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
    58. float2 uv : TEXCOORD0; //自定义数据体
    59. //注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。
    60. //插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader
    61. //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
    62. float3 pos_local : TEXCOORD1;
    63. //float3 pos_pivot : TEXCOORD2;
    64. };
    65. /*
    66. Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接
    67. */
    68. sampler2D _MainTex;
    69. float4 _MainTex_ST;
    70. float _Debug;
    71. //顶点Shader
    72. v2f vert (appdata v)
    73. {
    74. v2f o;
    75. float4 pos_world = mul(unity_ObjectToWorld, v.vertex);
    76. float4 pos_view = mul(UNITY_MATRIX_V, pos_world);
    77. float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);
    78. o.pos = pos_clip;
    79. //o.pos = UnityObjectToClipPos(v.vertex);
    80. o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;
    81. //o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    82. o.pos_local = v.vertex.xyz;
    83. return o;
    84. }
    85. //片元Shader
    86. half4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
    87. {
    88. float dist = distance(i.pos_local,float3(0.0,0.0,0.0));
    89. float arc = (atan2(i.pos_local.x, i.pos_local.y) / (UNITY_PI) + 1.0) * 2.0;
    90. float2 uv_fix = float2(arc, dist);
    91. half4 col = tex2D(_MainTex, i.uv.xy);
    92. half4 col_fix = tex2D(_MainTex, uv_fix);
    93. half4 finalcolor = lerp(col, col_fix, _Debug);
    94. return finalcolor;
    95. }
    96. ENDCG // Shader代码从这里结束
    97. }
    98. }
    99. }

    Shader "CS02/Clip" 

    1. Shader "CS02/Clip" //Shader的真正名字 可以是路径式的格式
    2. {
    3. /*材质球参数及UI面板
    4. https://docs.unity3d.com/cn/current/Manual/SL-Properties.html
    5. https://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html
    6. https://zhuanlan.zhihu.com/p/93194054
    7. */
    8. Properties
    9. {
    10. _MainTex ("Texture", 2D) = "" {}
    11. _MainColor("Main Color",Color) = (1,1,1,1)
    12. _NoiseMap("NoiseMap", 2D) = "" {}
    13. _Cutout("Cutout", Range(0.0,1.1)) = 0.0
    14. _Speed("Speed", Vector) = (.34, .85, .92, 1)
    15. }
    16. /*
    17. 这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。
    18. 提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader
    19. 或者配合LOD机制一起使用。
    20. 一般写一个即可
    21. */
    22. SubShader
    23. {
    24. /*
    25. 标签属性,有两种:一种是SubShader层级,一种在Pass层级
    26. https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.html
    27. https://docs.unity3d.com/cn/current/Manual/SL-PassTags.html
    28. */
    29. Tags { "RenderType"="Opaque" "DisableBatching"="True"}
    30. /*
    31. Pass里面的内容Shader代码真正起作用的地方,
    32. 一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)
    33. 一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行
    34. */
    35. Pass
    36. {
    37. CGPROGRAM // Shader代码从这里开始
    38. #pragma vertex vert //指定一个名为"vert"的函数为顶点Shader
    39. #pragma fragment frag //指定一个名为"frag"函数为片元Shader
    40. #include "UnityCG.cginc" //引用Unity内置的文件,很方便,有很多现成的函数提供使用
    41. //https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html
    42. struct appdata //CPU向顶点Shader提供的模型数据
    43. {
    44. //冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
    45. float4 vertex : POSITION; //模型空间顶点坐标
    46. half2 texcoord0 : TEXCOORD0; //第一套UV
    47. half2 texcoord1 : TEXCOORD1; //第二套UV
    48. half2 texcoord2 : TEXCOORD2; //第二套UV
    49. half2 texcoord4 : TEXCOORD3; //模型最多只能有4套UV
    50. half4 color : COLOR; //顶点颜色
    51. half3 normal : NORMAL; //顶点法线
    52. half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
    53. };
    54. struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
    55. {
    56. float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
    57. float4 uv : TEXCOORD0; //自定义数据体
    58. //注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。
    59. //插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader
    60. //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
    61. float3 pos_local : TEXCOORD1;
    62. //float3 pos_pivot : TEXCOORD2;
    63. };
    64. /*
    65. Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接
    66. */
    67. sampler2D _MainTex;
    68. float4 _MainTex_ST;
    69. float _Cutout;
    70. float4 _Speed;
    71. sampler2D _NoiseMap;
    72. float4 _NoiseMap_ST;
    73. float4 _MainColor;
    74. //顶点Shader
    75. v2f vert (appdata v)
    76. {
    77. v2f o;
    78. float4 pos_world = mul(unity_ObjectToWorld, v.vertex);
    79. float4 pos_view = mul(UNITY_MATRIX_V, pos_world);
    80. float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);
    81. o.pos = pos_clip;
    82. //o.pos = UnityObjectToClipPos(v.vertex);
    83. o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;
    84. o.uv.zw = v.texcoord0 * _NoiseMap_ST.xy + _NoiseMap_ST.zw;
    85. //o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    86. o.pos_local = v.vertex.xyz;
    87. return o;
    88. }
    89. //片元Shader
    90. half4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
    91. {
    92. half gradient = tex2D(_MainTex, i.uv.xy + _Time.y * 0.1f * _Speed.xy).r * (1.0 - i.uv.y);
    93. half noise = 1.0 - tex2D(_NoiseMap, i.uv.zw + _Time.y * 0.1f * _Speed.zw).r;
    94. clip(gradient - noise - _Cutout);
    95. return _MainColor;
    96. }
    97. ENDCG // Shader代码从这里结束
    98. }
    99. }
    100. }

    Shader "CS02/Blending"  

    1. Shader "CS02/Blending" //Shader的真正名字 可以是路径式的格式
    2. {
    3. /*材质球参数及UI面板
    4. https://docs.unity3d.com/cn/current/Manual/SL-Properties.html
    5. https://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html
    6. */
    7. Properties
    8. {
    9. _MainTex ("Texture", 2D) = "" {}
    10. _MainColor("Main Color",Color) = (1,1,1,1)
    11. _Emiss("Emiss", Float) = 1.0
    12. _Speed("Speed", Vector) = (.34, .85, .92, 1)
    13. }
    14. /*
    15. 这是为了让你可以在一个Shader文件中写多种版本的Shader,但只有一个会被使用。
    16. 提供多个版本的SubShader,Unity可以根据对应平台选择最合适的Shader
    17. 或者配合LOD机制一起使用。
    18. 一般写一个即可
    19. */
    20. SubShader
    21. {
    22. /*
    23. 标签属性,有两种:一种是SubShader层级,一种在Pass层级
    24. https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.html
    25. https://docs.unity3d.com/cn/current/Manual/SL-PassTags.html
    26. */
    27. Tags { "Queue" = "Transparent" }
    28. /*
    29. Pass里面的内容Shader代码真正起作用的地方,
    30. 一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader)
    31. 一个SubShader里面可以包含多个Pass,每个Pass会被按顺序执行
    32. */
    33. Pass
    34. {
    35. //Blending:https://docs.unity3d.com/Manual/SL-Blend.html
    36. ZWrite Off
    37. //Blend SrcAlpha OneMinusSrcAlpha
    38. Blend One OneMinusSrcAlpha
    39. //Blend SrcAlpha One
    40. //Blend DstColor Zero
    41. CGPROGRAM // Shader代码从这里开始
    42. #pragma vertex vert //指定一个名为"vert"的函数为顶点Shader
    43. #pragma fragment frag //指定一个名为"frag"函数为片元Shader
    44. #include "UnityCG.cginc" //引用Unity内置的文件,很方便,有很多现成的函数提供使用
    45. //https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html
    46. struct appdata //CPU向顶点Shader提供的模型数据
    47. {
    48. //冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
    49. float4 vertex : POSITION; //模型空间顶点坐标
    50. half2 texcoord0 : TEXCOORD0; //第一套UV
    51. half2 texcoord1 : TEXCOORD1; //第二套UV
    52. half2 texcoord2 : TEXCOORD2; //第二套UV
    53. half2 texcoord4 : TEXCOORD3; //模型最多只能有4套UV
    54. half4 color : COLOR; //顶点颜色
    55. half3 normal : NORMAL; //顶点法线
    56. half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
    57. };
    58. struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
    59. {
    60. float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
    61. float4 uv : TEXCOORD0; //自定义数据体
    62. //注意跟上方的TEXCOORD的意义是不一样的,上方代表的是UV,这里可以是任意数据。
    63. //插值器:输出后会被光栅化进行插值,而后作为输入数据,进入片元Shader
    64. //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
    65. float3 pos_local : TEXCOORD1;
    66. //float3 pos_pivot : TEXCOORD2;
    67. };
    68. /*
    69. Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接
    70. */
    71. sampler2D _MainTex;
    72. float4 _MainTex_ST;
    73. float _Cutout;
    74. float4 _Speed;
    75. sampler2D _NoiseMap;
    76. float4 _NoiseMap_ST;
    77. float4 _MainColor;
    78. float _Emiss;
    79. //顶点Shader
    80. v2f vert (appdata v)
    81. {
    82. v2f o;
    83. float4 pos_world = mul(unity_ObjectToWorld, v.vertex);
    84. float4 pos_view = mul(UNITY_MATRIX_V, pos_world);
    85. float4 pos_clip = mul(UNITY_MATRIX_P, pos_view);
    86. o.pos = pos_clip;
    87. //o.pos = UnityObjectToClipPos(v.vertex);
    88. o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;
    89. o.uv.zw = v.texcoord0 * _NoiseMap_ST.xy + _NoiseMap_ST.zw;
    90. //o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    91. o.pos_local = v.vertex.xyz;
    92. return o;
    93. }
    94. //片元Shader
    95. half4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
    96. {
    97. half4 gradient = tex2D(_MainTex, i.uv.xy + _Time.y * 0.1f * _Speed.xy);
    98. float4 final_color = gradient.rrrr * _MainColor * _Emiss;
    99. return final_color;
    100. }
    101. ENDCG // Shader代码从这里结束
    102. }
    103. }
    104. }

    Shader "CS02/Rim" 

    1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
    2. Shader "CS02/Rim" //Shader的真正名字 可以是路径式的格式
    3. {
    4. /*材质球参数及UI面板
    5. https://docs.unity3d.com/cn/current/Manual/SL-Properties.html
    6. https://docs.unity3d.com/cn/current/ScriptReference/MaterialPropertyDrawer.html
    7. */
    8. Properties
    9. {
    10. _MainTex ("Texture", 2D) = "" {}
    11. _MainColor("Main Color",Color) = (1,1,1,1)
    12. _Emiss("Emiss", Float) = 1.0
    13. _Speed("Speed", Vector) = (.34, .85, .92, 1)
    14. }
    15. SubShader
    16. {
    17. /*
    18. 标签属性,有两种:一种是SubShader层级,一种在Pass层级
    19. https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.html
    20. https://docs.unity3d.com/cn/current/Manual/SL-PassTags.html
    21. */
    22. Tags { "Queue" = "Transparent" }
    23. Pass {
    24. Cull Off
    25. ZWrite On
    26. ColorMask 0
    27. CGPROGRAM
    28. float4 _Color;
    29. #pragma vertex vert
    30. #pragma fragment frag
    31. float4 vert(float4 vertexPos : POSITION) : SV_POSITION
    32. {
    33. return UnityObjectToClipPos(vertexPos);
    34. }
    35. float4 frag(void) : COLOR
    36. {
    37. return _Color;
    38. }
    39. ENDCG
    40. }
    41. Pass
    42. {
    43. //Blending:https://docs.unity3d.com/Manual/SL-Blend.html
    44. ZWrite Off
    45. //Blend SrcAlpha OneMinusSrcAlpha
    46. Blend SrcAlpha One
    47. //Blend DstColor Zero
    48. CGPROGRAM // Shader代码从这里开始
    49. #pragma vertex vert //指定一个名为"vert"的函数为顶点Shader
    50. #pragma fragment frag //指定一个名为"frag"函数为片元Shader
    51. #include "UnityCG.cginc" //引用Unity内置的文件,很方便,有很多现成的函数提供使用
    52. struct appdata //CPU向顶点Shader提供的模型数据
    53. {
    54. float4 vertex : POSITION; //模型空间顶点坐标
    55. half2 texcoord0 : TEXCOORD0; //第一套UV
    56. half3 normal : NORMAL; //顶点法线
    57. };
    58. struct v2f //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
    59. {
    60. float4 pos : SV_POSITION;
    61. float2 uv : TEXCOORD0;
    62. float3 pos_world : TEXCOORD1;
    63. float3 normal_world : TEXCOORD2;
    64. };
    65. /*
    66. Shader内的变量声明,如果跟上面Properties模块内的参数同名,就可以产生链接
    67. */
    68. sampler2D _MainTex;
    69. float4 _MainTex_ST;
    70. float _Cutout;
    71. float4 _Speed;
    72. sampler2D _NoiseMap;
    73. float4 _NoiseMap_ST;
    74. float4 _MainColor;
    75. float _Emiss;
    76. //Unity内置变量:https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html
    77. //顶点Shader
    78. v2f vert (appdata v)
    79. {
    80. v2f o;
    81. o.pos = UnityObjectToClipPos(v.vertex);
    82. o.uv.xy = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;
    83. float4 pos_world = mul(unity_ObjectToWorld, v.vertex);
    84. o.pos_world = pos_world.xyz;
    85. o.normal_world = normalize(mul(float4(v.normal,0.0), unity_WorldToObject).xyz);
    86. return o;
    87. }
    88. //片元Shader
    89. half4 frag (v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
    90. {
    91. float3 normal_world = normalize(i.normal_world);
    92. float3 view_world = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
    93. float NdotV = saturate(dot(normal_world, view_world));
    94. float alpha = saturate(_MainColor.a / NdotV);
    95. return float4(_MainColor.xyz * _Emiss, alpha);
    96. }
    97. ENDCG // Shader代码从这里结束
    98. }
    99. }
    100. }

  • 相关阅读:
    解决MyBatis-Plus updateById方法更新不了空字符串或null
    使用mybatis-plus时mysql和oracle的区别
    【图像分类】2017-MobileNetV1 CVPR
    【深度学习】第三章:卷积神经网络
    LOG4J
    SuperMap GIS基础软件地图瓦片问题Q&A
    C++ //练习 13.34 编写本节所描述的Message。
    温故而知新六(C++)
    文章一直被拒,没有送审,也没给出拒稿原因和建议原因不过这几点
    数据可视化训练第四天(模拟投掷筛子并且统计频次)
  • 原文地址:https://blog.csdn.net/Angelloveyatou/article/details/127986585