首页 > 其他分享 >Unity Shader案例04-------透明

Unity Shader案例04-------透明

时间:2023-03-28 18:01:23浏览次数:41  
标签:MainTex 04 uv vertex Shader fixed3 ------- worldNormal pass

Shader "CLF/SetTransparent"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1,1,1,1)  //  漫反射
        _MainTex("MainTex",2D) = "white"{}  //  2D纹理贴图
        _AlphaScale("Alpha Scale",Range(0,1)) = 1  //  控制Alpha参数
    }
    SubShader
    {
            Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }   //  渲染顺序设置Transparent
            LOD 100
            //  用两个pass通道来处理,防止出现渲染错误,第一个pass通道  每个pass通道都会渲染一次
            Pass  
            {
                ZWrite On  //  写入深度  为了确认渲染顺序
                ColorMask 0  //  掩码遮罩  代表这个pass通道不写入任何颜色值

            }
            //  第二个pass通道
            Pass  
            {
                Tags{"LightMode" = "ForwardBase"}

                ZWrite Off  //  关闭ZWrite(深度写入)
                Blend SrcAlpha OneMinusSrcAlpha  //  源颜色因子  正常透明混合

                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                #include "Lighting.cginc"

                struct v2f {

                    float4 vertex :SV_POSITION;  //  输出顶点信息
                    fixed3 worldNormal : TEXCOORD0;
                    float3 worldPos:TEXCOORD1;
                    float2 uv:TEXCOORD2;

                };

                fixed4 _Diffuse;
                float _AlphaScale;
                sampler2D _MainTex;
                float4 _MainTex_ST;  //  是MainTex的Tiling和Offset两个属性  不需要在外面定义

                v2f vert(appdata_base v)  //  顶点着色器
                {

                    v2f o;  //  用这个结构体
                    o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间再放到输出结构体
                    fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  //  法线从模型变换到世界坐标
                    o.worldNormal = worldNormal;
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex);  //  顶点信息从模型转到世界坐标系
                    //o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;  //  为了让MainTex的Tiling和Offset两个属性能影响到uv
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  //  unity纹理函数,和上面效果一样
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target  //  片元着色器  片元高光反射
                {

                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //  环境光

                    fixed4 texColor = tex2D(_MainTex, i.uv);  //  采样这个图



                    //  漫反射
                    //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                    fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);

                    fixed3 diffuse = texColor.rgb * _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldLightDir,i.worldNormal) * 0.5 + 0.5);  //  漫反射公式  图的纹理采样乘进来,纹理属于漫反射

                    fixed3 color = ambient + diffuse;
                    return fixed4(color, texColor.a * _AlphaScale);  //  texColor的a值就是颜色通道的值  乘上_AlphaScale来控制

                }
                ENDCG
            }
    }
     FallBack "Transparent/VertexLit"
}

  

标签:MainTex,04,uv,vertex,Shader,fixed3,-------,worldNormal,pass
From: https://www.cnblogs.com/clf125800/p/17266176.html

相关文章

  • 19-springboot自动配置原理
    SpringBoot自动配置原理(SpringBoot自动装配原理,SpringBootstarter原理)SpringBoot可以根据定义在classpath下的类,自动的给你生成一些Bean,并加载到Spring的Context中,自动配......
  • 确定比赛名次 HDU - 1285 (拓扑排序)
    题意:有N个比赛队(1≤N≤500),编号依次为1,2,3,...,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比......
  • 记录--vue刷新当前页面
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助背景项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面.思路(1)如果......
  • Region-区域适配器RegionAdapter
    Prism内置了几个区域适配器ContentControlRegionAdapterItemsControlRegionAdapterSelectorRegionAdapterComboBoxListBoxRibbonTabControl所以我们可以......
  • O2OA基于nginx的SSL跳转、转发配置---靳宇灵
    1.申请ssl证书,可参考 系统安全-启用HTTPS(腾讯云版) ,如需其他产商的证书可网络上搜索一下,这里不做过多赘述;2.确认服务器上已安装nginx,并可以正常访问。3.新建一个目录(这......
  • mapbox-gl实战教程:加载各种底图技巧
    在地图开发中,加载底图是一个最基本的操作,使用在线开放底图、自己发布的底图、或是客户提供的给底图服务,都存在一定的规律,掌握规律就能顺利的进行底图加载,本文通过以下四个方......
  • LC第337场周赛P4-执行操作后的最大 MEX
    给你一个下标从0开始的整数数组nums和一个整数value。在一步操作中,你可以对nums中的任一元素加上或减去value。例如,如果nums=[1,2,3]且value=2,你可以......
  • vue-cookies用法
    importCookiesfrom'vue-cookies';constcookies={};cookies.set=function(name='default',value='',cookieSetting=60*60*24*365){Co......
  • Loki日志聚合分析系统-kubernetes
    Promtail介绍Loki是GrafanaLabs团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而......
  • 2-1初始Ajax|2-2.2-5Ajax基本用法|2-7GET请求|2-8POST请求
    什么是AjaxAjax即AsynchronousJavascriptAndXML(异步JavaScript和XML)在2005年被JesseJamesGarrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,......