当前位置:   article > 正文

Unity&Shader基础篇-常用函数的使用与案例_unity shader step

unity shader step

一、前言

继前面的系列文章之后,本篇继续讲解Cg的常用函数的使用案例,帮助巩固Cg语言的基础知识。这些函数都可以在Cg的教程里The Cg Tutorial找到示例代码和函数意义。本文讲解几个常用的函数,分别有

1、Step(a,x):如果x<a返回0;如果x>或=a返回1

2、Clamp(x,a,a):如果x<a返回a;如果x>b返回b;如果在a和b之间就返回x

3、smoothstep(min,max,x):返回的值为–2*((  min )/( max  min ))3 +3*((  min )/( max  min ))2

4、lerp(a,b,f):线性插值函数,返回值为(1-f)*a+b*f

5、三角函数sin、cos

二、常用函数的使用实例

1、Step函数:在Unity中的Shader代码
  1. Shader "Unlit/Chapter5-Step"
  2. {
  3. Properties
  4. {
  5. _background("背景色",Color)=(0,0,0,0)
  6. }
  7. SubShader
  8. {
  9. // No culling or depth
  10. Cull Off ZWrite Off ZTest Always
  11. CGINCLUDE
  12. ENDCG
  13. Pass
  14. {
  15. CGPROGRAM
  16. #pragma vertex vert
  17. #pragma fragment frag
  18. #include "UnityCG.cginc"
  19. float4 _background;
  20. struct appdata
  21. {
  22. float4 vertex : POSITION;
  23. float2 uv : TEXCOORD0;
  24. };
  25. struct v2f
  26. {
  27. float2 uv : TEXCOORD0;
  28. float4 vertex : SV_POSITION;
  29. };
  30. v2f vert(appdata v)
  31. {
  32. v2f o;
  33. o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  34. o.uv = v.uv;
  35. o.uv.y = 1 - o.uv.y;
  36. return o;
  37. }
  38. // Functions
  39. fixed4 frag(v2f i) : SV_Target
  40. {
  41. float2 r = 2.0*(i.uv - 0.5);
  42. //_ScreenParams是Unity内置的变量
  43. float aspectRatio = _ScreenParams.x / _ScreenParams.y;
  44. r.x *= aspectRatio;
  45. fixed3 pixel = _background.xyz;
  46. float edge, variable, ret;
  47. //将屏幕划分成五个部分
  48. //第一部分
  49. if (r.x < -0.6*aspectRatio)
  50. {
  51. variable = r.y;
  52. edge = 0.2;
  53. if (variable > edge)
  54. {
  55. ret = 1.0;
  56. }
  57. else
  58. {
  59. ret = 0;
  60. }
  61. }
  62. else if (r.x < -0.2*aspectRatio)
  63. {
  64. variable = r.y;
  65. edge = -0.2;
  66. //step(a,x):如果x<a结果返回0,反之返回1
  67. ret = step(edge, variable);
  68. }
  69. else if (r.x < 0.2*aspectRatio)
  70. {
  71. ret = 1.0 - step(0.5, r.y);
  72. }
  73. else if (r.x < 0.6*aspectRatio)
  74. {
  75. ret = 0.3 + 0.5*step(-0.4, r.y);
  76. }
  77. else
  78. {
  79. ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
  80. }
  81. pixel = fixed3(ret, ret, ret);
  82. return fixed4(pixel, 1.0);
  83. }
  84. ENDCG
  85. }
  86. }
  87. }
