shader流光+自发光
生活随笔
收集整理的這篇文章主要介紹了
shader流光+自发光
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
(1)先看效果: 流光的圖片是unity自帶的,吃藕==
不想多說(shuō)什么了,很簡(jiǎn)單的效果。。。。。。用到的知識(shí)點(diǎn),之前的效果里都用到過(guò)
此處說(shuō)一下: rim 自發(fā)光 和 菲涅爾公式, 兩者都是 1- dot(NdotV), 與法線和視線的夾角相關(guān)
流光: 確定流光方向,即 uv偏移的方向
住注意點(diǎn):
Flow貼圖的設(shè)置這里要特別說(shuō)明三個(gè)地方
–(1) Alpha from Grayscale 從圖片的灰度生成alpha通道,直接制作alpha通道不直觀,灰度圖很直觀。
這個(gè)選項(xiàng)就是讓你用一張直觀的灰度圖生成通道。你可以不用這個(gè)選項(xiàng),而是自己提供一個(gè)有alpha通道的圖片 -- (2)wrap Mode當(dāng)uv超出0 1 范圍是的取值方法,我們需要讓這張圖循環(huán)往復(fù),就是利用wrap mode repeat來(lái)實(shí)現(xiàn)的。必須使用這個(gè)選項(xiàng) Shader "Unlit/Scan_Code" {Properties{_MainTex ("Texture", 2D) = "white" {}_RimMin("RimMin",Range(-1,1)) = 0_RimMax("RimMax",Range(0,2)) = 1_TinnerColor(" tinner color",Color) = (0,0,0,0)_RimColor("Rimcolor",Color) = (1,1,1,1)_RimTntensity(" Rim Intersity",float) =1.0_FlowTilling("_FlowTilling",vector) = (1,1,0,0)_FlowSpeed("_FlowSpeed",vector) = (1,1,0,0)_FlowIntensity("flow intensity",float) =1_FlowTex("flow tex",2D) = "white"{}_InnerAlpha("Innner Alpha",Range(0,1)) = 1}SubShader{// Queue = Transparent ,而不是這是 RenderTypeTags { "Queue"="Transparent" }Pass{ZWrite On}Pass{ZWrite OffBlend SrcAlpha OneCGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;float3 pos_world : TEXCOORD1;float3 normal_world : TEXCOORD2;float3 pivot_world : TEXCOORD3;};sampler2D _MainTex, _FlowTex;float4 _MainTex_ST;float _RimMin,_RimMax;float4 _TinnerColor;float4 _RimColor;float _RimTntensity, _InnerAlpha;float4 _FlowTilling, _FlowSpeed;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);float3 normal_world =UnityObjectToWorldNormal(v.normal);float3 worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.pos_world = worldPos;o.normal_world = normalize(normal_world);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.pivot_world = mul(unity_ObjectToWorld,float4(0.0,0.0,0.0,1.0)).xyz;return o;}fixed4 frag (v2f i) : SV_Target{// 自發(fā)光half3 normal_world = normalize(i.normal_world);half3 view_world = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);half NdotV = saturate(dot(normal_world,view_world));half fresnel = 1.0 - NdotV;fresnel = smoothstep(_RimMin,_RimMax,fresnel); half emiss = tex2D(_MainTex, i.uv).r;emiss = pow(emiss,5.0);half final_fresnel = saturate(fresnel + emiss);half3 final_rim_color = lerp(_TinnerColor,_RimColor * _RimTntensity, final_fresnel);half final_rim_alpha = final_fresnel;//流光(1)half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;//流光(2) 此處 + fresnel 是為了讓流光有立體感 有深度, 因?yàn)閒resnel本身就是 從兩邊向中間過(guò)渡的灰度圖//half2 uv_flow = ((i.pos_world.xy - i.pivot_world.xy)+ saturate(fresnel)) * _FlowTilling.xy;uv_flow = uv_flow + _FlowSpeed.xy * _Time.y;float4 flow_rgba = tex2D(_FlowTex,uv_flow);// 最后合并輸出half3 final_color = final_rim_color + flow_rgba.rgb;half final_Alpha = saturate(final_rim_alpha + flow_rgba.a + _InnerAlpha);//return float4(flow_rgba);return float4(final_color,final_Alpha);}ENDCG}} }流光二:
Shader "Unlit/Hologram_code" {Properties{_MainTex ("_MainTex", 2D) = "white" {}_FlowMap ("_FlowMap", 2D) = "white" {}_Tilling("_Tilling",float) = 1_Speed ("_Speed",float) = 1_ScanflineOffset("_ScanflineOffset 控制寬度",float) = 1_ScanflinePower("_ScanflinePower 控制軟硬程度",float) = 1_ScanfColor("_ScanfColor",color) = (0,0,0,0)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float3 worldPos : TEXCOORD1;float3 PivotPos : TEXCOORD2;float4 vertex : SV_POSITION;};sampler2D _MainTex,_FlowMap;float4 _MainTex_ST;float _Speed,_Tilling;float _ScanflineOffset,_ScanflinePower;float4 _ScanfColor;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.PivotPos = mul(unity_ObjectToWorld,float4(0,0,0,1));o.worldPos = mul(unity_ObjectToWorld,v.vertex);return o;}// 在傳入?yún)?shù)的時(shí)候,請(qǐng)注意 是否是需要 U和V 都在變換???// 當(dāng)只需要Y方向流動(dòng)時(shí) tilling.x 和 speed.x 都傳入 0 float4 GetFlowCol (float3 worldPos,float3 pivotPos,float2 tilling,float2 speed){float flowDataY = (worldPos.y- pivotPos.y) * tilling.y + _Time.y * speed.y;float flowDataX = (worldPos.x- pivotPos.x) * tilling.x + _Time.y * speed.x;float2 flowUV = float2(flowDataX,flowDataY);float4 flowCol = tex2D(_FlowMap,flowUV);return flowCol;}fixed4 frag (v2f i) : SV_Target{// float flowDataY = (i.worldPos.y- i.PivotPos.y) * _Tilling + _Time.y * _Speed;// flowDataY = flowDataY/30.0;// float2 flowUV = float2(0.5,flowDataY);// float4 flowCol = tex2D(_FlowMap,flowUV);// fixed4 col = tex2D(_MainTex, i.uv);float4 dd = GetFlowCol(i.worldPos,i.PivotPos,float2(0,_Tilling),float2(0,_Speed));float data = (dd.r - _ScanflineOffset) * _ScanflinePower;data = _ScanfColor * data;return data;}ENDCG}} }總結(jié)
以上是生活随笔為你收集整理的shader流光+自发光的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 快速排序两种最基本思路
- 下一篇: Java实现人民币大小写转换