目录
课时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
}
//==============================
再结合原来的边缘效果