这篇文章主要是记录看到skinner源码后的一些分析感想,记下skinner整体框架,制作流程和知识点笔记。因考虑以后会用到相关技术。也知道好记性不如烂笔头重要,遂有目的的写起这篇文章。以后如果要用上,可以快速记忆回到分析逻辑中。老实说,做出这种惊艳效果真的是令人佩服不已。能读懂源码必备shader,图形学方面的知识。整个项目用到的技术点用到的高深算法不多,更多的是细节技术的整体整合,CPU搞逻辑,GPU搞运算。两个分得清清楚楚。
来一个惊艳图,老实说keijiro几百个惊艳效果,把unity档次拉升了不少,至少很多人看了都觉得,原来Unity居然还可以这么玩。在视觉艺术效果这一块,keijiro敢说第二,没人敢说第一。当然最底层的技术都是图形学,算法的事了,Unity更像是一个好平台,应该庆幸keijiro没选ue4。
源码地址:https://github.com/keijiro/Skinner
整个项目中,为了高效率高性能,CPU处理不费计算的业务逻辑,大量的计算都是在GPU来处理,如果是CPU来操作,真心玩不来,Skinner的主要思想就是这样。如果真想细看源码,建议先别看我的解析,因为肯定一头雾水,建议看个两三天后,再回头看我的解析,应该对你是有帮助的。 此文也只是梳理个骨架和基本要点,建议先看debug特效效果,对理解是很有帮助的。至今有些技术点看不懂,才疏学浅,哎,惭愧。望有大神能够梳理整套源码,学习学习。
并非专业解析,一个普通程序员,略知图形学,渲染管线,shader方面的一些技术。前方的路依然漫长,唯有虚心向前。
整体框架:
SkinnerSource.cs
主要是把世界空间中 几何点的数据转化到RendTexture,RenderTexture在以下的文中均用RT来代替,比如一个像素点中RGBA,用RGB分量,来存储Vector3中的xyz。其中用了两张RT来交替存储几何点的位置信息,因不是很明白为何用两张来存储,这个就先放一放。
还用到了置换贴图camera.RenderWithShader ,camera.SetTargetBuffers 这个两个API来把位置信息给映射到RT上,这里他单独创建了一个只为位置映射到贴图服务的相机_camera。
其中置换Shader的源码为
SkinnerTrail.cs
主要作用就是把SkinnerSource 制作好的位置信息放置到另外的RT中,在Shdar里,是不负责制作网格的,所以你在画面中看到的网格,都是提前生成好的,放在SkinnerTrail 里 这个类里面的RT Height属性是有高度的,skinnerSource制作好的RT Height高度固定为1,所以,就很明确了,在lataupdate里每帧从skinnerSource的RT那里拿取信息填充到SkinnerTrail的RT中,这么做的作用是直把位置信息生成在一个时间场的维度里,意思就是说这个类里,RT的每一行存储的是一帧的位置信息。比如有32行,拿就是存储了32帧的位置信息。把位置信息处理好后就走到了渲染流程了。
创建该类的RT和初始化一些参数
分别把速度,位置,法线的信息填充到对应的RT中,算法是放在shader里算
计算的Shader
接着真正走到了渲染这一步了,把之前制作好的含有位置,速度,法线的RT传送到shader里,再次进行计算,渲染出物体,颜色,等其他参数
渲染的Shader
大致是这样子整体框架