{
目录
}
效果如下:
我最开始的想法是,先提前做两张分形噪声(每张都叠了8次柏林噪声)纹理,然后通过_Time.x控制采样,根据采样结果混合颜色插值,然后效果一般,我的颜色配置的不好,感性计算也不是很到位,然后在shadertoy上看到了
https://www.shadertoy.com/view/4tdSWr
第一反应是amazing,然后再看看自己苟的效果真是惨不忍睹。。。
关于原理,当然他也用了噪声,不过是单形噪声(Simplex噪声),是柏林噪声的改进版,计算复杂度低,越高维度优势越明显,天空的颜色是一个过渡色,然后云的颜色和云彩边缘,云的形状都是用单形噪声得来的,仔细想想套路一样,然后效果差距巨大
shadertoy上都是用GLSL写的,和unity的shaderlab有些区别,我参考了https://www.jianshu.com/p/0dd606730177
按照他的套路改了一下,先预定义一些函数
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iGlobalTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define texture2D tex2D
#define iResolution _ScreenParams
#define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)
这些不是全部,根据情况增减
,把矩阵*法改为mul
比如
vec2 n;
mat2 m;
n*=m;
//改为
n = mul(m , n);
还有
const float speed = 0.03;
const float clouddark = 0.5;
const float cloudlight = 0.3;
//这些都要改为
#define speed 0.03
#define clouddark 0.5
#define cloudlight 0.3
其实转换还是比较容易的,不用从头到尾翻译一遍。
我转换完的代码如下:
Shader "Shadertoy/sky1" {
Properties{
_MainTex("_MainTex",2D)="white"{
}
}
CGINCLUDE
#include "UnityCG.cginc"
#pragma target 3.0
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iGlobalTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define texture2D tex2D
#define iResolution _ScreenParams
#define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)
#define iTime _Time.y
#define PI2 6.28318530718
#define pi 3.14159265358979