得到的效果图如图所示:
2、Clamp:在Unity中的代码如下:
  1. Shader "Unlit/Chapter5-Clamp"
  2. {
  3. Properties
  4. {
  5. _background("背景色",Color) = (0,0,0,0)
  6. }
  7. SubShader
  8. {
  9. // No culling or depth
  10. Cull Off ZWrite Off ZTest Always
  11. // 追加
  12. CGINCLUDE
  13. //定义宏
  14. #define PI 3.14159
  15. ENDCG
  16. Pass
  17. {
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. #include "UnityCG.cginc"
  22. float4 _background;
  23. struct appdata
  24. {
  25. float4 vertex : POSITION;
  26. float2 uv : TEXCOORD0;
  27. };
  28. struct v2f
  29. {
  30. float2 uv : TEXCOORD0;
  31. float4 vertex : SV_POSITION;
  32. };
  33. v2f vert(appdata v)
  34. {
  35. v2f o;
  36. o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  37. o.uv = v.uv;
  38. o.uv.y = 1 - o.uv.y;
  39. return o;
  40. }
  41. // Functions
  42. fixed4 frag(v2f i) : SV_Target
  43. {
  44. float2 r = 2.0*(i.uv - 0.5);
  45. //_ScreenParams是Unity内置的变量
  46. float aspectRatio = _ScreenParams.x / _ScreenParams.y;
  47. r.x *= aspectRatio;
  48. fixed3 pixel = _background.xyz;
  49. float edge, variable, ret;
  50. //第一部分
  51. if (i.uv.x < 0.25) { // part1
  52. ret = i.uv.y;
  53. }
  54. else if (i.uv.x < 0.5) { // part2
  55. float minVal = 0.3;
  56. float maxVal = 0.6;
  57. variable = i.uv.y;
  58. if (variable < minVal) {
  59. ret = minVal;
  60. }
  61. if (variable > minVal && variable < maxVal) {
  62. ret = variable;
  63. }
  64. if (variable > maxVal) {
  65. ret = maxVal;
  66. }
  67. }
  68. else if (i.uv.x < 0.75) { // part3
  69. float minVal = 0.6;
  70. float maxVal = 0.8;
  71. variable = i.uv.y;
  72. //clam(x,a,b):x如果小于a返回a,如果大于b返回b,在a~b范围内返回x
  73. ret = clamp(variable, minVal, maxVal);
  74. }
  75. else { // part4
  76. float y = cos(5.0 * 2.0 * PI *i.uv.y);
  77. y = (y + 1.0)*0.5; // map [-1,1] to [0,1]
  78. ret = clamp(y, 0.2, 0.8);
  79. }
  80. pixel = fixed3(ret, ret, ret);
  81. return fixed4(pixel, 1.0);
  82. }
  83. ENDCG
  84. }
  85. }
  86. }
效果图如图所示:
说明:对比1和2的图会明显发现,在使用Clamp处理的时候,边缘的颜色会有渐变的效果。
3、smoothstep:这个脚本只给出片段着色器部分,其他部分同2,代码如下:
  1. fixed4 frag(v2f i) : SV_Target
  2. {
  3. fixed3 pixel = _background.xyz;
  4. float edge, variable, ret;
  5. if (i.uv.x < 1.0 / 5.0) { // part1
  6. edge = 0.5;
  7. ret = step(edge, i.uv.y);
  8. }
  9. else if (i.uv.x < 2.0 / 5.0) { // part2
  10. float edge0 = 0.45;
  11. float edge1 = 0.55;
  12. float t = (i.uv.y - edge0) / (edge1 - edge0);
  13. float t1 = clamp(t, 0.0, 1.0);
  14. ret = t1;
  15. }
  16. else if (i.uv.x < 3.0 / 5.0) { // part3
  17. float edge0 = 0.45;
  18. float edge1 = 0.55;
  19. float t = clamp((i.uv.y - edge0) / (edge1 - edge0), 0.0, 1.0);
  20. float t1 = 3.0*t*t - 2.0*t*t*t;
  21. ret = t1;
  22. }
  23. else if (i.uv.x < 4.0 / 5.0) { // part4
  24. //smoothstep(min,max,x):x=-2*((x-min)/(max-min))^3+3*((x-min)/(max-min))^2,当x=min时返回0,当x=max时返回1
  25. ret = smoothstep(0.45, 0.55, i.uv.y);
  26. }
  27. else if (i.uv.x < 5.0 / 5.0) {
  28. float edge0 = 0.45;
  29. float edge1 = 0.55;
  30. float t = clamp((i.uv.y - edge0) / (edge1 - edge0), 0.0, 1.0);
  31. float t1 = t*t*t*(t*(t*6.0 - 15.0) + 10.0);
  32. ret = t1;
  33. }
  34. pixel = fixed3(ret, ret, ret);
  35. return fixed4(pixel, 1.0);
  36. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/107880
推荐阅读
相关标签
  

闽ICP备14008679号