当前位置:   article > 正文

Unity shader 学习记录(透明效果1)_unityshader实现点击ui透明

unityshader实现点击ui透明

感悟:

1、首先进行深度测试(是否开启)和深度检验,然后写入颜色缓冲,深度缓冲(深度缓冲要看是否开启深度写入)

2、颜色缓冲和深度写入是两个不同的东西,每次得到结果会写入颜色缓冲中

3、透明物体进行排序时,都考虑到有些情况会有循环覆盖物体遮挡的问题,但是还是没什么比较通用的解决方法(推荐的方法是分割网格),所以这就是渲染透明物体大家都谨慎的原因吧。(就像明知道有个渣男,却说忍忍吧的感觉)

总结:

透明效果可以通过两种方式实现:透明度测试、透明度混合。在实际应用中,我们大多选择透明度混合。

透明度测试:只要一个片元的透明度不满足条件,那么它会被舍弃。满足条件的会按照普通的不透明物体进行处理。

透明度混合:使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是透明度混合需要关闭深度写入,不关闭深度测试。

透明度测试代码:(使用clip函数)

  1. Shader "Custom/AlphaTest" {
  2. Properties {
  3. _Color ("Color Tint", Color) = (1, 1, 1, 1)
  4. _MainTex ("Main Tex", 2D) = "white" {}
  5. _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
  6. }
  7. SubShader {
  8. Tags {
  9. "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
  10. Pass {
  11. Tags { "LightMode"="ForwardBase" }
  12. CGPROGRAM
  13. #pragma vertex vert
  14. #pragma fragment frag
  15. #include "Lighting.cginc"
  16. fixed4 _Color;
  17. sampler2D _MainTex;
  18. float4 _MainTex_ST;
  19. fixed _Cutoff;
  20. struct a2v {
  21. float4 vertex : POSITION;
  22. float3 normal : NORMAL;
  23. float4 texcoord : TEXCOORD0;
  24. };
  25. struct v2f {
  26. float4 pos : SV_POSITION;
  27. float3 worldNormal : TEXCOORD0;
  28. float3 worldPos : TEXCOORD1;
  29. float2 uv : TEXCOORD2;
  30. };
  31. v2f vert(a2v v) {
  32. v2f o;
  33. o.pos = UnityObjectToClipPos(v.vertex);
  34. o.worldNormal = UnityObjectToWorldNormal(v.normal);
  35. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  36. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  37. return o;
  38. }
  39. fixed4 frag(v2f i) : SV_Target {
  40. fixed3 worldNormal = normalize(i.worldNormal);
  41. fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
  42. fixed4 texColor = tex2D(_MainTex, i.uv);
  43. // Alpha test通过判断clip内的值若小于0对fragment进行discard
  44. clip (texColor.a - _Cutoff);
  45. fixed3 albedo = texColor.rgb * _Color.rgb;
  46. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
  47. fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
  48. return fixed4(ambient + diffuse, 1.0);
  49. }
  50. ENDCG
  51. }
  52. }
  53. FallBack "Transparent/Cutout/VertexLit"
  54. }

透明度混合代码:使用blend命令

  1. Shader "Custom/AlphaBlend" {
  2. Properties {
  3. _MainTex ("Main Tex", 2D) = "white" {}
  4. _AlphaScale ("Alpha Scale", Range(0, 1)) = 1
  5. }
  6. SubShader {
  7. Tags {
  8. "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
  9. Pass {
  10. Tags { "LightMode"="ForwardBase" }
  11. ZWrite Off
  12. Blend SrcAlpha OneMinusSrcAlpha
  13. CGPROGRAM
  14. #pragma vertex vert
  15. #pragma fragment frag
  16. #include "Lighting.cginc"
  17. sampler2D _MainTex;
  18. float4 _MainTex_ST;
  19. fixed _AlphaScale;
  20. struct a2v {
  21. float4 vertex : POSITION;
  22. float3 normal : NORMAL;
  23. float4 texcoord : TEXCOORD0;
  24. };
  25. struct v2f {
  26. float4 pos : SV_POSITION;
  27. float3 worldNormal : TEXCOORD0;
  28. float3 worldPos : TEXCOORD1;
  29. float2 uv : TEXCOORD2;
  30. };
  31. v2f vert(a2v v) {
  32. v2f o;
  33. o.pos = UnityObjectToClipPos(v.vertex);
  34. o.worldNormal = UnityObjectToWorldNormal(v.normal);
  35. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  36. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  37. return o;
  38. }
  39. fixed4 frag(v2f i) : SV_Target {
  40. fixed3 worldNormal = normalize(i.worldNormal);
  41. fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
  42. fixed4 texColor = tex2D(_MainTex, i.uv);
  43. fixed3 albedo = texColor.rgb;
  44. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
  45. fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
  46. return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
  47. }
  48. ENDCG
  49. }
  50. }
  51. FallBack "Transparent/VertexLit"
  52. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/116306?site
推荐阅读
相关标签
  

闽ICP备14008679号