微信扫一扫 分享朋友圈

已有 1440 人浏览分享

开启左侧

怎么让半透明Shader 支持接收阴影

[复制链接]
1440 3

RT

评论 3

DUO酱  咒语学徒  发表于 2023-4-4 17:15:00 | 显示全部楼层
要让半透明Shader支持接收阴影,需要在Shader中添加对阴影的处理代码。具体步骤如下:

1. 在Shader中添加对阴影的采样:
  1. half4 shadowColor = tex2D(_ShadowTex, i.uv2);
复制代码

其中_ShadowTex是引用阴影贴图的变量名,i.uv2是使用阴影贴图的纹理坐标。

2. 根据采样得到的阴影颜色值,将其与半透明的颜色混合:
  1. half4 color = shadowColor * v.color * v.alpha;
复制代码

其中v.color和v.alpha是取自顶点着色器的颜色和透明度值,用于计算半透明材质的颜色值。

3. 最后,将混合后的颜色值通过输出将其传递给渲染引擎:
  1. o.color = color;
复制代码

这样就完成了半透明Shader支持阴影的处理。注意,这只是一个基本的处理方法,具体的实现还需要根据场景和需求进行调整和优化。
饭团鸭  魔法画童  发表于 2023-4-4 17:17:36 | 显示全部楼层
DUO酱 发表于 2023-4-4 17:15
要让半透明Shader支持接收阴影,需要在Shader中添加对阴影的处理代码。具体步骤如下:

1. 在Shader中添加 ...

我需要一个支持半透明阴影的shader
DUO酱  咒语学徒  发表于 2023-4-4 17:18:23 | 显示全部楼层
以下是一个支持半透明阴影的Shader代码示例,你可以参考一下:
  1. Shader "Custom/AlphaShadow" {
  2.     Properties {
  3.         // 阴影贴图
  4.         _ShadowTex ("Shadow Texture", 2D) = "white" {}
  5.         // 阴影颜色
  6.         _ShadowColor ("Shadow Color", Color) = (0, 0, 0, 0.5)
  7.     }
  8.     SubShader {
  9.         Tags {"Queue"="Transparent"}
  10.         Pass {
  11.             CGPROGRAM
  12.             #pragma vertex vert
  13.             #pragma fragment frag
  14.             #include "UnityCG.cginc"
  15.             struct appdata_t {
  16.                 // 顶点坐标
  17.                 float4 vertex : POSITION;
  18.                 // 纹理坐标
  19.                 float2 uv : TEXCOORD0;
  20.                 // 用于传递阴影纹理坐标的变量
  21.                 float2 uv2 : TEXCOORD1;
  22.             };
  23.             struct v2f {
  24.                 // 插值后的纹理坐标
  25.                 float2 uv : TEXCOORD0;
  26.                 // 插值后的阴影纹理坐标
  27.                 float2 uv2 : TEXCOORD1;
  28.                 // 插值后的半透明颜色及透明度
  29.                 fixed4 color : COLOR;
  30.             };
  31.             sampler2D _MainTex;
  32.             sampler2D _ShadowTex;
  33.             fixed4 _ShadowColor;
  34.             v2f vert (appdata_t v) {
  35.                 v2f o;
  36.                 // 传递顶点坐标及纹理坐标
  37.                 o.vertex = UnityObjectToClipPos(v.vertex);
  38.                 o.uv = v.uv;
  39.                 // 传递阴影纹理坐标
  40.                 o.uv2 = v.uv2;
  41.                 // 计算顶点的半透明颜色及透明度
  42.                 o.color = tex2D(_MainTex, v.uv);
  43.                 return o;
  44.             }
  45.             fixed4 frag (v2f i) : SV_Target {
  46.                 // 采样阴影贴图
  47.                 half4 shadowColor = tex2D(_ShadowTex, i.uv2);
  48.                 // 将半透明颜色与阴影颜色混合
  49.                 fixed4 color = lerp(i.color, _ShadowColor, shadowColor.a);
  50.                 // 输出混合后的颜色
  51.                 return color;
  52.             }
  53.             ENDCG
  54.         }
  55.     }
  56.     FallBack "Diffuse"
  57. }
复制代码

这个Shader有两个属性,一个是阴影贴图,一个是阴影颜色。在顶点着色器中传递了一个额外的变量uv2,用于传递阴影纹理坐标。在片段着色器中先采样阴影贴图,根据采样得到的阴影颜色值和半透明颜色值进行线性插值,得到最终的混合后的颜色输出。

值得注意的是,这个示例Shader仅支持阴影贴图带有透明通道的情况,如果阴影贴图没有透明通道你需要对上面的`lerp`函数进行改写。

提供单独的半透明材质渲染时,需要将渲染队列设置为"Queue"="Transparent"或"Queue"="AlphaTest"。另外,如果你的场景有其他透明物体,则需要控制半透明材质的渲染顺序,避免深度测试问题产生的阴影错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

1

主题
精彩推荐
热门资讯
网友晒图
图文推荐
  • iOS App

  • 安卓App

Archiver|手机版|小黑屋|技你太美101

GMT+8, 2024-11-23 19:44 , Processed in 0.125513 second(s), 31 queries .

Powered by 技你太美101

© 2024 JNTM101 Team