当前位置:   article > 正文

Shader(代码篇之特效)_shader代码

shader代码
  1. AlphaCutout

  1. Shader "Shader/Custom/AC"
  2. {
  3. Properties
  4. {
  5. _MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}
  6. _Cutoff ("透切阈值", range(0.0, 1.0)) = 0.5
  7. }
  8. SubShader
  9. {
  10. Tags {
  11. "RenderType"="TransparentCutout" // 对应改为Cutout
  12. "ForceNoShadowCasting"="True" // 关闭阴影投射
  13. "IgnoreProjector"="True" // 不响应投射器
  14. }
  15. Pass
  16. {
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20. #include "UnityCG.cginc"
  21. uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
  22. uniform half _Cutoff;
  23. // 输入结构
  24. struct appdata
  25. {
  26. float4 vertex : POSITION;
  27. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  28. };
  29. // 输出结构
  30. struct v2f
  31. {
  32. float4 pos : SV_POSITION;
  33. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  34. };
  35. // 输入结构>>>顶点Shader>>>输出结构
  36. v2f vert (appdata v)
  37. {
  38. v2f o;
  39. o.pos = UnityObjectToClipPos( v.vertex); // 顶点位置 OS>CS
  40. o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
  41. return o;
  42. }
  43. // 输出结构>>>像素
  44. fixed4 frag (v2f i) : SV_Target
  45. {
  46. half4 var_MainTex = tex2D(_MainTex, i.uv); // 采样贴图 RGB颜色 A透贴
  47. clip(var_MainTex.a - _Cutoff); // 透明剪切
  48. return var_MainTex; // 返回值
  49. }
  50. ENDCG
  51. }
  52. }
  53. }
  1. BlendMode

  1. Shader "Shader/Custom/BlendMode"
  2. {
  3. Properties
  4. {
  5. _MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}
  6. _Opacity ("透明度", range(0, 1)) = 0.5
  7. [Enum(UnityEngine.Rendering.BlendMode)]
  8. _BlendSrc ("混合源乘子", int) = 0
  9. [Enum(UnityEngine.Rendering.BlendMode)]
  10. _BlendDst ("混合目标乘子", int) = 0
  11. [Enum(UnityEngine.Rendering.BlendOp)]
  12. _BlendOp ("混合算符", int) = 0
  13. }
  14. SubShader
  15. {
  16. Tags {
  17. "Queue"="Transparent" // 调整渲染顺序
  18. "RenderType"="Transparent" // 对应改为Cutout
  19. "ForceNoShadowCasting"="True" // 关闭阴影投射
  20. "IgnoreProjector"="True" // 不响应投射器
  21. }
  22. Pass
  23. {
  24. BlendOp [_BlendOp] // 可自定义混合算符
  25. Blend [_BlendSrc] [_BlendDst] // 可自定义混合模式
  26. CGPROGRAM
  27. #pragma vertex vert
  28. #pragma fragment frag
  29. #include "UnityCG.cginc"
  30. uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
  31. uniform half _Opacity;
  32. // 输入结构
  33. struct appdata
  34. {
  35. float4 vertex : POSITION;
  36. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  37. };
  38. // 输出结构
  39. struct v2f
  40. {
  41. float4 pos : SV_POSITION;
  42. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  43. };
  44. // 输入结构>>>顶点Shader>>>输出结构
  45. v2f vert (appdata v)
  46. {
  47. v2f o;
  48. o.pos = UnityObjectToClipPos( v.vertex); // 顶点位置 OS>CS
  49. o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
  50. return o;
  51. }
  52. // 输出结构>>>像素
  53. fixed4 frag (v2f i) : SV_Target
  54. {
  55. half4 var_MainTex = tex2D(_MainTex, i.uv); // 采样贴图 RGB颜色 A透贴不必须
  56. half3 finalRGB = var_MainTex.rgb;
  57. half opacity = var_MainTex.a * _Opacity;
  58. return half4(finalRGB * opacity, opacity); // 返回值
  59. }
  60. ENDCG
  61. }
  62. }
  63. }

1.Blend One OneMinusSrcAlpha(AlphaBlend)

2.Blend One One(AlphaAdditive)

3.混合原理

Src*SrcFactor op Dst*DstFactor

• Src:源,当前Shader绘制的结果;

• Dst:目标,当前Shader绘制前的背景;

• SrcFactor:源乘子;

• DstFactor:目标乘子;

