国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

UnityShader3實現波浪效果

2020-01-24 00:07:50
字體:
來源:轉載
供稿:網友

本文實例為大家分享了UnityShader3實現波浪效果展示的具體代碼,供大家參考,具體內容如下

參考鏈接: 【OpenGL】Shader實例分析(一)-Wave

效果圖:

1.首先,實現格子背景圖

Shader "Custom/Curve"{ Properties { _BackgroundColor ("BackgroundColor", Color) = (1, 1, 1, 1) _BackgroundColor2 ("BackgroundColor2", Color) = (0, 0, 0, 1) _Space ("Space", Range(0, 1)) = 0.2 _XOffset ("XOffset", Range(-1, 1)) = 0.15 _YOffset ("YOffset", Range(-1, 1)) = 0.05 } 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; };  //格子背景 fixed4 _BackgroundColor; fixed4 _BackgroundColor2; fixed _Space; fixed _XOffset; fixed _YOffset;  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 { //fmod(x, y):x/y的余數,和x有同樣的符號  //step(a, x):如果x<a,返回0;如果x>=a,返回1  //得到一個小于_Space的余數,即a的范圍為[0, _Space) fixed a = fmod(i.uv.x + _XOffset, _Space); //有1/2概率返回0,有1/2概率返回1,從而形成間隔效果 a = step(0.5 * _Space, a);  fixed b = fmod(i.uv.y + _YOffset, _Space); b = step(0.5 * _Space, b);  return _BackgroundColor * a * b + _BackgroundColor2 * (1 - a * b); } ENDCG } }}

2.在中間添加一條直線

Shader "Custom/Curve"{ Properties { _BackgroundColor ("BackgroundColor", Color) = (1, 1, 1, 1) _BackgroundColor2 ("BackgroundColor2", Color) = (0, 0, 0, 1) _Space ("Space", Range(0, 1)) = 0.2 _XOffset ("XOffset", Range(-1, 1)) = 0.15 _YOffset ("YOffset", Range(-1, 1)) = 0.05 } 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; };  //格子背景 fixed4 _BackgroundColor; fixed4 _BackgroundColor2; fixed _Space; fixed _XOffset; fixed _YOffset;  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 { //fmod(x, y):x/y的余數,和x有同樣的符號  //step(a, x):如果x<a,返回0;如果x>=a,返回1  //得到一個小于_Space的余數,即a的范圍為[0, _Space) fixed a = fmod(i.uv.x + _XOffset, _Space); //有1/2概率返回0,有1/2概率返回1,從而形成間隔效果 a = step(0.5 * _Space, a);  fixed b = fmod(i.uv.y + _YOffset, _Space); b = step(0.5 * _Space, b);  fixed4 bgCol = _BackgroundColor * a * b + _BackgroundColor2 * (1 - a * b);   //范圍(1, 51),乘上100是擴大差距(中間最亮其他兩邊基本不亮),加上1是防止0作為除數,同時確保最中間最亮 float v = abs(i.uv.y - 0.5) * 100 + 1; v = 1 / v; fixed4 lineCol = fixed4(v, v, v, 1);  return bgCol + lineCol; } ENDCG } }}

3.直線變曲線

