{

目录
  • 人物移动+相机跟随脚本修改
  • Gpuinstance实现大面积草地
  • 风吹麦浪+人物影响
  • 后处理动态天空实现
  • 动态天空实现
  • 体积光实现的三种方法
Demo

链接:https://github.com/Claymoreno1/Grass-Wind-VolumeLight-Sky-Chan
}

塞尔达传说天空模仿

题外话{
一个月没有搞Unity,因为考试的原因,之后又因为某些原因搞了一个星期的前端,感觉uniapp真是个好东西,提高开发效率神器,同时也感觉前端有点无聊(接触unity的原因? )
}
在shadertoy上看到了一个天空https://www.shadertoy.com/view/Msdfz8,感觉和塞尔达传说的很像,于是就抄了过来。
之前做的天空,用的Simplex 噪声,是用一个球形的Mesh来把摄像机包裹起来,云的形态非常好,但是看起来并不真实,因为天空需要给人无边无际的感觉,这次直接使用屏幕后处理,通过深度图重建世界坐标,分别绘制天空颜色,太阳,云效果比较好。

关于如何把GLSL转换成shaderlab,在动态天空实现篇已经讲过,相关文章也很多
算法上核心要素就是:用坐标点相对于摄像机的位移向量来做各种计算。
比如,这里i.FCray为该像素点的位置相对于摄像机的位移向量,越高或越低,y^2值也就越大,我们通过这个来控制颜色渐变,然后,如果i.FCray.y小于0,那么我们就让该像素颜色趋向于_Skycolor2

float3 col = _Skycolor*1.1-i.FCray.y*i.FCray.y*0.5;
col=lerp(col,_Skycolor2,pow(1.0-max(i.FCray.y,0.0),3.0));

通过这种方法,我们已经把天空的底色绘制出来了。

太阳的位置,我们先给定一个向量_Sunpos,用i.FCray与这个向量点乘,如果结果>0那就说明,夹角小于90°,根据这一点进行绘制即可。

