亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

UnityShader3實(shí)現(xiàn)彩光效果

 更新時(shí)間:2019年03月03日 08:54:47   作者:宏哥1995  
這篇文章主要為大家詳細(xì)介紹了UnityShader3實(shí)現(xiàn)彩光效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了UnityShader3實(shí)現(xiàn)彩光效果展示的具體代碼,供大家參考,具體內(nèi)容如下

參考鏈接: 【OpenGL】Shader實(shí)例分析(八)- 彩色光圈

效果圖:

這里我把它分三部分實(shí)現(xiàn):1.彩色 2.光圈 3.動(dòng)畫(huà)

1.先實(shí)現(xiàn)彩色效果。分析一下那張彩色圖,它是以中心為原點(diǎn)的,然后顏色分為三部分,如下圖。當(dāng)角度為90度時(shí),藍(lán)色最多;當(dāng)角度為-150度時(shí),紅色最多;當(dāng)角度為-30度時(shí),綠色最多。然后其他地方就是三色混合。

Shader "Custom/Colors"
{
 Properties
 {
 _AngleRange ("AngleRange", Range(60, 120)) = 60
 }
 SubShader
 {
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "UnityCG.cginc"
 
 #define PI 3.142
 
 struct appdata
 {
 float4 vertex : POSITION;
 };
 
 struct v2f
 { 
 float4 vertex : SV_POSITION;
 float4 scrPos : TEXCOORD0;
 };
 
 half _AngleRange;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 o.scrPos = ComputeScreenPos(o.vertex);
 
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 //范圍在(0, 1) 
 float2 wcoord = i.scrPos.xy / i.scrPos.w; 
 //映射到(-1, 1),即屏幕中心為(0, 0) 
 wcoord = wcoord * 2 - 1; 
 //atan2(y, x):反正切,y/x的反正切范圍在[-π, π]內(nèi) 
 float radian = atan2(wcoord.y, wcoord.x); 
 //1度(°)=0.017弧度(rad)
 //1弧度(rad)=57.29578度(°)
 float angle = radian * 57.3;
 //映射到(0, 360)
 if(angle < 0) angle = 360 + angle;
 
 fixed b = 1 - saturate(abs(angle - 90) / _AngleRange);
 fixed g;
 if(angle > 180) g = 1 - saturate(abs(angle - 330) / _AngleRange); 
 else g = 1 - saturate((angle + 30) / _AngleRange);
 fixed r = 1 - saturate(abs(angle - 210) / _AngleRange);
 
 return fixed4(r, g, b, 1);
 }
 ENDCG
 }
 }
}

2.先說(shuō)一下1 / (xxx)這個(gè)式子的強(qiáng)大,它實(shí)現(xiàn)的效果,往往會(huì)帶有光暈效果。其中第六個(gè)就是我們想要實(shí)現(xiàn)的光圈效果。

Shader "Custom/Test"
{
 Properties
 {
 _Value ("Value", Range(1, 50)) = 1
 }
 SubShader
 {
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "UnityCG.cginc"
 
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
 
 struct v2f
 { 
 float4 vertex : SV_POSITION;
 float2 uv : TEXCOORD0;
 };
 
 half _Value;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 o.uv = v.uv;
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 //映射到(-1, 1),使其中心點(diǎn)為原點(diǎn)
 float2 uv = i.uv * 2 - float2(1, 1);
 float v;
 
 //v = 1 / abs(_Value * uv.y);//1
 //v = 1 / abs(_Value * (uv.y + uv.x));//2
 //v = 1 / abs(_Value * (uv.y + 2 * uv.x));//3
 //v = 1 / abs(_Value * (abs(uv.y) + abs(uv.x)));//4
 //v = 1 / abs(_Value * length(uv));//5
 //v = 1 / abs(_Value * abs(length(uv) - 0.5));//6
 v = 1 / abs(_Value * abs(uv.x / uv.y));//7 x越小y越大,則越亮
 
 return fixed4(v, v, v, 1);
 }
 ENDCG
 }
 }
}

3.動(dòng)畫(huà)。這里我做的效果是基于角度的光線間隔效果,首先當(dāng)然就是計(jì)算角度了,間隔的實(shí)現(xiàn)就是fmod和step的使用。

Shader "Custom/Test"
{
 Properties
 {
 _Width ("Width", Range(30, 90)) = 45
 }
 SubShader
 {
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "UnityCG.cginc"
 
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
 
 struct v2f
 { 
 float4 vertex : SV_POSITION;
 float2 uv : TEXCOORD0;
 };
 
 half _Width;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 o.uv = v.uv;
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 //映射到(-1, 1),使其中心點(diǎn)為原點(diǎn)
 float2 uv = i.uv * 2 - float2(1, 1);
 
 float a = atan2(uv.y, uv.x);
 a *= 57.3;
 if(a < 0) a += 360;
 
 float b = fmod(a + _Time.y * 20, _Width);
 b = step(0.5 * _Width, b);
 
 return fixed4(b, b, b, 1);
 }
 ENDCG
 }
 }
}

>

4.最后當(dāng)然就是將它們?nèi)嘣谝黄鹆恕?/p>

