Unity动态天空shader实现

效果如下:我最开始的想法是,先提前做两张分形噪声(每张都叠了8次柏林噪声)纹理,然后通过_Time.x控制采样,根据采样结果混合颜色插值,然后效果一般,我的颜色配置的不好,感性计算也不是很到位,然后在shadertoy上看到了https://www.shadertoy.com/view/4tdSWr第一反应是amazing,然后再看看自己苟的效果真是惨不忍睹。。。关于原理,当然他也用了噪...
摘要由CSDN通过智能技术生成

{

目录

}
效果如下:
在这里插入图片描述
我最开始的想法是,先提前做两张分形噪声(每张都叠了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
    
  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值