博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】人物在墙一侧透视效果
阅读量:4086 次
发布时间:2019-05-25

本文共 2636 字,大约阅读时间需要 8 分钟。

// 当物体被遮挡之后,会在墙的一侧显示轮廓的透视效果Shader "Custom/SeeThroughWall"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        // 透过墙看到的物体的轮廓高亮颜色        _EdgeColor("Edge Color", Color) = (1,1,1,1)    }    SubShader    {        Tags { "RenderType"="Opaque" }        // 显示轮廓高亮        Pass        {            // 深度测试的时候如果深度比其他物体大(被遮挡)            // 渲染高亮轮廓            ZTest Greater            Blend One One            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            struct appdata            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                //@add                float3 normal : NORMAL;            };            struct v2f            {                float2 uv : TEXCOORD0;                float4 vertex : SV_POSITION;                //@add                float3 normal : NORMAL;                float3 viewDir : TEXCOORD1;            };            sampler2D _MainTex;            float4 _MainTex_ST;            float4 _EdgeColor;            v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                o.uv = TRANSFORM_TEX(v.uv, _MainTex);                //@add                o.normal = UnityObjectToWorldNormal(v.normal);                o.viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);                return o;            }            fixed4 frag (v2f i) : SV_Target            {                float NdotV = 1 - dot(i.normal, i.viewDir) * 1.5;                return _EdgeColor * NdotV;            }            ENDCG        }        // 绘制物体        Pass        {            ZTest Less             CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            struct appdata            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;            };            struct v2f            {                float2 uv : TEXCOORD0;                UNITY_FOG_COORDS(1)                float4 vertex : SV_POSITION;            };            sampler2D _MainTex;            float4 _MainTex_ST;            v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                o.uv = TRANSFORM_TEX(v.uv, _MainTex);                UNITY_TRANSFER_FOG(o,o.vertex);                return o;            }            fixed4 frag (v2f i) : SV_Target            {                fixed4 col = tex2D(_MainTex, i.uv);                return col;            }            ENDCG        }    }}

转载地址:http://ebkii.baihongyu.com/

你可能感兴趣的文章
C++的三个基本特征:封装、继承、多态
查看>>
C++虚函数的总结
查看>>
什么是URL地址?
查看>>
C++多态的实现方式总结
查看>>
学习C++需要注意的问题
查看>>
C++模板
查看>>
C++双冒号(::)的用法
查看>>
【Unity】封装SQLite管理类
查看>>
【Unity】面试题整理
查看>>
【C#】如何实现一个迭代器
查看>>
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>