Shader "Custom/Colors"
{
 Properties
 {
 _AngleRange ("AngleRange", Range(60, 120)) = 60
 _Width ("Width", Range(30, 90)) = 45 
 }
 SubShader
 {
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "UnityCG.cginc"
 
 #define PI 3.142
 
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
 
 struct v2f
 { 
 float4 vertex : SV_POSITION;
 float4 scrPos : TEXCOORD0;
 float2 uv : TEXCOORD1;
 };
 
 half _AngleRange;
 half _Width; 
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 o.scrPos = ComputeScreenPos(o.vertex);
 o.uv = v.uv; 
 
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 //1.彩色
 
 //范圍在(0, 1) 
 float2 wcoord = i.scrPos.xy / i.scrPos.w; 
 //映射到(-1, 1),即屏幕中心為(0, 0) 
 wcoord = wcoord * 2 - 1; 
 //atan2(y, x):反正切,y/x的反正切范圍在[-π, π]內(nèi) 
 float radian = atan2(wcoord.y, wcoord.x); 
 //1度(°)=0.017弧度(rad)
 //1弧度(rad)=57.29578度(°)
 float angle = radian * 57.3;
 //映射到(0, 360)
 if(angle < 0) angle = 360 + angle;
 
 fixed b = 1 - saturate(abs(angle - 90) / _AngleRange);
 fixed g;
 if(angle > 180) g = 1 - saturate(abs(angle - 330) / _AngleRange); 
 else g = 1 - saturate((angle + 30) / _AngleRange);
 fixed r = 1 - saturate(abs(angle - 210) / _AngleRange);
 
 //2.光圈
 
 //映射到(-1, 1),使其中心點(diǎn)為原點(diǎn) 
 float2 uv = i.uv * 2 - float2(1, 1); 
 float v = 1 / abs(30 * abs(length(uv) - 0.3));
 
 //3.轉(zhuǎn)動(dòng)
 
 float a = atan2(uv.y, uv.x); 
 a *= 57.3; 
 if(a < 0) a += 360; 
 
 float aa = fmod(a + _Time.y * 20, _Width); 
 aa = step(0.5 * _Width, aa); 
 
 //////////////////////
 //////////////////////
 if(length(uv) < 0.3) return fixed4(0, 0, 0, 1);
 return fixed4(r, g, b, 1) * aa + fixed4(v, v, v, 1);
 }
 ENDCG
 }
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#使用時(shí)序數(shù)據(jù)庫(kù)InfluxDB的教程詳解

    C#使用時(shí)序數(shù)據(jù)庫(kù)InfluxDB的教程詳解

    InfluxDB是一個(gè)開(kāi)源的時(shí)序數(shù)據(jù)庫(kù),可以自動(dòng)處理時(shí)間序列數(shù)據(jù),這篇文章主要為大家詳細(xì)介紹了C#如何使用InfluxDB,感興趣的小伙伴可以跟隨小編一起了解下
    2023-11-11
  • C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字)

    C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字)

    幾年前就在網(wǎng)上看到過(guò)漢字轉(zhuǎn)拼音的程序,大都就是按漢字的編碼轉(zhuǎn)換,單字對(duì)應(yīng)的算法實(shí)現(xiàn)的。但是都有一個(gè)共同的缺點(diǎn),不能支持多音字。本篇文章主要介紹了C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字),有興趣的可以了解一下。
    2016-12-12
  • C#檢查遠(yuǎn)程或本地磁盤(pán)使用率

    C#檢查遠(yuǎn)程或本地磁盤(pán)使用率

    要檢查磁盤(pán)的使用情況確定程序放哪個(gè)服務(wù)器和清理垃圾,所以寫(xiě)個(gè)小程序幫忙檢查。本文給大家介紹C#檢查遠(yuǎn)程或本地磁盤(pán)使用率的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Unity中 ShaderGraph 實(shí)現(xiàn)超級(jí)炫酷的溶解效果入門(mén)級(jí)教程

    Unity中 ShaderGraph 實(shí)現(xiàn)超級(jí)炫酷的溶解效果入門(mén)級(jí)教程

    這篇文章主要介紹了Unity中的 ShaderGraph 實(shí)現(xiàn)超級(jí)炫酷的溶解效果入門(mén)級(jí)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • C#橋接模式完整實(shí)例

    C#橋接模式完整實(shí)例

    這篇文章主要介紹了C#橋接模式,以實(shí)例形式較為詳細(xì)的分析了C#橋接模式的實(shí)現(xiàn)原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 深入了解c# 迭代器和列舉器

    深入了解c# 迭代器和列舉器

    這篇文章主要介紹了c# 迭代器和列舉器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)C#,感興趣的朋友可以了解下
    2020-08-08
  • WPF ComboBox獲取當(dāng)前選擇值的實(shí)例詳解

    WPF ComboBox獲取當(dāng)前選擇值的實(shí)例詳解

    這篇文章主要介紹了WPF ComboBox獲取當(dāng)前選擇值的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法

    .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法

    .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法,需要的朋友可以參考一下
    2013-03-03
  • C#中XmlTextWriter讀寫(xiě)xml文件詳細(xì)介紹

    C#中XmlTextWriter讀寫(xiě)xml文件詳細(xì)介紹

    .NET中包含了很多支持XML的類,這些類使得程序員使用XML編程就如同理解XML文件一樣簡(jiǎn)單。在這篇文章中,我將給出這樣的一個(gè)類的使用示例,這個(gè)類就是XmlTextWriter類
    2013-04-04
  • c# winform多線程死循環(huán)踩坑

    c# winform多線程死循環(huán)踩坑

    本文主要介紹了c# winform多線程死循環(huán)踩坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12

最新評(píng)論