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

[自学记录09*]Unity Shader:在Unity里渲染一个黑洞

一、前言

记得很久很久以前,在ShaderToy上看过一个黑洞的效果,当时感觉太*8帅了,于是这几天就尝试自己弄了一个。

Gargantua With HDR Bloom (shadertoy.com)

 

下面是我自己实现的黑洞

可以看到还是略逊一筹(感觉略逊百筹)。主要是吸积盘的纹理细节不够丰富,以及Bloom的调整。

本文着重介绍原理,工程实现等有空再写一篇文章。

二、引力透镜效应 

引力透镜效应,简单的说就是因为黑洞的质量太大,导致光线弯曲,以至于我们能看见黑洞后面的东西。如上图所示,如果绿色的球是某种发光物体,红色是光线原本应该发出去之后的方向,但因为黑洞的引力太大导致光线发生了弯曲,进入了人的眼睛,于是我们便看到了该物体(在眼睛的第一视角,这个绿色的球应该是一个绿色的环围着黑洞)。 、

而另一些光线就没那么幸运了,比如方向朝向黑洞中心的光线,它们收到的引力更大,无法逃逸,所以就不会被我们看见了。

传统的渲染都是默认我们的光线沿直线传播,但这里不同,光不再沿直线传播了。于是想要更精确的模拟光线的弯曲就只能使用RayMarching了,也就是光线步进

那么光线如何弯曲呢?

很简单,我们并不需要精确模拟,所以也不需要太复杂的公式,只需要简单的高中物理知识就能模拟一个大概的样子。简单地说光线原本沿直线传播,但因为黑洞的存在,我们需要在光线步进的途中时刻改变它的方向,用什么改变呢,当然是加速度了。记得吗?加速度也是矢量。

在光线步进的途中,根据万有引力定律求出当前点所受的引力就可以求出当前点的加速度大小和加速度方向,根据加速度改变下一次步进的方向和距离,最后采样就可以了。

三、SDF体渲染

黑洞中心的事件视界黑球,我们采用了SDF体渲染的方法,规定一个球心和一个半径,接着使用球的SDF,如果光线进入到了这个范围,直接返回黑色就好了。

Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more (iquilezles.org)

吸积盘同样用SDF体渲染的方法,规定一个半径,然后高度随半径衰减就可以了。

最后如果之前光线步进到吸积盘上,就返回吸积盘的颜色就好了。

为吸积盘添加纹理,实现更多细节。当然也可以采用三维纹理。当然,你要先把纹理转为极坐标,否则无法形成旋转效果。

最后加上Bloom等后处理,一个黑洞就诞生了。

参考资料 

在Unity中渲染一个黑洞 - GuyaWeiren - 博客园 (cnblogs.com)

如何渲染一个黑洞(一) - 知乎 (zhihu.com)

相关文章:

  • 零基础入门学用Arduino 第一部分(三)
  • Java算法-力扣leetcode-167. 两数之和 II - 输入有序数组
  • 元音 (音标) 和元音字母的区别
  • Linux Shell Script 编写入门
  • 【vuejs】vm.$set() 的原理解析和方法以及应用场景
  • 实战 | YOLOv10 自定义数据集训练实现车牌检测 (数据集+训练+预测 保姆级教程)
  • DevOps 安全集成:从开发到部署,全生命周期安全守护
  • [ssi-uploader插件]解决如何接收服务器返回数据+修改参数名称
  • 数据库练习题
  • oracle中如何查询特定日期?
  • 计算机网络——应用层
  • 【稳定检索/投稿优惠】2024年材料科学与能源工程国际会议(MSEE 2024)
  • json.dumps参数
  • 可视化数据科学平台在信贷领域应用系列四:决策树策略挖掘
  • 如何使用 Magisk 获取 Google Pixel 4 或 Pixel 4 XL 的 Root 权限
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 78. Subsets
  • gulp 教程
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaWeb(学习笔记二)
  • JAVA并发编程--1.基础概念
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode386. Lexicographical Numbers
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mongo索引构建
  • mysql innodb 索引使用指南
  • 基于组件的设计工作流与界面抽象
  • 近期前端发展计划
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 深度学习入门:10门免费线上课程推荐
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • Linux权限管理(week1_day5)--技术流ken
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云服务器购买完整流程
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​如何使用QGIS制作三维建筑
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ‌JavaScript 数据类型转换
  • (Java入门)学生管理系统
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (第二周)效能测试
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) Face-Resources
  • (转)Google的Objective-C编码规范
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net Stream篇(六)
  • .NET 使用 XPath 来读写 XML 文件
  • .net6 webapi log4net完整配置使用流程