当前位置: 首页 > news >正文

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

写在前面

写在前面唉,最近筋疲力竭,课题组的东西一堆没做,才刚刚开始带着思考准备练习作品,从去年5月份开始到现在真得学了快一年了,转行学其他的真的好累,,不过还是加油!

下面是做面片云的部分,关于日月、天空渐变、大气散射(忘了记录了,后面一定补上)记录在了:【程序化天空盒】过程记录01:日月 天空渐变 大气散射

准备

前置知识

面片云这块儿我卡了挺久的了,主要太多知识漏洞了,带着问题学习的话完成了以下内容的学习: 

分析他人作品

目前我能找到的各位大佬做完并展示出来的有以下几个(仅限于我自己有刷到的,可能还有遗漏的):

首先还是之前博客里就提到的两位加上了sdf消散效果的作品:

Unity 卡通渲染 程序化天空盒 昼夜变化_哔哩哔哩_bilibili

云是单独的面片,不同通道放不同的信息,shader中获取。  

以及这位UP的Unity NPR 原神Cloud,Sky,Shader_网络游戏热门视频 (bilibili.com):

再补充一些最近看到的很棒的作品里的云: 

首先是这位程序化天空盒实现昼夜变换 - 知乎 (zhihu.com)大佬的效果,截图来自文章末尾的gif链接:

【技术美术】风格化动态天空效果_哔哩哔哩_bilibili

b站上一个好厉害的UP做的,没说怎么做的,从他云的效果来看,首先边缘光是会根据太阳的位置而产生变化,但是没有上面三位大佬那样的消散效果,所以我猜测是放了一整个云贴图上去,采样得到的。看着看着我突然发现这些云就是原神的云贴图,也是我准备用的哈哈哈。 

【unity练习1√】urp程序化skybox_哔哩哔哩_bilibili

