Unity Shader实现图形绘制(蓝天白云大海)

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
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D绘制地形的实现方法

    项目中肯定会遇到需要用户自己绘制地形的需求,然后根据地形自动生成房间.下面说说我在绘制地形的实现方法. 我们百度可以看到很多关于自己创建mesh的博客,mesh的生成需要三角面顶点坐标以及顶点序列.所以,想要创建我们想要的mesh,首先要获取到绘制mesh的顶点.我们用户在绘制自己想创建的地形时会有很大的自由性.他是随心所欲想怎么画就怎么画.这也造就了很大的错误风险性,要求程序更加智能.好了,下面说下我们给自己程序设定的一些规则. 首先我们设置在绘制的时候摄像头的forward朝向Y轴向上,即我

  • Unity Shader实现图形绘制(蓝天白云大海)

    Unity Shader学习:2D图形绘制(蓝天白云大海),供大家参考,具体内容如下 基本是一些数学上的算法 shader部分: Shader "Unlit/2D-Ocean" { Properties { _MainTex ("Texture", 2D) = "white" {} _SunColor("SunColor",Color) = (1,1,1,1) _SunRoundColor("SunRoundColo

  • unity通过Mesh网格绘制图形球体

    本文实例为大家分享了unity通过Mesh网格绘制球体的具体代码,供大家参考,具体内容如下 接着上一篇文章说: 球体 public class 球体 : MonoBehaviour { MeshRenderer meshRenderer; MeshFilter meshFilter; List<Vector3> verts; List<int> indices; int N = 10; void Start() { verts = new List<Vector3>()

  • unity通过Mesh网格绘制图形(三角形、正方体、圆柱)

    一.介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的几种图形我们可以看一下: 我们可以在unity中通过Mesh类来绘制图形. 所以在我们绘制其它图形之前,首先完成一个小目标,画一个三角形. 二.绘制三角形 首先做准备工作: 1.在场景中创建一个空物体,并挂载MeshRenderer和MeshFilter组件.//我们先不考虑碰撞器的问题,所以不添加

  • Unity Shader实现描边OutLine效果

    本文实例为大家分享了Unity Shader实现描边OutLine效果的具体代码,供大家参考,具体内容如下 Shader实现描边流程大致为:对模型进行2遍(2个pass)绘制,第一遍(描边pass)在vertex shader中对模型沿顶点法线方向放大,fragment shader设置输出颜色为描边颜色:第二遍正常绘制模型,除被放大的部分外,其余被覆盖,这样就有了描边的效果. 实现代码如下: Shader "Custom/OutlineShader" { Properties { _

  • Unity shader实现移动端模拟深度水效果

    本文实例为大家分享了Unity shader实现移动端模拟深度水的具体代码,供大家参考,具体内容如下 描述: 在网上看到很多效果很好的水,比如根据水的深度,颜色有深浅变化,能让水变得更真实,但是又会涉及到比较复杂的计算,在移动端上面还是有些吃力的. 最近研究了一下,想在移动端上面模拟这样的效果 : 1 水的深浅透明度变化 2 水的深浅颜色变化 3 水上的阴影模拟(大面积的水通过烘焙比较浪费烘焙图) 根据上面的3点,可以通过一张黑白图的rg通道来实现深浅以及阴影的模拟 效果如下 如图,浅色的偏绿,

  • Unity Shader实现动态过场切换图片效果

    本文实例为大家分享了Unity Shader实现动态过场切换图片的具体代码,供大家参考,具体内容如下 一.简单介绍 Shader Language的发展方向是设计出在便携性方面可以和C++.Java等相比的高级语言,"赋予程序员灵活而方便的编程方式",并"尽可能的控制渲染过程"同时"利用图形硬件的并行性,提高算法效率". 本文介绍,如何使用 shader ,动态过场形式切换图片的一点简单效果. 二.实现原理 1.通过时间叠加判断,当 值小于 主图

  • Android开发实现各种图形绘制功能示例

    本文实例讲述了Android开发实现各种图形绘制功能.分享给大家供大家参考,具体如下: 这里结合本人的开发事例,简单介绍一下如何在Android平台下实现各种图形的绘制. 首先自定义一个View类,这个view类里面需要一个Paint对象来控制图形的属性,需要一个Path对象来记录图形绘制的路径,需要一个Canvas类来执行绘图操作,还需要一个Bitmap类来盛放绘画的结果. Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPain

  • Python图形绘制操作之正弦曲线实现方法分析

    本文实例讲述了Python图形绘制操作之正弦曲线实现方法.分享给大家供大家参考,具体如下: 要画正弦曲线先设定一下x的取值范围,从0到2π.要用到numpy模块. numpy.pi 表示π numpy.arange( 0 , 2π ,0.01)  从0到2π,以0.01步进. 令 x=numpy.arange( 0, 2*numpy.pi, 0.01) y=numpy.sin(x) 画图要用到matplotlib.pyplot模块中plot方法. plot(x,y) pyplot.plot.sh

  • Unity shader实现遮罩效果

    本文实例为大家分享了Unity shader实现遮罩效果的具体代码,供大家参考,具体内容如下 效果: shader代码: Shader "Custom/Mask" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {}//目标图片,即需要被遮罩的图片 _MaskLayer("Culling Mask",2D) = "white"{}//混合的图片,设置

  • Unity shader实现消融效果

    本文实例为大家分享了Unity shader实现消融效果的具体代码,供大家参考,具体内容如下 效果图: shader代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/EdgeColo" { Properties { _MainTex ("Texture", 2D) = "white" {} _N

随机推荐