Unity shader学习之Alpha Test的阴影

本文详细介绍了一个用于Unity游戏引擎中的自定义Shader,该Shader实现了Alpha测试并支持阴影投射。通过具体的代码示例,展示了如何设置属性及使用CGPROGRAM来实现光照效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Alpha Test的阴影,

shader如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Alpha Test Shadow"
{
    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)          // 必需
        _MainTex("Main Texture", 2D) = "white" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5        // 必需
    }

    SubShader
    {
        Tags
        {
            "Queue" = "AlphaTest"
            "RenderType" = "TransparentCutout"
        }

        Pass
        {
            Tags
            {
                "LightMode" = "ForwardBase"
            }
            Cull Off                                    // 背面

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            float4 _Color;
            sampler2D _MainTex;
            float _Cutoff;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 worldNormal : TEXCOORD1;
                float3 worldPos : TEXCOORD2;
                SHADOW_COORDS(3)
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                TRANSFER_SHADOW(o);
                return o;
            }

            fixed4 frag(v2f i) : SV_TARGET
            {
                fixed4 albedo = tex2D(_MainTex, i.uv) * _Color;

                clip(albedo.a - _Cutoff);

                fixed3 ambient = albedo.rgb * UNITY_LIGHTMODEL_AMBIENT.rgb;

                float3 worldLight = UnityWorldSpaceLightDir(i.worldPos);
                fixed3 diff = albedo.rgb * _LightColor0.rgb * max(0, dot(i.worldNormal, worldLight));

                UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);

                fixed3 col = ambient + diff * atten;

                return fixed4(col, 1);
            }

            ENDCG
        }
    }

    Fallback "Transparent/Cutout/VertexLit"                    // 必需,阴影投射pass
}

效果如下:

 

转载于:https://www.cnblogs.com/jietian331/p/7198887.html

### 关于 Unity 中实现投影效果的 ShaderUnityShader 编写中,可以通过多种方式实现投影效果。通常情况下,这种效果涉及光源、物体表面以及阴影之间的交互关系。以下是基于现有引用内容和专业知识整理的内容。 #### 投影效果的核心原理 投影效果主要依赖光线与几何体的关系计算得出。具体来说,在着色器中通过矩阵变换将对象的位置映射到另一个空间(通常是屏幕空间),并利用纹理或其他数据模拟投影视觉[^1]。这种方法常用于平面投影或者简单的立方体贴图投影场景。 #### 制作步骤概述 为了创建一个基本的投影效果,可以遵循如下逻辑框架: 1. **定义材质属性** 需要在 Shader 中声明必要的参数,比如颜色强度、法线方向等。 2. **设置光照模型** 结合顶点位置信息与光源向量完成初步亮度评估。 3. **应用投影算法** 将目标物上的像素坐标转换至接收面所在区域,并叠加指定图案作为最终显示结果的一部分。 下面给出一段简化版的 HLSL 示例代码片段供参考: ```hlsl Shader "Custom/ProjectionEffect" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Tint Color", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Transparent" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _MainTex; float4 _Color; struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 position : SV_POSITION; }; v2f vert(appdata_t input) { v2f output; output.position = UnityObjectToClipPos(input.vertex); output.uv = input.uv; return output; } fixed4 frag(v2f i) : COLOR { fixed4 col = tex2D(_MainTex,i.uv)*_Color; clip(col.a - 0.1); // Alpha test return col; } ENDCG } } } ``` 此脚本实现了基础透明度裁剪功能的同时保留了一定程度上可自定义外观的能力[^2]。 #### 注意事项 当处理复杂环境下的多层叠放情况时需特别留意渲染队列管理以免出现错误排序现象影响视觉质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值