欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity Shader實(shí)現(xiàn)圖形繪制(藍(lán)天白云大海)

 更新時間:2020年04月29日 11:01:30   作者:ZzEeRO  
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)圖形繪制,藍(lán)天白云大海,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

Unity Shader學(xué)習(xí):2D圖形繪制(藍(lán)天白云大海),供大家參考,具體內(nèi)容如下

基本是一些數(shù)學(xué)上的算法

shader部分:

Shader "Unlit/2D-Ocean"
{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 _SunColor("SunColor",Color) = (1,1,1,1)
 _SunRoundColor("SunRoundColor",Color) = (1,0,0,1)
 _WaveColor1("WaveColor1",Color) = (1,1,1,1)
 _WaveColor2("WaveColor2",Color) = (1,1,1,1)
 _WaveColor3("WaveColor3",Color) = (1,1,1,1)
 _WaveColor4("WaveColor4",Color) = (1,1,1,1)
 _WaveColor5("WaveColor5",Color) = (1,1,1,1)
 _SkyColor("SkyColor",Color)=(0,1,0,1)
  _CloudPos1("CloudPos1",Vector)=(0,0,0,0)
 _CloudPos2("CloudPos2",Vector) = (0,0,0,0)
 _CloudPos3("CloudPos3",Vector) = (0,0,0,0)
 _CloudPos4("CloudPos4",Vector) = (0,0,0,0)
 _CloudPos5("CloudPos5",Vector) = (0,0,0,0)
 _WaveFactor1("WaveFactor1",Vector)=(0,0,0,0)
 _WaveFactor2("WaveFactor2",Vector) = (0,0,0,0)
 _WaveFactor3("WaveFactor3",Vector) = (0,0,0,0)
 _WaveFactor4("WaveFactor4",Vector) = (0,0,0,0)
 _WaveFactor5("WaveFactor5",Vector) = (0,0,0,0)
 _SunPos("SunPos",Vector)=(0,0,0,0)
 _SunRoundFactor("SunRoundFactor",Range(0.0,2.0)) = 0.1
 _SunSize("SunSize",Range(0.0,1.0)) = 1.0
 }
 SubShader
 {
 Tags { "RenderType"="Transparent" }
 LOD 100

 Blend SrcAlpha OneMinusSrcAlpha
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag 
 #include "UnityCG.cginc"

 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };

 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : SV_POSITION;
 };

 sampler2D _MainTex;
 float4 _MainTex_ST;
 float4 _CloudPos1;
 float4 _CloudPos2;
 float4 _CloudPos3;
 float4 _CloudPos4;
 float4 _CloudPos5;
 float4 _WaveColor1;
 float4 _WaveColor2;
 float4 _WaveColor3;
 float4 _WaveColor4;
 float4 _WaveColor5;
 float4 _WaveFactor1;
 float4 _WaveFactor2;
 float4 _WaveFactor3;
 float4 _WaveFactor4;
 float4 _WaveFactor5;
 float4 _SunColor;
 float4 _SunRoundColor;
 float4 _SunPos;
 float _SunRoundFactor;
 float _SunSize;
 float4 _SkyColor;
 
 //畫單個圓(uv,位置,大小,抗鋸齒)
 float4 Circle(float2 uv, float2 center, float size, float blur) {
 uv = uv - center;
 uv = uv / size;
 float len = length(uv);
 //長度大于一個半徑單位透明度為0,小于透明度為1
 float val = smoothstep(1.0,1.0-blur, len);
 return float4(1, 1, 1, val);
 }

 //畫單個云
 float4 DrawCloud(float2 uv, float2 center, float size) {
 uv = uv - center;
 uv = uv / size;
 float4 col = Circle(uv, float2(0.0, 0.0), 0.2, 1);
 //將圓中不想要的部分剪切掉
 col = col * smoothstep(-0.1, -0.1 + 0.01, uv.y);
 //圓擺放不同位置組成云
 col += Circle(uv, float2(0.15, -0.05), 0.1, 1);
 col += Circle(uv, float2(0.0, -0.1), 0.11, 1);
 col += Circle(uv, float2(-0.15, -0.1), 0.1, 1);
 col += Circle(uv, float2(-0.3, -0.08), 0.1, 1);
 col += Circle(uv, float2(-0.2, 0.0), 0.15, 1);
 return col;
 }

 //畫復(fù)數(shù)云
 float4 DrawClouds(float2 uv) {
 uv.x += 0.03*_Time.y;
 //使得左右連續(xù)
 uv.x = frac(uv.x + 0.5) - 0.5;
 float4 col = DrawCloud(uv, _CloudPos1.xy, 0.1);
 col += DrawCloud(uv, _CloudPos2.xy, 0.12);
 col += DrawCloud(uv, _CloudPos3.xy, 0.14);
 col += DrawCloud(uv, _CloudPos4.xy, 0.16);
 col += DrawCloud(uv, _CloudPos5.xy, 0.18);
 return col;
 }

 //畫太陽光環(huán)
 float4 DrawSunCircle(float2 uv,float2 center,float size) {
 uv = uv - center;
 uv = uv / size;
 //atan2返回點(diǎn)(x,y)與x軸的夾角,范圍(-π,π]
 //獲取極坐標(biāo)的θ角度
 float degree = atan2(uv.y , uv.x ) + _Time.y * -0.1;
 //uv向量離中心點(diǎn)距離
 //獲取極坐標(biāo)的r=x2+y2開方
 float len = length(uv);
 //根據(jù)極坐標(biāo)玫瑰線:r(θ)=a*sin(kθ)
 //求得r;a為擴(kuò)散幅度,k為花瓣數(shù)*0.5
 float r = 0.3*abs(sin(degree*5.0));
 //畫花瓣
 //保留r值小于到中心點(diǎn)距離的所有像素
 float sunRound= smoothstep(r + 0.1 + _SunRoundFactor, r + _SunRoundFactor, len);
 return float4(1,1,1,sunRound)*_SunRoundColor;
 }

 //畫波浪(參數(shù):uv,頻率,振幅,整體高度,移動速度)
 float4 DrawWave(float2 uv,float waveFrequency,float waveAmplitude,float waveHeight,float speed) {
 uv.x += speed * _Time.y;
 uv.y += sin(_Time.y+waveHeight)*0.02;
 //uv.y大于sin函數(shù)的部分透明度為0,小于的部分透明度為1
 float val = uv.y - sin(uv.x*waveFrequency)*waveAmplitude - waveHeight;
 val = smoothstep(0.001,0.0, val);
 return float4(1, 1, 1, val);
 }

 //畫背景
 float4 DrawBackground(float2 uv) {
 float4 val = lerp(float4(1,1,1,1), _SkyColor, uv.y);
 return val;
 }

 //混合圖層(b為前景,a為背景)
 float4 LerpImages(float4 a, float4 b) {
 return float4(lerp(a, b, b.a).rgb, a.a + b.a);
 }

 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
 return o;
 }
 
 float4 frag (v2f i) : SV_Target
 { 
 //太陽中心
 float4 sunCoreColor = Circle(i.uv, _SunPos.xy, _SunSize, 0.05)*_SunColor;
 //太陽光環(huán)
 float4 sunAroundColor = DrawSunCircle(i.uv, _SunPos.xy, _SunSize);
 //云
 float4 cloudsColor = DrawClouds(i.uv);
 //波浪
 float4 wave1 = DrawWave(i.uv, _WaveFactor1.x, _WaveFactor1.y, _WaveFactor1.z, _WaveFactor1.w)*_WaveColor1;
 float4 wave2 = DrawWave(i.uv, _WaveFactor2.x, _WaveFactor2.y, _WaveFactor2.z, _WaveFactor2.w)*_WaveColor2;
 float4 wave3 = DrawWave(i.uv, _WaveFactor3.x, _WaveFactor3.y, _WaveFactor3.z, _WaveFactor3.w)*_WaveColor3;
 float4 wave4 = DrawWave(i.uv, _WaveFactor4.x, _WaveFactor4.y, _WaveFactor4.z, _WaveFactor4.w)*_WaveColor4;
 float4 wave5 = DrawWave(i.uv, _WaveFactor5.x, _WaveFactor5.y, _WaveFactor5.z, _WaveFactor5.w)*_WaveColor5;
 //背景
 float4 backgroundColor = DrawBackground(i.uv);
 //圖層疊加
 float4 finalColor = LerpImages(backgroundColor, sunAroundColor);
 finalColor = LerpImages(finalColor, sunCoreColor);
 finalColor= LerpImages(finalColor, wave1);
 finalColor = LerpImages(finalColor, wave2);
 finalColor = LerpImages(finalColor, wave3);
 finalColor = LerpImages(finalColor, wave4);
 finalColor = LerpImages(finalColor, wave5);
 finalColor = LerpImages(finalColor, cloudsColor);
 return finalColor;
 }
 ENDCG
 }
 }
}

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

