引擎十一:体积感SSS,SSR
在2011年的时候,没写错,是11年前,某岛国的每年一度的graphic论坛,提出了多个贴图的次表面散射,Screen Space Subsurface Scatter
接着的2012年,同一个团队,再次提出次时代人物皮肤的研究 - XXXXX
但都不是哥这个文章展示的代码,哥没这么高端,但确实实现了一个SSS
这十年间,无数国内“牛人”提出了各种在Unity实现SSS的方法
当然,另一个SSS方法,就是最近这几年的LUT-SSS,但是就承认这是米哈游首先提出的概念有这么难么,反正哥第一次从国内看到LUT这个概念来自原神的分享,但这也不是也下内容涵盖的
(嗯,上面提出了5种sss,这个文章只是其中一种)
个人引擎还是停摆中,正参考一个不错的开源引擎:overload,采集灵感,也因为上一节的反射探针该引擎没有(个人引擎更是没有),所以还是继续用Unity做以下演示
次表面散射入门
次表面散射 - 以下简称SSS。。。。。。。。。。。。
上一节完成了PBR渲染,实现反射(基于Cubemap),
本来觉得像素风手和武器发光的部分就酱
<主要是想偷懒,lut不想研究,关键字,米哈游,原神,渲染分享>
结果这个亚索皮肤,绿色手发光的部分,看上去用SSS实现也不错
<做了一个开关,可以选择0.关闭,1.全身,3.detailsMap只映射手的部分>
一般的SSS可以用在玉石等半透明渲染
这个文章说到皮肤的 lut 实现:
谈一谈英雄联盟手游渲染2——高级篇 - 知乎
但我不确定是不是同一样的东西,某大神提出的反面再创造一个光,正反两面打光就可以做到”简单“的Mobile版本的次表面散射:
关键的关键还是在于这是打光,也就还是一个光照模型
原理
公式就不在这里推了,不画图了,无非就是一个平面,一个光线反射+折射,网上很多
<当然各种 N L V H 的定义必须掌握,个人水平不到,说不清楚,如从0开始学,还请自行百度>
掌握渲染的方法有4个
看书
日常观察
看视频
看博客
光照模型公式快速略过
(待补充)
关键代码:
inline float SubsurfaceScattering (float3 viewDir, float3 lightDir, float3 normalDir, float frontSubsurfaceDistortion, float backSubsurfaceDistortion, float frontSssIntensity)
{float3 frontLitDir = normalDir * frontSubsurfaceDistortion - lightDir;float3 backLitDir = normalDir * backSubsurfaceDistortion + lightDir;float frontSSS = saturate(dot(viewDir, -frontLitDir));float backSSS = saturate(dot(viewDir, -backLitDir));float result = saturate(frontSSS * frontSssIntensity + backSSS);return result;
}
float sss = SubsurfaceScattering(i.viewDir,i.lightDir,i.normalDir,_FrontDistortion,_BackDistortion,_FrontIntensity);
float3 sssColor = lerp(_InnerColor,_LightColor0,saturate(pow(sss, _InnerColorPower))).rgb * sss;
float3 finalColor = sssColor + col.rgb;//最终需要次表面散射,加上原颜色
后记:
这个实现有bug的,某些角度会有强白光,转动远镜头时看上去”一闪一闪的“代码和大神一模一样的,大神还用了4盏点光源,所以避免了单一平行光的这个强白光bug,这个之后再看怎么修复吧;
虽然说用了Fake的SSS方法(不完善,新方法,必然引入了bug),减少了性能消耗,但没有真机测过,要是上测试,还会有更多各种BUG;
只是符合个人状态的实现,主要想讲一些SSS理论,因为实现真的可以多种多样,各个团队需求也不一样;
有空还是要把真的SSS实现一遍,并掌握;
因为是Fake的方法,两面打光这个”设计“很厉害(大神的思路),但确实不是理工科的设计,整个渲染肯定不会很”物理化“,肯定不是纯粹的PBR;
参考:
Simple Subsurface Scatterting for Mobile – (一)通透材质的次表面散射 – WalkingFat
https://www.youtube.com/watch?v=RPkhbjmmvS0
Translucent Shader for Unity3D | James O'Hare, Game Character Artist: Blog
【Unity Shader】在URP里写Shader(三):URP简单光照Shader - 知乎
后记之后记
真的不记得当年写过上面这样的文档,现在再也写不出来了(公式推导,过两天11月前应该会补一下吧)
参考x2
有2个开源项目,不容易了,感觉现在或者一直以来TA都没点分享精神,这个有分享算不错的了。。。。。
https://www.jianshu.com/p/6a5e1f780988
引擎十一:体积感SSS,SSR相关推荐
- UE3 体积感光束教程
体积感光束教程 概述 教程内容 LightBeams 创建静态网格物体 创建材质 FalloffTexture 设置材质 修复失真问题 查看 Underneath 中显示有问题的地方 相机交叉 世界对 ...
- 2D动画如何做出3D体积感
https://cowlevel.net/article/1959026 <AngerForce>幕后故事 这篇文章是个老坑,最近有时间开始写,也是对之前项目的一个总结和记录吧. 本篇文章 ...
- Kinect结合Unity3D引擎开发体感游戏(二)
这篇接着<Kinect结合Unity3D引擎开发体感游戏(一)>,时隔3个月才出这篇,在此期间还有不少机油们,要求出续集,期间在公司那边事情太多,一直帮公司前人做的项目擦屁股,到目前为止, ...
- [Kinect]Kinect结合Unity3D引擎开发体感游戏
最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,哈哈(请允许我淫笑一下,终于可以做这方面).虽然以前没接触过体感游戏,看到的体验也是 ...
- 画色彩如何画出体积感
本文由"学美术上美术集网校"原创,图片素材来自网络,仅供学习分享 画色彩如何画出体积感?大家在练习色彩的时候是不是也曾出现过这种问题?明明画了很多,但是画面就是出不来体积和空间.这 ...
- 静物素描如何“鼓”起来,画出体积感?
静物素描怎么画?素描怎么画的鼓起来,并且画出体积感?很多小伙伴在学习美术素描的时候都会遇到各种问题今天美术加带大家了解下静物素描的画法: 首先,静物素描怎么才能画出体积感: 1. 理解形体,有形才有体 ...
- Kinect结合Unity3D引擎开发体感游戏
Kinect结合Unity3D引擎开发体感游戏 1 最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,哈哈(请允许我淫笑一下,终于可以 ...
- Kinect结合Unity3D引擎开发体感游戏(一
1 最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,哈哈(请允许我淫笑一下,终于可以做这方面).虽然以前没接触过体感游戏,看到的体验 ...
- [引擎开发] PBR材质的原理
[本文大纲] 基础概念篇 引入 光线与介质的作用 光线的传播路径 体积散射和表面光照 光线和介质外观 微平面理论 概念介绍 中间向量 能量守恒定律 微平面理论的不足 光照计算 半球积分 单位光照 反射 ...
最新文章
- 《HTML5游戏编程核心技术与实战》一2.6 其他全局属性
- PXI和CompactPCI的区别比较
- 存储器的分配与回收算法实现_垃圾内存回收算法
- ArrayList和HashSet
- 一个失败的SAP Spartacus路由修改尝试 -在CmsPageGuard的开头触发 OCC API 调用
- 实例构造器和类(引用类型)
- ntp如何确认与服务器偏差_LED电子时钟显示屏如何实现时间同步统一校时?
- 使用RTL-SDR,从打开一个车门到批量打开车门
- 从join on和where执行顺序认识T-SQL查询处理执行顺序
- python内置函数__init__及__str__的区别
- Facebook界面设计、网络操作系统和SNS大锅饭。
- 从《Java核心技术》纵览Java全貌
- linux监控内存情况同时清理内存脚本
- linux 串口驱动
- 解决手机邮箱登录学生邮箱时服务器无法连接的问题
- 使用LL库开发STM32:UART基础使用
- 熊孩子太调皮,送他Airblock无人机变身小神童
- Solidworks绘制齿轮过程备注
- nuvoton uboo2013引导流程 2 - spl
- 欧拉函数(求与n互质的数的个数)
热门文章
- SetCapture, ReleaseCapture, GetCapture
- linux centos redhat firefox vivaldi maxthon 装flash
- Jetson TX2 入门 ——刷机(jetpack3.2)
- 新视野第二册课后翻译答案
- 写一个简单的node.js项目
- book计算机翻译,book是什么意思_book在线翻译_英语_读音_用法_例句_海词词典
- 【运筹学】对偶单纯形法
- U3D对话任务插件 Dialogue System for Unity 研究(一)
- 雷军20年前作文曝光:我会当一辈子程序员
- Linux - C SHELL提示符中显示时间,设置在切换小时时不提示“DING!“