• Op:混合运算符;

  1. UV流动

  1. Shader "Shader/Custom/UVFlow"
  2. {
  3. Properties
  4. {
  5. _MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}
  6. _Opacity ("透明度", range(0, 1)) = 0.5
  7. _NoiseTex ("噪声图", 2d) = "gray"{}
  8. _NoiseInt ("噪声强度", range(0, 5)) = 1
  9. _FlowSpeed ("流动速度", range(-10, 10)) = 5
  10. }
  11. SubShader
  12. {
  13. Tags {
  14. "Queue"="Transparent" // 调整渲染顺序
  15. "RenderType"="Transparent" // 对应改为Cutout
  16. "ForceNoShadowCasting"="True" // 关闭阴影投射
  17. "IgnoreProjector"="True" // 不响应投射器
  18. }
  19. Pass
  20. {
  21. Blend One OneMinusSrcAlpha
  22. CGPROGRAM
  23. #pragma vertex vert
  24. #pragma fragment frag
  25. #include "UnityCG.cginc"
  26. // 输入参数
  27. uniform sampler2D _MainTex;
  28. uniform half _Opacity;
  29. uniform sampler2D _NoiseTex; uniform float4 _NoiseTex_ST;
  30. uniform half _NoiseInt;
  31. uniform half _FlowSpeed;
  32. // 输入结构
  33. struct appdata
  34. {
  35. float4 vertex : POSITION;
  36. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  37. };
  38. // 输出结构
  39. struct v2f
  40. {
  41. float4 pos : SV_POSITION;
  42. float2 uv0 : TEXCOORD0; // UV 采样MainTex用
  43. float2 uv1 : TEXCOORD1; // UV 采样NoiseTex用
  44. };
  45. // 输入结构>>>顶点Shader>>>输出结构
  46. v2f vert (appdata v)
  47. {
  48. v2f o;
  49. o.pos = UnityObjectToClipPos( v.vertex); // 顶点位置 OS>CS
  50. o.uv0 = v.uv;
  51. o.uv1 = TRANSFORM_TEX(v.uv, _NoiseTex); // UV信息 支持TilingOffset
  52. o.uv1.y = o.uv1.y + frac(_Time.x * _FlowSpeed);
  53. return o;
  54. }
  55. // 输出结构>>>像素
  56. fixed4 frag (v2f i) : SV_Target
  57. {
  58. half4 var_MainTex = tex2D(_MainTex, i.uv0); // 采样贴图 RGB颜色
  59. half4 var_NoiseTex = tex2D(_NoiseTex, i.uv1);
  60. half3 finalRGB = var_MainTex.rgb;
  61. half noise = lerp(1.0, var_NoiseTex.r * 2.0, _NoiseInt);
  62. noise = max(0.0, noise);
  63. half opacity = var_MainTex.a * _Opacity * noise;
  64. return half4(finalRGB * opacity, opacity); // 返回值
  65. }
  66. ENDCG
  67. }
  68. }
  69. }
  1. UV扰动

  1. Shader "Shader/Custom/UVWrap"
  2. {
  3. Properties
  4. {
  5. _MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}
  6. _Opacity ("透明度", range(0, 1)) = 0.5
  7. _WarpTex ("扭曲图", 2d) = "gray"{}
  8. _WarpInt ("扭曲强度", range(0, 1)) = 0.1
  9. _NoiseInt ("噪声强度", range(0, 5)) = 1
  10. _FlowSpeed ("流动速度", range(-10, 10)) = 5
  11. }
  12. SubShader
  13. {
  14. Tags {
  15. "Queue"="Transparent" // 调整渲染顺序
  16. "RenderType"="Transparent" // 对应改为Cutout
  17. "ForceNoShadowCasting"="True" // 关闭阴影投射
  18. "IgnoreProjector"="True" // 不响应投射器
  19. }
  20. Pass
  21. {
  22. Blend One OneMinusSrcAlpha
  23. CGPROGRAM
  24. #pragma vertex vert
  25. #pragma fragment frag
  26. #include "UnityCG.cginc"
  27. // 输入参数
  28. uniform sampler2D _MainTex;
  29. uniform half _Opacity;
  30. uniform sampler2D _WarpTex; uniform float4 _WarpTex_ST;
  31. uniform half _WarpInt;
  32. uniform half _NoiseInt;
  33. uniform half _FlowSpeed;
  34. // 输入结构
  35. struct appdata
  36. {
  37. float4 vertex : POSITION;
  38. float2 uv : TEXCOORD0; // UV信息 采样贴图用
  39. };
  40. // 输出结构
  41. struct v2f
  42. {
  43. float4 pos : SV_POSITION;
  44. float2 uv0 : TEXCOORD0; // UV 采样MainTex用
  45. float2 uv1 : TEXCOORD1; // UV 采样WrapTex用
  46. };
  47. // 输入结构>>>顶点Shader>>>输出结构
  48. v2f vert (appdata v)
  49. {
  50. v2f o;
  51. o.pos = UnityObjectToClipPos( v.vertex); // 顶点位置 OS>CS
  52. o.uv0 = v.uv;
  53. o.uv1 = TRANSFORM_TEX(v.uv, _WarpTex); // UV信息 支持TilingOffset
  54. o.uv1.y = o.uv1.y + frac(_Time.x * _FlowSpeed);
  55. return o;
  56. }
  57. // 输出结构>>>像素
  58. half4 frag (v2f i) : SV_Target
  59. {
  60. half3 var_WarpTex = tex2D(_WarpTex, i.uv1).rgb;
  61. half2 uvBias = (var_WarpTex.rg - 0.5) * _WarpInt;
  62. half2 uv0 = i.uv0 + uvBias;
  63. half4 var_MainTex = tex2D(_MainTex, uv0);
  64. half3 finalRGB = var_MainTex.rgb;
  65. half noise = lerp(1.0, var_WarpTex.b * 2.0, _NoiseInt);
  66. noise = max(0.0, noise);
  67. half opacity = var_MainTex.a * _Opacity * noise;
  68. return half4(finalRGB * opacity, opacity); // 返回值
  69. }
  70. ENDCG
  71. }
  72. }
  73. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号