相關(guān)文章

  • 利用MySqlBulkLoader實(shí)現(xiàn)批量插入數(shù)據(jù)的示例詳解

    利用MySqlBulkLoader實(shí)現(xiàn)批量插入數(shù)據(jù)的示例詳解

    MySQLBulkLoader是MySQL?Connector/Net類中的一個類,用于包裝MySQL語句。本文將利用MySqlBulkLoader實(shí)現(xiàn)批量插入數(shù)據(jù)功能,感興趣的可以了解一下
    2022-06-06
  • C#使用Queue<T>進(jìn)行隊(duì)列設(shè)計

    C#使用Queue<T>進(jìn)行隊(duì)列設(shè)計

    Queue<T>類提供了許多方法和屬性,用于處理隊(duì)列中的元素,本文主要介紹了C#使用Queue<T>進(jìn)行隊(duì)列設(shè)計,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 利用Unity制作特寫鏡頭的示例代碼

    利用Unity制作特寫鏡頭的示例代碼

    這篇文章主要介紹了如何利用Unity制作特寫鏡頭效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的參考價值,感興趣的可以了解一下
    2022-04-04
  • c#中如何去除字符串左邊的0

    c#中如何去除字符串左邊的0

    這篇文章主要介紹了c#中如何去除字符串左邊的0問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 解決C#中Linq GroupBy 和OrderBy失效的方法

    解決C#中Linq GroupBy 和OrderBy失效的方法

    最近發(fā)現(xiàn)了一個問題,在服務(wù)器端的Linq GroupBy 和OrderBy居然不管用,后來終于解決了所以現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。
    2016-09-09
  • C#對文件名智能排序的算法

    C#對文件名智能排序的算法

    這篇文章介紹了C#對文件名智能排序的算法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • WinForm自定義函數(shù)FindControl實(shí)現(xiàn)按名稱查找控件

    WinForm自定義函數(shù)FindControl實(shí)現(xiàn)按名稱查找控件

    這篇文章主要介紹了WinForm自定義函數(shù)FindControl實(shí)現(xiàn)按名稱查找控件,需要的朋友可以參考下
    2014-08-08
  • C#簡單實(shí)現(xiàn)SNMP的方法

    C#簡單實(shí)現(xiàn)SNMP的方法

    這篇文章主要介紹了C#簡單實(shí)現(xiàn)SNMP的方法,通過一個簡單的自定義類分析了C#實(shí)現(xiàn)SNMP的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C# WebApi 接口傳參詳解

    C# WebApi 接口傳參詳解

    這篇文章主要介紹了C# WebApi 接口傳參詳解,本篇打算通過get、post、put、delete四種請求方式分別談?wù)劵A(chǔ)類型(包括int/string/datetime等)、實(shí)體、數(shù)組等類型的參數(shù)如何傳遞。感興趣的小伙伴們可以參考一下
    2018-07-07
  • Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼

    Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-11-11

最新評論