tajourney tajourney
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
  • 注册
  • 登录
首页 › 渲染 › Procedural Stylized Sky 1

Procedural Stylized Sky 1

糯米
2年前渲染阅读 790

在实现之前,先谈谈程序化天空的基本思路,大致如下:

1.sun/moon disk mask,实现一个遮罩用于绘制太阳/月亮;

2.color gradient,用于实现天空颜色的渐变/变化;

3.horizon Line,地平线效果;

这些是最基本的程序化天空需要实现的效果(Unity 默认天空球),在此基础上又有云、雾、大气散射等方面进一步去美化,还可以打造一些特殊的场景如星光、极光等。

一、Sun/Moon Disk Mask

算这个mask的基本思路就是求球面上一个圆形区域,还记得在我们是怎么计算Blinn-Phong 高光的吗?思路几乎是差不多的。

一个简单的disk mask:

float3 sunDotV = dot(sunDir,viewDir);
//a,b为可调节的参数 
float sunDisc = saturate(pow(sunDotV,a) * b);
Procedural Stylized Sky 1-tajourney
a = 1000.0f,b = 250.0f

UE的实现方案很成熟,效果也很好,实现了颜色上从里到外的渐变,这里就直接搬过来用了:

float3 sunDotV = dot(sunDir,viewDir);
//a,b为可调节的参数 
float sunRadius = sqrt(max((-sunDotV * 0.5 + 0.5) - _SunRadius * 0.01,a * 0.0001));
float sunDisc = pow(b * sunColor/sunRadius,2.0f);
Procedural Stylized Sky 1-tajourney
a=2.0f,b=0.06f

这片遮罩被计算出来后需要绘制到太阳和月亮相应的位置去,这部分在C#代码中根据光照方向来计算;

计算月亮时我们需要一个UV坐标来采样月亮的贴图,这里涉及到一个空间坐标转换为UV坐标的计算,因为是在球面上(天空就是一个球体),所以对于月亮的X和Y轴,我们可以用下面的伪代码计算然后将XY的夹角映射到UV坐标上:

X = moonUpDir;
Y = cross(moonDir,moonUpDir);
u = dot(normalize(X),posOS);
v = dot(normalize(Y),posOS);

如果看不太懂上文的几何计算,推荐看下games101中讲vector计算相关代表的几何意义的部分或者这个小姐姐的视频。

Procedural Stylized Sky 1-tajourney
Procedural Stylized Sky 1-tajourney

因为是球面所以算出来两个相同uv的区域,表现上会看到两个月亮,我们筛掉第二个即可。

再加上上文和太阳同理的mask,计算结果如图:

Procedural Stylized Sky 1-tajourney

二、Color gradient

这部分很简单,做个随太阳高度渐变的颜色插值然后调色即可。或者制作一些Ramp图来采样。

Procedural Stylized Sky 1-tajourney
Procedural Stylized Sky 1-tajourney
Procedural Stylized Sky 1-tajourney

三、Horizon Line

这部分也很简单,思路就是利用求得的mask然后和天空的颜色做一次混合。

                half dotViewUp = dot(viewDir, half3(0,1,0));
                float horizonMask = saturate(1.0 - abs(dotViewUp));
                horizonMask = pow(horizonMask, _HorizonLineExponent);
                horizonMask = saturate(horizonMask);
Procedural Stylized Sky 1-tajourney
_HorizonLineExponent = 4.0
Procedural Stylized Sky 1-tajourney
_HorizonLineExponent = 50.0

上面这段代码是danielshervheim佬提供的,不过嘛,地球毕竟是圆的(笑),我们给它做点小小的优化,让这个mask更贴合地平线实际的效果。

如图:

Procedural Stylized Sky 1-tajourney

混合后的颜色:

Procedural Stylized Sky 1-tajourney
Procedural Stylized Sky 1-tajourney
Procedural Stylized Sky 1-tajourney

引用&参考

1.https://www.eastshade.com/creating-a-dynamic-sky-in-unity/

2.https://github.com/danielshervheim/unity-stylized-sky

3.https://www.youtube.com/watch?v=kfM-yu0iQBk

赞(0)
搜索
近期文章
  • 终末地人物渲染(更新中) 2025年3月17日
  • Unity APV体素化光栅化实现 2025年2月5日
  • Unity 不同 ReflectionProbe 打断 Instancing 解决方案 2025年1月15日
  • Renderdoc 原神截帧记录 2024年8月22日
  • Houdini VAT:Vellum Cltoh笔记 2 2024年7月17日
归档
  • 2025年3月 (1)
  • 2025年2月 (1)
  • 2025年1月 (1)
  • 2024年8月 (1)
  • 2024年7月 (2)
  • 2024年1月 (1)
  • 2023年10月 (3)
  • 2023年9月 (4)
  • 2023年8月 (5)
  • 2023年7月 (4)
  • 2023年6月 (4)
  • 2023年5月 (1)
  • 2023年4月 (3)
  • 2023年3月 (11)
  • 2023年2月 (11)
  • 2023年1月 (1)
  • 2022年7月 (1)
  • 2022年6月 (2)
  • 2022年5月 (1)
  • 2022年4月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 0
Copyright © 2022-2025 tajourney. Dev by nuomi 版权所有.
鲁ICP备19015245号
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
糯米
日语学习中
68
文章
15
评论
44
喜欢