IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 透明效果(八)--模板测试实现透明效果 -> 正文阅读

[游戏开发]透明效果(八)--模板测试实现透明效果

【本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

透明效果

最终效果:
在这里插入图片描述

7.5 模板测试

在B物体上挖一个洞,形状是A物体的轮廓,所以要分别给A,B物体写脚本
A物体脚本:

Shader "Chapter7/Shader756A"
{
    SubShader
    {
        Tags { "Queue"="Geometry-1" }
        pass
        {
            Stencil
            {
                Ref 1    // 参照值,用来与缓存中已经存在的模板值进行比较的数值
                Comp Always  // 将参照值与模板值进行比较的方法,默认always
                Pass Replace  // 如果模板测试和深度测试都通过,当前像素的参照值写进缓存
            }

            // 只是为了传递轮廓,所以屏蔽所有颜色输出
            ColorMask 0
            ZWrite Off //关闭深度写入,关闭深度测试,如果关闭深度测试,颜色会被过滤掉

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(in float4 vertex : POSITION) : SV_POSITION
            {
                float4 pos = UnityObjectToClipPos(vertex);//把模型坐标转换成裁切坐标
                return pos;
            }

            void frag(out fixed4 color : SV_Target)
            {
                color = fixed4(1,1,1,1);
            }
            ENDCG
        }        
    }
}

B物体脚本

Shader "Chapter7/Shader756B"
{
    Properties
    {
    //在B物体上挖一个洞,形状是A物体的轮廓,所以要分别给A,B物体写脚本
        _MainColor ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "Queue"="Geometry" }

        Pass
        {
            Tags {"LightMode" = "ForwardBase"}//前向渲染
            Stencil
            {
                Ref 1
                Comp NotEqual//当和物体A的缓存值不相等的时候,再渲染
                Pass Keep//保持缓存中的模板值
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"

            struct v2f
            {
                float4 worldPos : TEXCOORD0;
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD1;
                float2 texcoord : TEXCOORD2;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _MainColor;

            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);//把v的顶点模型坐标转换成世界坐标

                //float3 worldNormal = ;
                o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));//把v的法线坐标转换成世界坐标
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);//拿顶点的uv去和材质球的tiling和offset作运算,确保缩放和偏移
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float3 worldLight = UnityWorldSpaceLightDir(i.worldPos.xyz);//输入世界空间中的顶点坐标,返回世界空间中从该点到光源光照方向
                worldLight = normalize(worldLight);
                fixed NdotL = saturate(dot(i.worldNormal,worldLight));//saturate(x):如果x取值小于0,则返回值为0
                
                fixed4 color = tex2D(_MainTex,i.texcoord);//对贴图进行逐点采样,将rgb提取出来
                color.rgb *= _MainColor * NdotL * _LightColor0.rgb;//将贴图颜色和灯光颜色进行混合
                color.rgb += unity_AmbientSky.rgb;//再引入环境光颜色

                return color;
            }
            ENDCG
        }
    }
}

实现步骤:

在这里插入图片描述

  1. 创建一个胶囊体,位置归0,绑定带有A脚本的材质
  2. 创建一个正方体,位置归0,绑定带有B脚本的材质
  3. 在胶囊体后面放一个物体作为是否透明的参考
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:59:42  更:2021-07-29 12:00:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 16:07:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码