电竞比分网-中国电竞赛事及体育赛事平台

分享

UnityShader玉石效果

 勤奮不止 2025-07-04 發(fā)布于北京

UnityShader玉石效果

代碼:

  1. Shader "MyShader/Jade"
  2. {
  3. Properties
  4. {
  5. _DiffuseColor("漫反射顏色",color)=(1,1,1,1)
  6. _ThicknessMap("厚度圖",2d)="white"{}
  7. _AddColor("疊加顏色",color)=(1,1,1,1)
  8. _CubeMap("環(huán)境貼圖",Cube)="white"{}
  9. _RotateAngle("環(huán)境貼圖旋轉(zhuǎn)偏移",Range(0,360))=0
  10. _BackLightContrast("透光對比度",float)=1.0
  11. _BackLightScale("透光亮度",float)=1.0
  12. _Distort("扭曲程度",Range(0,1))=1
  13. }
  14. SubShader
  15. {
  16. Tags { "RenderType"="Opaque" }
  17. LOD 100
  18. Pass
  19. {
  20. Tags{"LightMode"="ForwardBase"}
  21. CGPROGRAM
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. #pragma multi_compile_fwdbase
  25. #include "UnityCG.cginc"
  26. #include "AutoLight.cginc"
  27. #include "Lighting.cginc"
  28. float _BackLightContrast;
  29. float _Distort;
  30. float _BackLightScale;
  31. sampler2D _ThicknessMap;
  32. samplerCUBE _CubeMap;
  33. float4 _CubeMap_HDR;
  34. float _RotateAngle;
  35. float4 _DiffuseColor;
  36. float4 _AddColor;
  37. float3 Rotate(float3 v,float rotateAngle)
  38. {
  39. float rad = rotateAngle*UNITY_PI/180.0;
  40. float2x2 rotateMul = float2x2(cos(rad),-sin(rad),sin(rad),cos(rad));
  41. float2 rotate_dir = mul(rotateMul,v.xz);
  42. return float3(v.x,rotate_dir.y,v.z);
  43. }
  44. struct appdata
  45. {
  46. float4 vertex : POSITION;
  47. float2 texcoord : TEXCOORD0;
  48. float3 normal : NORMAL;
  49. };
  50. struct v2f
  51. {
  52. float4 pos : SV_POSITION;
  53. float2 uv : TEXCOORD0;
  54. float3 normal_world : TEXCOORD1;
  55. float3 pos_world : TEXCOORD2;
  56. };
  57. v2f vert (appdata v)
  58. {
  59. v2f o;
  60. o.pos = UnityObjectToClipPos(v.vertex);
  61. o.uv = v.texcoord;
  62. o.normal_world =normalize( mul(v.normal,unity_WorldToObject).xyz);
  63. o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
  64. return o;
  65. }
  66. fixed4 frag (v2f i) : SV_Target
  67. {
  68. half3 normal_world = normalize(i.normal_world);
  69. half3 view_dir = normalize(_WorldSpaceCameraPos.xyz-i.pos_world);
  70. half3 light_dir = normalize(_WorldSpaceLightPos0.xyz);
  71. //漫反射
  72. half NdotL = saturate(dot(normal_world,light_dir));
  73. half3 diffuse_term = NdotL*_DiffuseColor*_LightColor0.xyz+_AddColor.xyz;
  74. //透射光
  75. half3 back_dir = -normalize(light_dir+normal_world*_Distort); //透射方向
  76. half VdotBL = saturate(dot(view_dir,back_dir));
  77. half thickness = 1.0-tex2D(_ThicknessMap,i.uv).r;
  78. half back_light = saturate(pow(VdotBL,_BackLightContrast))*_BackLightScale;
  79. half3 backlight_term = back_light*_LightColor0.xyz*thickness;
  80. //環(huán)境光
  81. half3 hdr_reflect_dir = normalize(reflect(-view_dir,normal_world));
  82. half3 rotate_hdr_reflect_dir = Rotate(hdr_reflect_dir,_RotateAngle);
  83. half frensil = 1-saturate(dot(normal_world,view_dir));
  84. float4 hdr_color = texCUBE(_CubeMap,rotate_hdr_reflect_dir);
  85. half3 env_color = DecodeHDR(hdr_color,_CubeMap_HDR)*frensil;
  86. half3 final_color = backlight_term+env_color+diffuse_term;
  87. return fixed4(final_color,1.0);
  88. }
  89. ENDCG
  90. }
  91. Pass
  92. {
  93. Tags{"LightMode"="ForwardAdd"}
  94. Blend One One
  95. CGPROGRAM
  96. #pragma vertex vert
  97. #pragma fragment frag
  98. #pragma multi_compile_fwdadd
  99. #include "UnityCG.cginc"
  100. #include "AutoLight.cginc"
  101. #include "Lighting.cginc"
  102. float _BackLightContrast;
  103. float _Distort;
  104. float _BackLightScale;
  105. sampler2D _ThicknessMap;
  106. float3 Rotate(float3 v,float rotateAngle)
  107. {
  108. float rad = rotateAngle*UNITY_PI/180.0;
  109. float2x2 rotateMul = float2x2(cos(rad),-sin(rad),sin(rad),cos(rad));
  110. float2 rotate_dir = mul(rotateMul,v.xz);
  111. return float3(v.x,rotate_dir.y,v.z);
  112. }
  113. struct appdata
  114. {
  115. float4 vertex : POSITION;
  116. float2 texcoord : TEXCOORD0;
  117. float3 normal : NORMAL;
  118. };
  119. struct v2f
  120. {
  121. float4 pos : SV_POSITION;
  122. float2 uv : TEXCOORD0;
  123. float3 normal_world : TEXCOORD1;
  124. float3 pos_world : TEXCOORD2;
  125. LIGHTING_COORDS(3,4)
  126. };
  127. v2f vert (appdata v)
  128. {
  129. v2f o;
  130. o.pos = UnityObjectToClipPos(v.vertex);
  131. o.uv = v.texcoord;
  132. o.normal_world =normalize( mul(v.normal,unity_WorldToObject).xyz);
  133. o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
  134. TRANSFER_VERTEX_TO_FRAGMENT(o);
  135. return o;
  136. }
  137. fixed4 frag (v2f i) : SV_Target
  138. {
  139. half3 normal_world = normalize(i.normal_world);
  140. half3 view_dir = normalize(_WorldSpaceCameraPos.xyz-i.pos_world);
  141. half3 light_dir = normalize(_WorldSpaceLightPos0.xyz);
  142. //透射光
  143. half3 back_dir = -normalize(light_dir+normal_world*_Distort); //透射方向
  144. half VdotBL = saturate(dot(view_dir,back_dir));
  145. half thickness = 1.0-tex2D(_ThicknessMap,i.uv).r;
  146. half back_light = saturate(pow(VdotBL,_BackLightContrast))*_BackLightScale;
  147. half3 backlight_term = back_light*_LightColor0.xyz*thickness;
  148. half3 atten = LIGHT_ATTENUATION(i);
  149. half3 final_color = backlight_term*atten;
  150. return fixed4(final_color,1.0);
  151. }
  152. ENDCG
  153. }
  154. }
  155. }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多