Shader "Custom/Curve"{ Properties { //調整背景 _BackgroundColor ("BackgroundColor", Color) = (1, 1, 1, 1) _BackgroundColor2 ("BackgroundColor2", Color) = (0, 0, 0, 1) _Space ("Space", Range(0, 1)) = 0.2 _XOffset ("XOffset", Range(-1, 1)) = 0.15 _YOffset ("YOffset", Range(-1, 1)) = 0.05  //調整曲線的波動 _Frequency ("Frequency", Range(0, 100)) = 10//頻率 _Amplitude ("Amplitude", Range(0, 1)) = 0.1//振幅 _Speed ("Speed", Range(0, 100)) = 10//速度 } 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; };  //格子背景 fixed4 _BackgroundColor; fixed4 _BackgroundColor2; fixed _Space; fixed _XOffset; fixed _YOffset;  half _Frequency; half _Amplitude; half _Speed;  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 { //fmod(x, y):x/y的余數,和x有同樣的符號  //step(a, x):如果x<a,返回0;如果x>=a,返回1  //得到一個小于_Space的余數,即a的范圍為[0, _Space) fixed a = fmod(i.uv.x + _XOffset, _Space); //有1/2概率返回0,有1/2概率返回1,從而形成間隔效果 a = step(0.5 * _Space, a);  fixed b = fmod(i.uv.y + _YOffset, _Space); b = step(0.5 * _Space, b);  fixed4 bgCol = _BackgroundColor * a * b + _BackgroundColor2 * (1 - a * b);   //范圍(1, 51),乘上100是擴大差距(中間最亮其他兩邊基本不亮),加上1是防止0作為除數,同時確保最中間最亮 //float y = i.uv.y + sin(_Time.y);掃描線效果 float y = i.uv.y + sin(i.uv.x * _Frequency + _Time.y * _Speed) * _Amplitude;//可以看成一條y的關于x的方程式 float v = abs(y - 0.5) * 100 + 1; v = 1 / v; fixed4 lineCol = fixed4(v, v, v, 1);  return bgCol + lineCol; } ENDCG } }}

注釋掉的是掃描線效果:

4.多曲線。其實就是for循環,然后在頻率和振幅上加些變量,即可形成多條不同的曲線。

Shader "Custom/Curve"{ Properties { //調整背景 _BackgroundColor ("BackgroundColor", Color) = (1, 1, 1, 1) _BackgroundColor2 ("BackgroundColor2", Color) = (0, 0, 0, 1) _Space ("Space", Range(0, 1)) = 0.2 _XOffset ("XOffset", Range(-1, 1)) = 0.15 _YOffset ("YOffset", Range(-1, 1)) = 0.05  //調整曲線的波動 _Frequency ("Frequency", Range(0, 100)) = 10//頻率 _Amplitude ("Amplitude", Range(0, 1)) = 0.1//振幅 _Speed ("Speed", Range(0, 100)) = 10//速度 } 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; };  //格子背景 fixed4 _BackgroundColor; fixed4 _BackgroundColor2; fixed _Space; fixed _XOffset; fixed _YOffset;  half _Frequency; half _Amplitude; half _Speed;  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 { //fmod(x, y):x/y的余數,和x有同樣的符號  //step(a, x):如果x<a,返回0;如果x>=a,返回1  //得到一個小于_Space的余數,即a的范圍為[0, _Space) fixed a = fmod(i.uv.x + _XOffset, _Space); //有1/2概率返回0,有1/2概率返回1,從而形成間隔效果 a = step(0.5 * _Space, a);  fixed b = fmod(i.uv.y + _YOffset, _Space); b = step(0.5 * _Space, b);  fixed4 bgCol = _BackgroundColor * a * b + _BackgroundColor2 * (1 - a * b);   //范圍(1, 51),乘上100是擴大差距(中間最亮其他兩邊基本不亮),加上1是防止0作為除數,同時確保最中間最亮 //float y = i.uv.y + sin(_Time.y);掃描線效果  fixed4 lineCol;  for(int count = 0;count < 3;count++) {  float y = i.uv.y + sin(i.uv.x * _Frequency * count * 0.1 + _Time.y * _Speed) * (_Amplitude + count * 0.1);//可以看成一條y的關于x的方程式  y = saturate(y);//重新映射到(0, 1)范圍  float v = abs(y - 0.5) * 100 + 1;  v = 1 / v;  lineCol += fixed4(v, v, v, 1);//注意是"+"操作,對顏色進行疊加 }  return bgCol + lineCol; } ENDCG } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋中市| 阳朔县| 禹城市| 南丹县| 阿拉尔市| 博湖县| 如皋市| 广西| 电白县| 灵寿县| 南城县| 明光市| 宝丰县| 都昌县| 阳新县| 乐亭县| 鄂温| 溧水县| 灵台县| 凤台县| 石城县| 沈丘县| 钦州市| 祥云县| 龙游县| 台东县| 韶关市| 盱眙县| 南宫市| 虞城县| 禄丰县| 邳州市| 玉门市| 连山| 凤庆县| 阿拉善左旗| 万载县| 井冈山市| 旬邑县| 无棣县| 鄂伦春自治旗|