Unity的Shader学习笔记(14)[21/01/06_周三][52-53]

目录

课时52:FragmentShader-边缘泛光shader1

课时53:FragmentShader-边缘泛光shader2


上次是12/29号,30,31,1,2,3,4,5,正好一星期了,忙着赶项目,元旦都加班3天,根本没时间学习,阶段性的忙完了,继续。

项目组正好需要一个热力图功能,公司就我一个会点Shader,还是刚学的,在一个别人的基于uv的热力图shader的基础上,改造成了基于世界坐标的热力图。

学到的知识,真的不知道什么时候就会用上的,我们程序员。

暂时没时间安排开发人员学习shader啊,现在在让一个UI学一下看看。

课时52:FragmentShader-边缘泛光shader1

shadergraph里面有个泛光的节点

边缘查找

向量运算,点积

法向量和视向量的夹角,夹角越大(比如边缘)越亮,夹角越小(比如中间)越暗。

避免锯齿,放到片段函数中。

最基本的shader

Shader "Custom/NewSurfaceShader13"
{
    SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            struct v2f{
                float4 pos:POSITION;
            };
            v2f vert(appdata_base v){
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                return fixed4(1,1,1,1);
            }
            ENDCG
        }
    }
}

UnityObjectToWorldNormal

基本效果

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Custom/NewSurfaceShader13"
{
    Properties
    {
        _MainColor("MainColor",color)=(1,1,1,1)
        _Scale("Scale",range(1,8))=2
    }
    SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            fixed4 _MainColor;
            float _Scale;
            struct v2f{
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                float4 vertex:TEXCOORD1;
            };
            v2f vert(appdata_base v){
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.vertex=v.vertex;
                o.normal=v.normal;
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float3 N=mul(IN.normal,(float3x3)unity_WorldToObject);
                N=normalize(N); //UnityObjectToWorldNormal
                
                //WorldSpaceViewDir
                float3 worldPos=mul(unity_ObjectToWorld,IN.vertex).xyz;
                float3 V=_WorldSpaceCameraPos-worldPos;
                V=normalize(V);

                float bright=1.0-saturate(dot(N,V));
                bright=pow(bright,_Scale);
                fixed4 col=_MainColor*bright;
                return col;
            }
            ENDCG
        }
    }
}

反过来:float bright=saturate(dot(N,V));

增加透明

        tags{"queue"="transparent"}
        pass
        {
            blend srcAlpha oneMinusSrcAlpha

zwrite off

在Skybox的情况下,zwrite是否关闭差别不大。

反一下:

课时53:FragmentShader-边缘泛光shader2

外边缘光晕

提供顶点

多个pass混合

沿着法向量扩展

1.增加一个pass,沿着法线扩展,从内往外扩散,仅仅修改透明度,

2.混合

中间颜色太亮了

增加一个pass,挖掉中间部分

blendop revsub

blend dstAlpha one

        //==========================
        pass
        {
            blendop revsub
            blend dstAlpha one
            zwrite off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            struct v2f {
                float4 pos:POSITION;
            };
            v2f vert(appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            fixed4 frag(v2f IN) :COLOR
            {
                return fixed4(1,1,1,1);
            }
            ENDCG
        }
        //==============================

再结合原来的边缘效果

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值