云的绘制相对比较复杂,先根据云层给定不同的高度,再通过FBM噪声对颜色进行插值,这次并没有实时计算噪声,直接对噪声纹理进行采样,但是有次听大佬说纹理比复杂计算还要费,这个纹理可以根据需要用伪随机数替代。这里的FBM我没有照搬shadertoy上,进行了一些简化,噪声这块完全可以参照女神的谈谈噪声
以下是C#与shaderlab的全部代码
C#部分就是重建世界坐标模板代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class Sky : MonoBehaviour
{public Material skymat;private Camera thiscamera;private Transform thiscameratrans;private void OnEnable(){thiscamera = this.GetComponent<Camera>();thiscameratrans = this.transform;thiscamera.depthTextureMode |= DepthTextureMode.Depth;}[ImageEffectOpaque]private void OnRenderImage(RenderTexture source, RenderTexture destination){SetRay();Graphics.Blit(source, destination,skymat);}private void SetRay(){Matrix4x4 frustumCorners = Matrix4x4.identity;//返回单位矩阵float fov = thiscamera.fieldOfView;float near = thiscamera.nearClipPlane;float aspect = thiscamera.aspect;float halfHeight = near * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad);Vector3 toRight =thiscameratrans.right * halfHeight * aspect;Vector3 toTop = thiscameratrans.up * halfHeight;Vector3 topLeft = thiscameratrans.forward * near + toTop - toRight;float scale = topLeft.magnitude / near;topLeft.Normalize();topLeft *= scale;Vector3 topRight = thiscameratrans.forward * near + toRight + toTop;topRight.Normalize();topRight *= scale;Vector3 bottomLeft = thiscameratrans.forward * near - toTop - toRight;bottomLeft.Normalize();bottomLeft *= scale;Vector3 bottomRight = thiscameratrans.forward * near + toRight - toTop;bottomRight.Normalize();bottomRight *= scale;frustumCorners.SetRow(0, bottomLeft);frustumCorners.SetRow(1, bottomRight);frustumCorners.SetRow(2, topRight);frustumCorners.SetRow(3, topLeft);skymat.SetMatrix("_FrustumCornersRay", frustumCorners);skymat.SetMatrix("_UnityMatVP", frustumCorners);}
}

shaderlab部分,主要也是混合噪声,已经注释了很多,主要难点就在云的把控

Shader "myshaders/postsky"
{Properties{_NoiseTex("Texture", 2D) = "white" {}_Skycolor("_Skycolor",color)=(1,1,1,1)_Skycolor2("_Skycolor2",color)=(1,1,1,1)_Sunpos("_Sunpos",vector)=(-0.8,0.4,-0.3,0)_Cloudcolor("_Cloudcolor",color)=(1.0,0.95,1.0)_Cloudspd("_Cloudspd",float)=1_Layer("_Layer",float)=3}SubShader{Pass{ZTest Always Cull Off ZWrite OffCGPROGRAM#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;float4 FCray:TEXCOORD1;};sampler2D _NoiseTex;float4 _NoiseTex_TexelSize;float4x4 _FrustumCornersRay;float4x4 _UnityMatVP;//float4 _Windway;sampler2D _CameraDepthTexture;float4 _Skycolor;float4 _Skycolor2;float4 _Sunpos;float4 _Cloudcolor;float _Cloudspd;float _Layer;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;#if UNITY_UV_STARTS_AT_TOPif(_NoiseTex_TexelSize.y<0)o.uv.y=1-o.uv.y;#endifint index =0;if(v.uv.x<0.5&&v.uv.y<0.5){index=0;}else if(v.uv.x>0.5&&v.uv.y<0.5){index=1;}else if(v.uv.x>0.5&&v.uv.y>0.5){index=2;}else{index=3;}#if UNITY_UV_STARTS_AT_TOPif(_NoiseTex_TexelSize.y<0)index=3-index;#endifo.FCray=_FrustumCornersRay[index];return o;}float FBM(float2 p,float t){float2 f=0.0;float s=0.5;for(int i=0;i<5;i++){p+=t;//时间偏移t*=1.5;//速度不同f+=s*tex2D(_NoiseTex,p/512).x;p*=2.0;s*=0.5;}return f;}fixed4 frag (v2f i) : SV_Target{//float linearDepth=LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv));//float3 worldPos=_WorldSpaceCameraPos+linearDepth*i.FCray.xyz;i.FCray=normalize(i.FCray);//-----天空//距离越远颜色越深,*1.1是为了让颜色不要太深float3 col = _Skycolor*1.1-i.FCray.y*i.FCray.y*0.5;//为了把下面的颜色剔除,给一个制定的颜色col=lerp(col,_Skycolor2,pow(1.0-max(i.FCray.y,0.0),3.0));//-----/天空//-----太阳//通过向量点乘,确定太阳位置A.*b>0说明夹角小于90°float sundot=clamp(dot(i.FCray.xyz,normalize(_Sunpos.xyz)),0.0,1.0);//感性计算,位置越正,rgb越趋近于1col+=0.25*float3(1.0,0.7,0.4)*pow(sundot,5.0);col+=0.25*float3(1.0,0.8,0.6)*pow(sundot,64.0);col+=0.2*float3(1.0,0.8,0.6)*pow(sundot,512.0);//-----/太阳//-----云float3 campos=_WorldSpaceCameraPos;float time=_Time.y*0.05*_Cloudspd;float3 c=i.FCray.xyz;for(int i=0;i<_Layer;i++){//给不同的层不同的高度float2 sc=campos.xz+c.xz*((i+3)*40000.0-campos.y)/c.y;//噪声插值混色col=lerp(col,_Cloudcolor,0.5*smoothstep(0.425,0.89,FBM(0.00006*sc,time*(i+3))));}//把下面的云剔除col=lerp(col,_Skycolor2,pow(1.0-max(c.y,0.0),16.0));//-----/云return float4(col,1);}ENDCG}}
}

仿塞尔达传说天空Unity shaderlab相关推荐

  1. Unity ShaderLab 常用函数

    Unity ShaderLab 常用函数 CG标准库: https://developer.download.nvidia.cn/cg/index_stdlib.html //数学函数 abs(x): ...

  2. Unity ShaderLab学习总结

    http://www.jianshu.com/p/7b9498e58659 Unity ShaderLab学习总结 作者 DonaldW 关注 2014.07.20 17:17* 字数 4891 阅读 ...

  3. Unity Shaderlab: Object Outlines 转

    转 https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/ Unity Shader ...

  4. 用unity shaderlab 实现「影之诗」中的闪卡特效(一)

    引言 大家好我是9级铁甲蛹,我从今天开始写博客了.虽然之前总想过要写写技术博客,但是觉得自己之前的学习经验对大家可能没什么帮助,而且网上许多资料非常详细.现在决定写一来是因为最近做了些有意思的东西,恰 ...

  5. shader变体是什么_[Unity/shaderlab]关于着色器变体

    在Unity中可以通过#pragma multi_compile或者#pragma shader_feature指令来实现着色器多样化. 在运行时,相应的着色器变体是从材质的关键词中取得的(Mater ...

  6. unity ShaderLab 基础之【像素混合Blend】Blend命令详解 shaderLab blend blendOp透明度颜色混合

    一 基础介绍 1颜色相关 在unity中,颜色分为RGB255,RGB1,HSV.这几种格式的值不同,但效果都一样. [RGB 0-255]: 形式一般为(R,G,B,A),取值范围为0-255. r ...

  7. Unity ShaderLab 坐标空间转换及方法

    shader基础 shader空间坐标介绍 未完成的空间转换表 数据类型 名称 shader中的变量名 数据类型 说明 vertex POSITION float4 顶点在空间中的位置 normal ...

  8. unity shaderlab Blend操作

    原文链接: http://www.tiankengblog.com/?p=84 Blend混合操作是作用于在所有计算之后,是Shader渲染的最后一步,进行Blend操作后就可以显示在屏幕上.shad ...

  9. Unity ShaderLab特效教程 适用于贴图、sprite和ugui的2d着色器实例 代码+详解注释 【锐化效果】

    如果代码中有什么不清楚请查看以下基础知识 Shader基础知识 unity3d 中 七种坐标知识详解 锐化效果 笑狗图 代码 Shader "Custom/BlurBox" {Pr ...

最新文章

  1. php记录邮件发送,有关php邮件发送一点记录
  2. SAP Spartacus 捕捉 PageEvent 的方式
  3. 分组显示的ListView分页加载数据
  4. matlab 的cat函数
  5. ext store 数据修改_Vue 组件数据通信方案总结
  6. keystroke java_Java KeyStroke.getCharacter方法代码示例
  7. nginx搭建tomcat集群
  8. 计算机在工业工程中的应用,在工业工程中信息技术的应用原稿(全文完整版)...
  9. integer判断是否为null_面试常考题JavaScript用七种方式教你判断一个变量是否为数组类型...
  10. C语言pid算法模糊控制,温度PID模糊控制的算法完整
  11. geek软件是干什么的_geektool--一款很geek的工具
  12. 利用python批量查询企业信息_python批量查询百度收录
  13. JDK内置并发框架AQS对CLH锁的优化
  14. 计算机二级和公共英语三级考试时间,英语三级考试时间,全国英语等级考试三级时间。...
  15. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
  16. Redis底层数据结构(图文详解)
  17. python3数据分析的书籍_从零开始用Python3做数据分析
  18. chef infra安装和使用入门
  19. 蓝牙nrf52832的架构和开发
  20. 域名之父—蔡文胜 (下篇)

热门文章

  1. 正则表达式判断是否符合USD格
  2. 数理统计与统计软件测试卷,数理统计试题及答案
  3. 如何获取中国电信、网通、铁通的最新ip地址段
  4. 马加爵 谭卓 牛顿等人在天堂的对话
  5. 从flv文件中提取h264码流(使用av_bsf_send_packet和av_bsf_receive_packet)
  6. foldermove中文版下载 | FolderMove(电脑文件夹移动软件)单文件汉化版V3.0.0.0 | 最新版foldermove下载
  7. python中while True的用处
  8. 2-12 输出华氏-摄氏温度转换表 (15 分)
  9. Django MVT模型详解--高级
  10. 将人像照做成旋转风车效果!超实用Photoshop教程