这位UP没有说实现方法,但从他展示的shader面板可以猜测,实现方法是直接给了整个天空的cloud贴图:以及单独的a通道控制一些bloom之类效果吧(猜的

正是因为是整张贴图,没办法根据太阳光的位置去做一些散射、云消散的动态效果。

【作品】技术美术Demo海滩小屋(风格化场景渲染)_哔哩哔哩_bilibili

这位UP在评论区说了云的制作:

思路概括

既然做都做了,那一定要尝试动态消散效果!

Unity 卡通渲染 程序化天空盒 - 知乎 (zhihu.com)还是跟着这位大佬实现!试着总结一下文章给出的思路,

  •  maya或任何建模软件,建云的面片模型
  • 面片模型需要给到两套UV,准确映射到想要的云贴图上
  • fbx导入unity,给一个shader完成需要的效果

1 模型和贴图

暂时先不自己画白嫖原神的图(后面有时间想尝试Houdini程序化生成云来着,再看吧,蛮有趣的),原神的图R是shadow layer,G是Rim,B是SDF,A就是外黑内白的透明度了。

之前分析篇【Unity天空盒】卡通渲染中如何实现云的消散效果在SD里拆开看过:

blender里摆了摆面片,我是mesh球直接拆看弄的,摆的乱七八糟,映射也是没分层123层混用了,效果调出来了之后再优化一下吧!现在就先这么着:

导出fbx就行。(哦,记得法线要flip一下,面片没有厚度,不然算是外面一层才能穿上贴图。

我的贴图感觉融合了一下变得乱七八糟,尝试分了一下通道是下面这样的结果,不管了后续再优化,现在先放着:

检查一下我们的面片是否正确:

简单先用shadowlayer通道上个色,好的,是正常的,可以进行下一步了: (果然天空盒还是要有云的!!)

2 上色

2.1 基础色 阴影色

由r通道控制,给个lerp就行,初版代码:

效果就是上面那张图啦,但是我想要更加动态,先浅加一个早晨和傍晚的_BrightColor不同,后期可以根据需要,让早晨、白天、傍晚和晚上的颜色都不同,想要云颜色更有层次的话甚至可以把云分为两层来着色,目前颜色就先这样吧!主要代码如下,

暴露的参数如下, 

效果如下,就简单放个对比图了,搞gif太费劲,最后呈现效果的时候再放gif:

可以发现边缘的BrightColor是由浅肤色->橘色靠拢,根据天空的颜色适当的调整就行。

2.2 边缘光

边缘光要跟着太阳(光源方向)走,首先要lightDor和worldNormal点积解决,初版代码:

效果如下:

这太僵硬了,想要更加动态,

  • 边缘光颜色:早晨Bloom和傍晚Bloom颜色不同,由lighDir.z控制就好
  • 边缘光强度:随着太阳升起和落下强度由弱->强->弱:由lightDir.y控制就好,至于强弱变化,善用smoothstep完美解决(不理解的话可以看看我之前写的【Unity云消散】巩固step,lerp和smoothstep,事实上所有变化效果基本都是靠lerp和smoothstep完成的)

主要代码如下,

Shader面板暴露参如下,

改后傍晚的Bloom光相比起早晨的白色,改成了橘黄色,更加和谐了(maybe),后期可以再调整,现在就先这样: 

边缘光强动态就先不放了,后期放个完整的gif效果。

问题还是很大,首先,看看大佬的边缘光成果:

目前只是严格按照G通道做边缘光,G通道是这样的:

所以得到的效果一定是规规矩矩的描边。想要上面那种随意的模糊感,就要给个noise贴图扰动一下uv,再去采样_CloudTex,拿一张noisemap:

扰动之后,没那么整整齐齐的边缘了: 

【补充】用脚本控制颜色

由于想让云的颜色和天空颜色有关联,让整个天空更加完整,最好整个天空盒部分的所有颜色都趋向于脚本控制,这里赶紧搞一下~把参数全部挪到脚本里。

【补充】重做了云面片

blender里重新摆了一下。

2.3 消散效果

云贴图整整齐齐的通道给我们省去了不少麻烦!Unity 卡通渲染 程序化天空盒这位大佬在实现的时候,是完全自己做的云贴图,没有把SDF信息塞到a通道里,而是另外给的贴图。我们的云贴图就不用了,直接获取B通道的SDF信息就行。

实现起来分两步走,首先消散效果应该分为两个部分,

  • 日出日落剧烈的消散
  • 白天和晚上正常时间,云的消散

第二个比较简单,我们先来实现这个。

我们知道,片元着色器这边最终输出的颜色Alpha值是取的云贴图的a通道透明度信息:

关于SDF图,一开始理解错了SDF的意思,,SDF记录的信息并不是透明度,而是距离啊!!!以下理解才正确:

我们需要规定一个临界值_LerpSize,那么对于SDF图上的某一点,大于则留下(计入透明度),小于则舍去(不计入透明度)。这样控制才是正确的,_LerpSize越大消散越剧烈,意味着云也就越小。

现在要让这个消散效果动起来:又要建立函数了,_Time.y作为自变量,那_LerpSize就是随着_Time.y变化的因变量,再增加一个控制量,用cos。

那么随着时间变化m在变化,云的大小也会发生改变,如果不做一点过渡,云的范围会变化的很突然,如何过渡?m由0->1的路上,如果不断接近SDF,则Alpha由1到0。

SDF值由0变大接近m的时候,Alpha值是0逐渐变到1的,同理SDF值由1变小接近m的时候,Alpha值是由1逐渐变到0的。

结合上述关系,最后的代码如下,

这里写的很乱,是边做边写的,纯当一个技术记录吧,后面有时间的话再完善。

2.4 云颜色和天空联系

用脚本获取天空颜色,再用天空颜色一样的方法去给颜色变换就行,主要代码如下,

可控的颜色有这么多, 

云部分到这里就结束了,其他部分其实也做了挺多调整的,这里就记录主要的实现过程。 之后的话,还有高空旋转云、太阳光晕、夜晚的星空和银河、整体雾效没加上,这些效果很多教程都有,后面可能就不会再写这样的博客记录了,最后摆摆相机会放个整体展示效果。

相关文章:

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

写在前面 写在前面唉,最近筋疲力竭,课题组的东西一堆没做,才刚刚开始带着思考准备练习作品,从去年5月份开始到现在真得学了快一年了,转行学其他的真的好累,,不过还是加油! 下面是做…...

链表OJ(三) 反转链表合集

目录 反转链表 反转链表 II 链表中的节点每k个一组翻转 描述 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0≤n≤10000≤…...

SQLSERVER2019安装步骤过程

第一步官网下载SQLSERVER软件包 目前官网只能下载最新版本2022版本。 通过迅雷下载网址 SQL Server 2019 Enterprise (x64) - DVD (Chinese-Simplified)企业版 ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3C1F5F17AF3E…...

Java模块化概述

3 模块化 3.1 模块化概述 Java语言随着这些年的发展已经成为了一]影响深远的编程语言,无数平台,系统都采用Java语言编写。但是,伴随着发展,Java也越来越庞大,逐渐发展成为-门“臃肿” 的语言。而且,无论是运行个大型的…...

Connext DDSPersistence Service持久性服务(2)

可选数据库组件及兼容性当Persistence Service配置为PERSISTENT模式时,您可以选择将主题数据存储在文件中还是存储在外部关系数据库中。 唯一支持的外部数据库是MySQL。 当PersistenceService在PERSISTENT模式下使用时,您可以将其配置为将DDS样本存储到关系数据库中,例如MyS…...

MongoDB

MongoDB 应用场景 ​ 在传统数据库(Mysql),在数据操作的 **High performance 对数据库高并发读写的需求、Hugu Storage 对海量数据的高效率存储和访问的需求、High Scalability && High Availability 对数据库高扩展和高可用性的需…...

python 迭代器生成器

目录 一、可迭代对象 1.1 判断是否为可迭代对象 二、迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三、生成器 3.1 生成器介绍 3.2 使用yield 关键字 生成器,来实现迭代器 3.3 生成器(yield关键字)…...

Iceberg基于Spark MergeInto语法实现数据的增量写入

SPARK SQL 基本语法 示例SQL如下 MERGE INTO target_table t USING source_table s ON s.id t.id //这里是JOIN的关联条件 WHEN MATCHED AND s.opType delete THEN DELETE // WHEN条件是对当前行进行打标的匹配条件 WHEN MATCHED AND s.opType update THEN…...

JavaScript Array(数组) 对象

JavaScript 中的 Array(数组)对象是一种用来存储一系列值的容器,它可以包含任意类型的数据,包括数字、字符串、对象等等。通过使用数组对象,我们可以轻松地组织和处理数据,以及进行各种操作,比如…...

Debian如何更换apt源

中科大 deb https://mirrors.ustc.edu.cn/debian/ stretch main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-updates main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-backports main non-free contrib deb-src https://mirr…...

Connext DDSPersistence Service持久性服务

DDS持久性服务,它保存了DDS数据样本,以便即使发布应用程序已经终止,也可以稍后将其发送到加入系统的订阅应用程序。 简介Persistence Service是一个Connext DDS应用程序,它将DDS数据样本保存到临时或永久存储中,因此即使发布应用程序已经终止,也可以稍后将其交付给加入系…...

自抗扰控制ADRC之微分器TD

目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.总结 前言 工程上信号的微分是难以得到的,所以本文采用微分器实现带有噪声的信号及其微分信号提取,从而实现…...

链表学习之复制含随机指针的链表

链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 复制含随机指针的链表 该链表节点的结构如下: class ListRandomNode { public:ListRandomNode() : val(0), next(nullptr), random(nullptr…...

【人脸检测】Yolov5Face:优秀的one-stage人脸检测算法

论文题目:《YOLO5Face: Why Reinventing a Face Detector》 论文地址:https://arxiv.org/pdf/2105.12931.pdf 代码地址:https://github.com/deepcam-cn/yolov5-face 1.简介 近年来,CNN在人脸检测方面已经得到广泛的应用。但是许多…...

【Unity3d】Unity与Android之间通信

在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。 关于Unity与iOS之间通信,参考【Unity3d】Unity与iOS之间通信 Unity(c#)调用Android (一)、编写Java代码 实际上,任何已经存在的Java代码…...

Allegro如何更改DRC尺寸大小操作指导

Allegro如何更改DRC尺寸大小操作指导 在做PCB设计的时候,DRC可以辅助设计,有的时候DRC的尺寸过大会影响视觉,Allegro支持将DRC的尺寸变小或者改大 如下图,DRC尺寸过大 如何改小,具体操作如下 点击Setup选择Design Parameters...

Mongodb WT_PANIC: WiredTiger library panic

文章目录故障现象排查过程1.查看Log2.同步恢复数据故障现象 周五突然收到Mongo实例莫名奇妙挂了告警,一般都是RS复制集架构模式(5节点),查看此实例角色为SECONDAR,挂了暂时不影响线上业务,但还是需要尽快修…...

【HTML】HTML 表格总结 ★★★ ( 表格标签 | 行标签 | 单元格标签 | 表格标签属性 | 表头单元格标签 | 表格标题标签 | 合并单元格 )

文章目录一、表格标签组成 ( 表格标签 | 行标签 | 单元格标签 )二、table 表格属性 ( border 属性 | align 属性 | width 属性 | height 属性 )三、表头单元格标签四、表格标题标签五、合并单元格1、合并单元格方式2、合并单元格顺序3、合并单元格流程六、合并单元格示例1、原始…...

linux013之文件和目录的权限管理

用户、组、文件目录的关系: 简介:用户和组关联,组合文件目录关联,这样就实现了用户对文件的权限管理。首先来看一下,一个文件或目录的权限是怎么查看的,ls -l, 如下,这个信息怎么看呢…...

设计模式之状态模式

什么是状态模式 状态模式是指允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎改变了整个类。     状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状…...

XQuery 选择 和 过滤

XML实例文档 我们将在下面的例子中继续使用这个 "books.xml" 文档(和上面的章节所使用的 XML 文件相同)。 在您的浏览器中查看 "books.xml" 文件。 选择和过滤元素 正如在前面的章节所看到的,我们使用路径表达式或 FL…...

室友打了一把王者的时间,我理清楚了grep,find,管道|,xargs的区别与联系,用的时候不知道为什么要这样用

目录 问题引入 find和grep的基本区别 xargs命令 Linux命令的标准输入 vs 命令行参数 举例总结 问题引入 在自己做项目的过程中,想使用linux命令统计下一个目录下html文件的数量,在思考应该使用grep还是find去配合wc指令统计文件数量,后来…...

python 刷题时常见的函数

collections.OrderedDict 1. move_to_end() move_to_end() 函数可以将指定的键值对移动到最前面或者最后面,即最左边或最右边 。 2. popitem() popitem()可以完成元素的删除操作,有一个可选参数last(默认为True),…...

Python之列表推导式和列表排序

Python中的列表推导式,是小编比较喜欢的一种,他能大大减少你的代码量来得到你想要的结果,下面说说列表中常用的几种推导式 列表排序 Python开发中会经常用到排序操作,这里提供两种方式供大家参考,对象的sort()方法和…...

力扣(LeetCode)240. 搜索二维矩阵 II(C++)

题目描述 枚举 枚举整个矩阵&#xff0c;找到等于 target 的元素&#xff0c;则 return true &#xff0c;否则 return false。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n matrix.size(), m matrix[0]…...

golang defer

文章目录延迟函数的参数在defer语句出现时就已经确定下来了延迟函数没有入参时&#xff0c;延迟函数体内的变量会受到影响延迟函数 *可以* 修改主函数的 *具名* 返回值延迟函数 *无法* 修改主函数的 *匿名* 返回值defer会把声明的 延迟函数以及 函数的入参放到栈上&#xff0c;…...

【Java】线程的死锁和释放锁

线程死锁是线程同步的时候可能出现的一种问题 文章目录1. 线程的死锁1.1 基本介绍1.2 应用案例2. 释放锁2.1 下面的操作会释放锁2.2 下面的操作不会释放锁1. 线程的死锁 1.1 基本介绍 多个线程都占用了对方的锁资源&#xff0c;但不肯相让&#xff0c;导致了死锁&#xff0c;…...

如何使用断点续传上传大文件

概念 大文件上传的需求介绍 不管怎样简单的需求&#xff0c;在量级达到一定层次时&#xff0c;都会变得异常复杂。 文件上传简单&#xff0c;文件变大就复杂 上传大文件时&#xff0c;以下几个变量会影响我们的用户体验 服务器处理数据的能力请求超时网络波动 上传时间会变长…...

【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波

【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波 文章目录【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波1. 前言2. 符号说明3. 三种滤波3.1 全通滤波3.2 低通滤波3.2.1 平滑信号分析3.2.2 广义拉普拉斯平滑滤波器3.3 高通滤波4. 总结1. 前言 GCN&…...

python操作mysql数据库详解

使用Python操作MySQL数据库 MySQL是一种关系型数据库管理系统&#xff0c;它可以用来存储和管理大量的数据。之前介绍了大部分主流数据库&#xff0c;今天将介绍如何使用Python来操作MySQL数据库。 安装MySQL 首先&#xff0c;我们需要安装MySQL服务器&#xff0c;可以从MyS…...

为什么网站上传都上传不成功/找小网站的关键词

QString转化为char*问题零、小序一、方法零、小序 今天遇到一个很奇怪的问题&#xff0c;程序运行要生成中间结果&#xff0c;并以xml文件的形式保存起来。但是打包起来之后&#xff0c;死活就是生成不了xml文件。调试代码时发现又没有什么问题&#xff0c;中间结果可以生成。…...

网站建设与管理ppt课件百度云盘/百度竞价推广自己可以做吗

大家都有这样的经历&#xff1a;  打开VS&#xff0d;&#xff0d;〉新建应用程序&#xff08;FORM1&#xff09;&#xff0d;&#xff0d;〉往里面挪按钮&#xff0d;&#xff0d;〉双击按钮&#xff0d;&#xff0d;〉写代码  这看上去那么的自然&#xff0c;简单&#x…...

为什么要建设学校网站/建材企业网站推广方案

模拟实现C智能指针shared_ptr和weak_ptr 仿写C的shared_ptr和weak_ptr 当强智能指针shared_ptr的引用计数为0时&#xff0c;析构资源 当弱智能指针weak_ptr的引用计数为0时&#xff0c;析构引用计数对象 #include<iostream> #include<new> #include<stdio.h&g…...

给传销做网站什么罪/腾讯广告投放推广平台

前面一篇展示了一个简单工厂模式&#xff0c;这一篇主要是对比&#xff0c;工厂方法模式比简单工厂模式好在哪里&#xff1f;为什么要用这个模式&#xff1f;这个模式的精髓在哪里&#xff1f; 就以计算器为例&#xff0c;结果图如下&#xff1a; 加减乘除运算都是继承自基类运…...

wordpress手机版网页/网络营销都具有哪些功能

颜色、样式和阴影 fillStyle 设置或返回用于填充绘画的颜色、渐变或模式 strokeStyle 设置或返回用于笔触的颜色、渐变或模式 shadowColor 设置或返回用于阴影的颜色 shadowBlur 设置或返回用于阴影的模糊级别 shadowOffsetX 设置或返回阴影距形状的水平距离 shadowOffse…...

公司网站是做的谷歌的/百度关键词搜索工具

这次我想分享一下车的话题&#xff0c;非专业汽车评测人员&#xff0c;完全个人喜好。 这次想分享的主题是关于车——十代思域&#xff0c;想必在我朋友圈的朋友已经看过我晒过我的小黑思了&#xff0c;直接上图&#xff1a; 简直帅爆了有木有&#xff0c;自从去年我拿到驾照之…...