Unity Shader学习:2D图形绘制(蓝天白云大海),供大家参考,具体内容如下
基本是一些数学上的算法
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; } //画复数云 float4 DrawClouds(float2 uv) { uv.x += 0.03*_Time.y; //使得左右连续 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; } //画太阳光环 float4 DrawSunCircle(float2 uv,float2 center,float size) { uv = uv - center; uv = uv / size; //atan2返回点(x,y)与x轴的夹角,范围(-π,π] //获取极坐标的θ角度 float degree = atan2(uv.y , uv.x ) + _Time.y * -0.1; //uv向量离中心点距离 //获取极坐标的r=x2+y2开方 float len = length(uv); //根据极坐标玫瑰线:r(θ)=a*sin(kθ) //求得r;a为扩散幅度,k为花瓣数*0.5 float r = 0.3*abs(sin(degree*5.0)); //画花瓣 //保留r值小于到中心点距离的所有像素 float sunRound= smoothstep(r + 0.1 + _SunRoundFactor, r + _SunRoundFactor, len); return float4(1,1,1,sunRound)*_SunRoundColor; } //画波浪(参数: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函数的部分透明度为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; //太阳光环 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 } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍extjs图形绘制之饼图实现方法分析,包括了extjs图形绘制之饼图实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了extjs图形绘制之饼图实现方法。分享给大家供大家参考,具体如下: 这篇文章将介绍extjs中自带的饼图。 代码如下: 注: 1.上面中的createStore是创建饼图所需要的数据的--store。 2.上面中的legend 显示的右边的图例(表明
本文向大家介绍python ImageDraw类实现几何图形的绘制与文字的绘制,包括了python ImageDraw类实现几何图形的绘制与文字的绘制的使用技巧和注意事项,需要的朋友参考一下 python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线、椭圆、弧、弦、多边形以及文字等。 下面直接通过示例来进行说明: 首先,通过ImageDraw类创建一个绘制对
本文向大家介绍extjs图表绘制之条形图实现方法分析,包括了extjs图表绘制之条形图实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了extjs图表绘制之条形图实现方法。分享给大家供大家参考,具体如下: 这篇文章将介绍extjs图表中条形图。 将实现以下的功能: 1.从后端请求数据并运用到图表中,形成动态数据。 2.查询出每年各个月中人数。 3.改变条形柱的颜色,改变默认的颜色
各位程序员好, 我在代码中遇到了一个似乎无法破解的小问题。它与Java的Jframe;图形区域有关。我将在下面发布的代码是在一个绘图方法上。其目的是绘制ArrayList中的房间,该房间位于另一个类中,因此之前。这种偏离航线的情况不会发生,因此在这里发帖。 获取有关该项目的背景信息是ArrayList,其中包含各种不同大小和颜色的房间。房间本身就是物体。 首先是课程: 下面是用于创建房间的类。 我
本文向大家介绍C# 绘制实时折线图,波形图,包括了C# 绘制实时折线图,波形图的使用技巧和注意事项,需要的朋友参考一下 此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图。本文仅供学习分享使用,如有不足之处,还请指正。 涉及知识点: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制。 Chart控件的相关概念: C
本文向大家介绍C#实现绘制面形图表的方法详解,包括了C#实现绘制面形图表的方法详解的使用技巧和注意事项,需要的朋友参考一下 本例详细讲述了C#实现的面形图绘制例子,这是其中一个核心绘制文件的代码,代码中的里面的注释很多,也比较详细,相信对于初学者学习及理解C#图形绘制方面的技术要点、难点有所帮助。 C#绘制面形图的主要功能代码如下: 面形图是平时很普及的一种图表风格,用来显示数据挺方便的。合理的加