[Translate]Character Rigging God Of War | [译]战神4角色绑定

[Translate]Character Rigging God Of War | [译]战神4角色绑定
本文译自Youtube视频 Character Rigging & Cinematic Animation in God of War with Erica Pinto & Axel Grossman ,这里节选了后一部分,Axel讲的绑定部分。主要讲了本作中奎爷的一些绑定做法以及一些通用原则。 使用的基本是本世代主机上(PS4)上最先进也是最流行的技术,笔者认为基本可以代表本代能达到的最强效果了。 首先,平台从PS3变成了PS4, 面数加到了70k面,其中脸部32k。而骨骼达到了惊人的835根。(两个数据笔者都很震惊)目测有大量的骨骼给物理和装备用,另外会有一些辅助肌肉变形的骨骼。 相比上一代,采用了更真实比例,大概8头身。这样更写实,而且减少mocap修数据工作量 同高度比例对比,可以看到头和上身比例更大了 脸部布线密度增加了很...
Read More

Houdini Rigging for Game, A Brief Research | Houdini游戏绑定,入门踩坑

Houdini Rigging for Game, A Brief Research | Houdini游戏绑定,入门踩坑
1 Why? 可行吗? 当然是很少见的。笔者所见大部分游戏公司都是Max,少部分是Maya或者Motionbuilder。虽然常见吐槽Max Biped不再维护了。然而不可否认这套系统用起来还挺方便的,而且对于大部分国内动画师,Max是入行培训学习的,也足够满足大部分手游的需求了。Maya由于方便编写工具,同样也可以是建模特效软件,自带HIK,因此全套Maya也是不错的选择。Motionbuilder对于动画制作更方便,原生HIK,动捕支持也最好。 笔者还真听说了有工作室全套Houdini绑定动作的流程。有影视工作室是使用的,可在游戏中,教程都很少见。 但是还真的有,这里就有位大佬Glen Debello,写了一个系列的Houdini/Unity绑定流程, 细读他博客,神奇的是他们工作室建模也大量Houdini流程。 笔者研究了一下,确实还可以,虽然有些坑,但也...
Read More

[Translate]Reverse Engineering the rendering of The Witcher 3 III | [译]巫师3渲染逆向工程 3

[Translate]Reverse Engineering the rendering of The Witcher 3 III | [译]巫师3渲染逆向工程 3
原文参见 Reverse engineering the rendering of The Witcher 3: Index 这是第二篇,翻译原文13-15节。由于文章太长,而且废话较多,这里先做个简单的摘要吧 摘要 13介绍巫师嗅觉的效果实现,其中, 13.a-介绍如何通过stencil 操作获得蒙版 13.b-介绍了如何做描边 13.c-把所有结合起来,还加了暗角,拖影,鱼眼等效果 14-介绍了云的渲染,主要用层积云作为案例。云是用贴图做的光照计算 15-介绍了雾的计算,这里雾不是完全的体积雾,但是做了raymarching计算,受光照和高度影响 13.a "巫师嗅觉" 目前为止,本系列中解释的几乎所有效果/技术都与巫师3无关。你几乎可以在每一款现代电子游戏中找到tonemapping, 暗角或计算平均亮...

[Translate]Reverse Engineering the rendering of The Witcher 3 II | [译]巫师3渲染逆向工程 2

[Translate]Reverse Engineering the rendering of The Witcher 3 II | [译]巫师3渲染逆向工程 2
原文参见 Reverse engineering the rendering of The Witcher 3: Index 这是第二篇,翻译原文9-12节。由于文章太长,而且废话较多,这里先做个简单的摘要吧 摘要 9-中介绍GBuffer的组成,讲了一些特殊的操作,比如Best Fit Normal,比如降饱和度。另外神奇的是巫师3并没有使用PBR,毕竟是2015年的游戏。 10-中介绍了远景雨幕,其实是一个圆柱上通过噪声滚动做出的 11-介绍了闪电的做法,是一个树状的mesh渲染出的,可以做粗细远近变化,并且加了一些随机效果 12-介绍了天空的渲染,包括大气散射,太阳和星空的渲染,星空是旋转的天空盒,并做了随机闪烁 9 GBuffer 这是我系列的第9部分这部分我会揭示巫师3的gbuffer的一些细节假定你了解延迟渲染的基本...

[Translate]Reverse Engineering the rendering of The Witcher 3 I | [译]巫师3渲染逆向工程 1

[Translate]Reverse Engineering the rendering of The Witcher 3 I | [译]巫师3渲染逆向工程 1
原文参见 Reverse engineering the rendering of The Witcher 3: Index。作者目测就是波兰人。这个系列总共15篇,作者发布跨度接近两年。其实介绍的算法并不复杂,前几篇甚至感觉很基础。但是方法非常新奇。经典的逆向工程文章大多是截几个图,描述一下做法便了事,这篇直接逆向工程shader的汇编代码,非常开眼。作者甚至自己写了个工具可以直接将HLSL代码转成汇编代码。不愧是波兰蠢驴。 本文是为上篇,翻译原作的第1-8篇,其余留待下篇。 第一部分, Tonemapping 大多数当代3A游戏中,肯定有一个渲染阶段是 Tonemapping 。快速回忆一下,现实世界中有很大的亮度范围。但是我们的计算机屏幕只能显示有限的范围,比如每像素8bit,只有0-255. 这就是有了 Tonemapping 的原因。因为它允许我们把很宽的亮...

On 3D Mesh Deformation, FFD to RBF | 模型变形从FFD到RBF

On 3D Mesh Deformation, FFD to RBF | 模型变形从FFD到RBF
1. 模型变形的方法 在游戏开发中有多种常用技术可以使得一个模型(mesh)变形。比如Blendshape/Morphtarget,可以运行时对顶点插值得到中间状态的模型。比如Linear Blend Skinning,也就是最常见的骨骼蒙皮方法,可以让角色模型变形显示动画。这些技术的目的大多是为了“表现”,将预计算的结果显示出来。而本文涉及的技术,更偏向于“编辑”,也就是预计算的部分。 我们常常会用到“雕刻”的功能,比如在ZBrush中,用笔刷移动模型的局部。不过这种方法相当依赖于用户主观输入,对于程序性的输入支持并不好。而本文中讲到的技术,更加数学严谨。对程序化的建模非常友好。 本文涉及的算法基本都来自于Polygon Mesh Processing一书9.5,9.6节。读者如果想扩展阅读,直接去看这本书就好了。这本书可以说是几何处理的圣经了,作者都是...
Read More

On Mesh Cloud Rendering – Reimplement Sea of Thieves’ cloud | 模型云渲染-重现盗贼之海的云

On Mesh Cloud Rendering – Reimplement Sea of Thieves’ cloud | 模型云渲染-重现盗贼之海的云
Sea of Thieves, Tech Art and Shader Development中提到了他们的云的渲染方法,非常的trick和cheap,对云的渲染模型做了相当大的简化,然后却还有不错的效果。笔者这里尝试重现Sea of Thieves中云的做法。原作在视频中给出了很多细节原理,笔者这里给出一点补充。 本文的代码,模型,houdini预计算文件在Github可获取: Mesh-Cloud-Rendering 1. 体渲染原理 首先我们回顾一下体渲染的公式 体积渲染图解,来自RTR4 体积渲染公式,来自RTR4 体积渲染的原理可以用上面这个图解和公式表示。 这个式子有两项,p点是视线上第一个不透明物体,c是相机,v是视线 前面一项是p点到c点的透射度(Transmittance) 乘以 p点的颜色后面一项是一个视线路径的...
Read More

A Short History of Parallax Occlusion Mapping/Relief Mapping | 视差贴图,一个简短的历史

A Short History of Parallax Occlusion Mapping/Relief Mapping | 视差贴图,一个简短的历史
上图:左-法线贴图,右-视差贴图 我们常用法线贴图模拟表面的细节凹凸,不过法线贴图的一个问题是在视角很低(Gazing Angle)时会出现失真。 主要原因是法线贴图不会考虑高度的遮挡关系,因此有一些被遮挡的面会被渲染出来。解决这一问题的方法主要有两种: Tessellation, 通过细分增加面数,使得面片具有高度。Parallax Occlusion Mapping/Relief Mapping,通过在贴图空间中根据视线的方向,通过与高度图求交,获取到真实应该采样的UV坐标。 第一种方式增加了顶点和面数,对vertex/hull tess压力较大,而后一种由于需要多次采样高度图,对pixel shader压力较大。以下主要讨论POM/Relief的原理和一些修正。 1. Offset Limiting Parallax 最早是2001年...
Read More

Blocking Out City With Houdini PDG | 使用Houdini PDG生成城市白模

Blocking Out City With Houdini PDG | 使用Houdini PDG生成城市白模
Houdini PDG是17.5版本新增的一个任务管理模式,方便最终结果的分步生成。笔者当前使用的17.5.258版本,鉴于这个功能刚刚出现,目前似乎是还有些bug,其后的版本可能会修复的。 到目前为止(~2019.6,确实没看到什么houdini engine + pdg的教程,只有Kenny Lammer的一套PDG for Indie Game Dev。 笔者尝试将之前道路生成,地块生成文章整合进一个PDG,生成一个小的城市,体验一下PDG的使用。那自然是有很多坑。 个人感觉PDG的主要优势: 显式化分步操作,方便每步参数调整,避免整体生成时间过长。 多线程生成,PDG中有一个任务调度器,自动根据依赖关系给空闲CPU指派workitem。 方便程序互操作,可以调度maya/p4v等等,其实用以前可以py自己写,这次显式地增加了这个功能。 ...
Read More

[Translate] GDC19 – Procedurally Crafting Manhattan for ‘Marvel’s Spider-Man’ | [译]漫威蜘蛛侠中程序化创建曼哈顿

[Translate] GDC19 – Procedurally Crafting Manhattan for ‘Marvel’s Spider-Man’ | [译]漫威蜘蛛侠中程序化创建曼哈顿
原文为GDC2019中,Insomniac Studio的Principle Technical Artist - David Santiago带来的Talk-Procedurally Crafting Manhattan for 'Marvel's Spider-Man'. David Santiago经历相当传奇,20年的从业经验。早年就读于UTAustin和USC学习EE,之后加入NASA喷气动力实验室。28岁加入特效行业,做过lighting TD,FX TD,CG Superviser等等。 https://www.youtube.com/watch?v=4aw9uyj9MAE&t=892s Procedural生成场景方面,之前GDC已经有很多次讲了,比如 GDC2016 - Assassin’s Creed Unity: London Is N...
Read More

Hair Rendering and Modelling – An Intro | 头发渲染与建模 – 简介

Hair Rendering and Modelling – An Intro | 头发渲染与建模 – 简介
这篇中回顾了头发渲染模型的历史和一些实现细节,尝试使用Ornatrix建模头发,并在Unity中重现了UE中的Marschner模型,添加了eccentric参数。 1 渲染   1.1 Kajiya-Kay   最早研究毛发渲染的便是Kajiya和Kay,他们在1989年提出了Kajiya-Kay模型。这也成为了实时图形学的标准方法,甚至在30年后的今天,大量游戏的头发还是使用的这个模型。Jim Kajiya应该是个日裔,他在Utah大学完成的博士学位,目前还在微软研究院工作。他因为对毛发渲染做出的突出贡献,获得了1997年的奥斯卡技术贡献奖。   在游戏中使用这个模型还要追溯到GDC2004的Hair Rendering and Shading这个Talk,主讲者Thorsten Scheuermann来自AMD。PPT中比较详细地描述了...
Read More

Skin Decomposition | 蒙皮分解

Skin Decomposition | 蒙皮分解
想解决的问题是:已知一连串顶点运动的动画,能不能用骨骼动画把它表示出来? 比如,一个动补的脸部动画?一个离线模拟的布料?   以下是笔者测试的一个结果,UE4中渲染,连衣裙用了接近200根骨骼。可以看到有些帧跳了,应该是动画压缩的问题。 1. Intro 一个直觉的想法是,这不就是降维嘛。顶点运动的很多数据是相关的,比如相近两点的运动会比较接近。所以应该有办法压缩它们,就像PCA主成分分析一样,找到影响顶点最重要的维度就行了。   自然学术界已经有很多研究了。自然首先推荐ACM SIGGRAPH 2014 Course, Skinning: Real-time Shape Deformation 主持人是Dual Quaternion的提出者Kavan大神 第四部分就是讲蒙皮分解,也就是本文想解决的问题。讲义中提...

Neural Network Post Processing v1.0 Released ! | NNPP v1.0发布了!

Neural Network Post Processing v1.0 Released ! | NNPP v1.0发布了!
前文提到的Unity中神经网络后处理插件终于过审发布了! AssetStore页面:Neural Network Post Processing Github源码(不包含预训练模型):Neural Network Post Processing   一些截图:   参考资料 Post Processing with Fast Neural Style Transfer in Unity | Unity中快速神经风格迁移后处理 Train post-processing with GAN | 使用生成对抗网络训练后处理
Read More

Dabble FrankenGAN with Houdini | Houdini中测试FrankenGAN

Dabble FrankenGAN with Houdini | Houdini中测试FrankenGAN
本文尝试在Houdini中测试和实现FrankenGan的(部分)功能 1. FrankenGAN 首先介绍一下这篇文章 FrankenGAN: Guided Detail Synthesis for Building Mass-Models Using Style-Synchonized GANs 发表在刚刚结束的Siggraph Asia 2018. 基本思路是:用GAN训练神经网络,给粗糙的建筑体块模型添加模型和贴图细节。 源码在Github上有, 前端是java写的:chordatlas,显示和资源管理等任务 后端是pytorch:bikegan,完成GAN生成的任务 作者将添加细节这个操作分成了很多步,每一步都训练了一个bicycleGAN完成任务 首先会对立面和屋顶进行标注,区分语义。之后通过标注生成贴图。最后用超分辨率提高分辨率。总共9个GAN...
Read More

Tensorflow/Pytorch in Houdini | Houdini中使用Tensorflow/Pytorch

Tensorflow/Pytorch in Houdini | Houdini中使用Tensorflow/Pytorch
(首先假定读者有基本的Linux/Houdini/Python操作经验) Houdini作为最好的程序化建模软件,又正好深度学习框架大部分在Python中,那么进行一些建模/图形的深度学习任务时,怎么能少得了在Houdini?然而有几乎没有文章讲如何在Houdini中使用Tensorflow或者Pytorch,本文聊一聊这个。 笔者查到的唯一一篇文章是这个: Houdiniで機械学習 with TensorFlow 作者在Houdini里搭建了一个Minst识别程序。本文先不讲应用,主要是安装步骤,下一篇再讲应用。 首先一个问题是,Windows下行不行? 笔者感觉,想直接在Houdini里写Python,似乎不能用Windows。主要原因是Windows版本的Houdini使用的一个特殊编译的Python2.7.5版本,一些其它python版本预编译的packag...
Read More

Post Processing with Fast Neural Style Transfer in Unity | Unity中快速神经风格迁移后处理

Post Processing with Fast Neural Style Transfer in Unity | Unity中快速神经风格迁移后处理
1 NNPP with FNST 快速神经风格迁移后处理  承接上文用GAN训练后处理,其实那篇也算是一种风格迁移吧,只不过风格损失函数在NST中定义为最大均值差,在GAN中定义为一个熵,用discriminator表示。 2 Fast Neural Style Transfer 基本上是基于Perceptual Losses for Real-Time Style Transfer and Super-Resolution这篇文章,   与Gatsy最早的文章A Neural Algorithm of Artistic Style不同的是,本文提出用一个神经网络做生成器,训练时候loss函数与原来一样,区别在于更新的不是loss network的输入图片,而是生成器的权重。这样生成好的生成器就可以离线将图片生成为风格化图片 &nb...
Read More

Train post-processing with GAN | 使用生成对抗网络训练后处理

Train post-processing with GAN | 使用生成对抗网络训练后处理
1 Post-Processing To Image to Image Translation 后处理到图片翻译 这次想做的是如何用神经网络来后处理。后处理是游戏中常见的一种图像效果,核心任务也就是把原始图片通过一些图片处理的手段,转化成另一种更好看的效果,常见的比如Bloom, LUT等等。而深度学习界最近出现的一个很热的话题就是图片翻译,如何从一张图片转化成另一张图片? 其实两者都是图片到图片的任务,但也有很大不同 通用性,后处理一般是精心设计的工程方法,适用于特定的任务;但是神经网络基本可以算是通用方法了,就目前来看几乎可以做任意domain图片的转化 性能,后处理对实时性要求很高,内存占用也不能太大。而神经网络没有个几GB的显存或者TPU就别想训练了。 本文这里是希望能否让通用性的神经网络以实时性能运行起来? 下图是训练的效果 ...
Read More

Unity ECS, Swarm Animation and Markov Chain| ECS集群动画与马尔可夫链

Unity ECS, Swarm Animation and Markov Chain| ECS集群动画与马尔可夫链
交通模拟的项目,要添加大量的行人,自然想到的肯定要用Animation Instancing。其主要思路是把骨骼动画烘焙成贴图,skinning状态是per instance的,在vertex shader中读取animation texture做skinning运算。笔者这里有几点不同。 视角更远,甚至都没必要做骨骼蒙皮,直接用顶点动画即可 动画状态机没有gameplay逻辑,是一个随机过程就好 UnityAustinTechnicalPresentation提供了一个ECS的集群动画案例,虽然其代码已经编译不出来了,但是通过阅读源码可以了解其大致逻辑 启动时将骨骼动画数据烘焙成动画贴图 gameplay逻辑中更新状态ID,这部分相当于hardcode的状态机。Job里面目测没法反射或者模板,animator自然是不能用...
Read More

Construct BVH with Unity Job System | 用Unity JobSystem构造BVH

Construct BVH with Unity Job System | 用Unity JobSystem构造BVH
BVH 是一种空间存储数据结构,便于空间查询。类似的空间查找方法还有BSP,Octree等等。 BVH的构造/查询比较快,空间冗余也比较少,在实时图形学领域用的比较广泛。比如NVidia的RTX技术,就是硬件固定管线实现了BVH便于RayTracing加速。 构造BVH或其它空间查询结构对于渲染剔除,物理计算,粒子/boid/swarm系统通信等等都是很重要的,ECSPhysics这个项目是实现了BVH的,不过抄完测了一下感觉这个BVH构造的不对啊。于是找到BVH有并行算法实现,非常适合用Unity JobSystem多线程构造。于是基本参考了Thinking Parallel, Part III: Tree Construction on the GPU这篇经典文章自己在Unity中实现。 构造BVH的基本流程:1. 构造Z-Order 2. 排序 3 构造子节点 ...
Read More

Unity ECS and Traffic Simulation | UnityECS架构与交通模拟

Unity ECS and Traffic Simulation | UnityECS架构与交通模拟
尝试做交通和行人的模拟,自然就想到了Unity2018的新功能ECS+Job System,线性数据+多线程提高模拟速度,因此本文分两部分:ECS和交通模拟 以下为一个WIP的成果 该项目的实现主要有几个模块:生成RoadGraph,构造BVH,车辆模拟,行人模拟。 RoadGraph部分,为了让Job里能调用,全都是Array形式存的了,没有指针全是ID来指。构造BVH和行人模拟在笔者另外的博客中讲到了。车辆模拟有三个部分,首先构造BVH,之后每个Vehicle遍历BVH感知周边信息,最后一个更新Vehicle的位置等数据。 最早考虑的是用物理raycast来做空间查找,让vehicle感知周边信息。先是想用Pure ECS实现的,写着发现没法加物理,只能变成Hybrid ECS,实例化GameObject加上Collider,还好更新Collider的位置开销不大,主要...
Read More

Procedural Building, A Prefabricated Way | 程序式建筑生成-预制方法

Procedural Building, A Prefabricated Way | 程序式建筑生成-预制方法
虚拟环境中程序式生成建筑的建模逻辑应当在一定程度上参考现实世界中建筑的建构逻辑。虚拟环境的建模固然比现实世界轻松很多。一堵混凝土墙,虚拟环境中建一个低模分UV然后程序式生成贴图就可以了,现实世界中还要支模打钢筋灌浆。比如建造一座雅典城,可能需要几万人几十年的时间,而刺客系列可以一千人两年铺完。诚然如此,对提高建模效率的追求永无止境。这自然也需要参考现实世界的建构逻辑。 现实世界中为了减少建造成本,加快建造速度,一定会探讨快速的建造方法。装配式建筑就是这个背景下产生的。历史上大概早有这个概念,但是现代建筑史中最著名的大概就是魏森霍夫住宅(Weissenhof Estate)了,魏玛德国时期现代主义大师密斯凡德罗主持的一个建筑展,大量使用了装配式的方式建造住宅。二战后欧洲的重建中,住宅建筑大量采用了这种方式降低成本。苏联自然也是如此,这也在60年代传到中国,那个时期大量的工人宿舍住宅都采用了...
Read More

Making of a alien base with L-System | 使用L-system建模外星基地

Making of a alien base with L-System | 使用L-system建模外星基地
更多美术向的图片请戳这里,本文主要是相关的技术分享 Procedural建模中有一套比较特殊的基于规则的方法,一般都是衍生自L-system。最早是匈牙利植物学家lindenmayer提出的,L-system也就是Lindenmayer-System的简称。自然界的植被(Speedtree),建成环境(CityEngine)基本都是基于L-Systemd的。Houdini里直接有现成的节点提供。 1. L-system, Extended L-system 不过问题是这种L-System不支持与环境交互或者与自己的交互,对local constraint和global goal没有知识。 Měch在论文Visual models of plants interacting with their environment提出了Open L-System[1],用于建模与环境交互...
Read More

Real-Time Renderting 4rd Reading Notes Chap3-8 | RTR4阅读笔记 3-8章

Real-Time Renderting 4rd Reading Notes Chap3-8 | RTR4阅读笔记 3-8章
基础的就不细说了,这里主要记一些重要的点 第三章 3.1 并行架构 GPU是高吞吐的,定义为数据处理的最大速率,也是低缓冲的,没有缓存和控制逻辑。采样贴图因为资源不在缓冲,可能很慢,要几百个时钟,这期间gpu会切换到处理另一个fragment,切换是很快的。以此处理了很多fragment,第一个贴图采样终于好了,gpu会回来执行第一个fragment。 这个架构中,通过切换fragment让gpu保持繁忙,把延迟隐藏了。还用了一种SIMD的设计,让多个线程(thread)锁步(lock-step)执行同一命令,好处是能耗和晶体管数量减少了。这多个线程成为一组,NV叫warp,AMD叫wavefronts。每组可能有8-64个线程,每个线程有一个SIMD赛道 比如我们有2000个线程,每个warp32线程,所以总共63个wraps。每个wrap锁步执行,执行到某个指令比如贴图采...
Read More

Splat with 256 Texture – Review on MegaSplat | 256套贴图混合地形-MegaSplat回顾

Splat with 256 Texture – Review on MegaSplat | 256套贴图混合地形-MegaSplat回顾
最近看到MegaSplat这个插件感觉很有意思,在这里做一介绍。作者Jason Booth是有二十多年经验的程序员,现在是Disruptor Beam工作室的客户端和图形架构师,最近unity官方博客还推了行尸走肉:行军作战移动端优化经验,便是这位大神所写 MegaSplat是一套地形的shader,支持很多的feature,另外有写的很好的顶点色绘制工具,shader编译代码,以及最重要的,用顶点混合256张贴图的方法。 雪的混合,代码在DoSnow函数中,基本思路是用height和ao来生成一个snowAmount,这个snowAmount来lerp颜色法线等等 比如还有岩浆,下图是unity截图,在DoLava函数中 比如还有小溪, 在DoPuddle里,会有泡沫和水波涟漪的计算,另外还会用法线重采样原有地形贴图造成折射效果 另外还有te...
Read More

Procedural Parcel Modelling In Houdini | Houdini中程序式生成街区地块

Procedural Parcel Modelling In Houdini | Houdini中程序式生成街区地块
上图是周边式的街区地块随便拉的盒子,redshift的水印还在。。。 上文讲到了如何程序式生成街道,那么下一步就是将街区划分为地块。实际中的街区形态多种多样,又以三种最为典型。一种是地块平铺在街区中,自发形成内部道路,姑且称为平铺式。另一种是地块面向街区外侧,成环状,姑且成为周边式。第三种,整个街区并没有划分地块的产权,而是整体开发了,姑且称为独立式。 平铺式以北京就成四合院为典型,主干街道划分了街区,每个街区内部自发形成了胡同。 周边式在很多西方文艺复兴之后的城市中比较常见,得益于规范的城市规划体系。当代城市中又以巴塞罗那最为典型 至于第三种独立式,就是北京最为典型了,一个没有街道的城市。公共道路划分的街区都整体交给开发商,要么盖办公楼,要么盖居住小区,没有街道立面,都是独立街区。 第三种没什么好讲的,因为街块不用划分,但是前两种的街块划分就需要程序式生成了。 至于实现...
Read More

Real-Time Rendering 4rd Chapter 14 Reading Note | RTR4第14章笔记-体积与半透明渲染

Real-Time Rendering 4rd Chapter 14 Reading Note | RTR4第14章笔记-体积与半透明渲染
Real-Time Rendering出第四版了,新增了不少内容,这里做一些笔记,一章一章来。 有一些介质,比如水 雾等,分子比较稀疏,和光作用时效果不同于普通BRDF,会有散射(scattering)。另一些较致密的物质也有散射。其实普通的diffuse颜色也会有散射,只不过作用尺度很小,比如小于一像素。所有物质都会散射 14.1 散射理论 14.1.1 介质材质     吸收(Absorption),光子成为物体内能     向外散射(Out Scattering),光子没有按路径继续向前,而是被扩散向周边,取决于相函数     发光:物体内能太高会发光     向内散射(In Scattering):环境光被散射进入光线路径     定义了灭绝度(extinction),是吸收和向外散射之和。 所以颜色定义成散射与灭绝之比 散射少吸收多...
Read More

Procedural Street Modelling In Houdini 1 | Houdini中程序式街道生成 I

Procedural Street Modelling In Houdini 1 | Houdini中程序式街道生成 I
路网的程序式生成前人曾经提出过多种方式,比如用模板,用L-System,用代理(Agent-Based),用张量场(Tensor Field)。其中比较实用的是L系统和张量场,前者也就是CityEngine中使用的方式。[Parish and Muller, 2001]这里的L系统不是传统的字符串替换的L系统,虽然思想一致,用递归替换的方式替换衍生,但在Extended L系统中,可替换的可以是复杂的带变量的函数,而不仅仅是简单的Turtle移动了。这我们后面再说,这里主要讲张量场的实现[Chen, 2008] 基本思路是: 根据地形生成张量场,可以多个张量场叠加 根据张量场生成道路 张量定义是 它可以有两个互相垂直的本征向量,这个特性很好,因为很多路网交叉口是垂直的。 1 张量场生成 可以有多种,比如格网的,轴向的。延海岸线和河流线可以有顺应边缘的张量场,沿高度图也...
Read More

[Translate] Technical Artist Bootcamp GDC2012 | [译] TA训练营GDC2012

[Translate] Technical Artist Bootcamp GDC2012 | [译] TA训练营GDC2012
前记 GDC2012的TA训练营中几位大佬没讲太多技术方面的事情,更多的是方法论,这几天读完感觉深有体会,一些要点完全可以用在工作中,特此把一些关键性的语段翻译下来。 Introduction- Adam Pletcher Many of you might be wondering “how can I do that?” I know I can do more important things for my projects, but that‟s not my studio‟s culture. My advice is simple: Show them what a TA can do. Tech Artists have a unique view into the two major worlds of game development, and nobody is ...
Read More

Vertex Shader Animation Revisit | 顶点动画再议

Vertex Shader Animation Revisit | 顶点动画再议
1. 概述 mesh的顶点可定义属性,比较常见的自定义通道是顶点色color和uv3 uv4及以上,因为一般uv1是贴图坐标,uv2是lightmap坐标,所以不太考虑这俩。那就这些我们就已经有 3 * 4 = 12个通道了。这里面可以存的数据一般包括: 运动强度 1个频率1个通道就够了 运动相位,防止运动sync,取决于有几层相位叠加了,1个频率1个通道 位置,意义上可能是运动的目标位置,或者LOD的位置,这个一般需要比较精确还不能压缩,肯定要3个通道了 方向,意义上可以是运动方向,法线等很多,这个一般不用太精确,如果压缩的话3个通道,不压缩的话甚至pack成一个通道都可以 其它gameplay相关的参数了 数据存在顶点上可能的问题是,模型一压缩,数据就坏掉了。另外毕竟顶点上支持的数据套数比较少。因此比较高精度和大数据量的...
Read More

[Translate&Review] Creating Photorealistic Procedural Materials in Substance Designer | [译&评]SD中创建写实材质

Daniel Thiger在GDC2018 Substance Day分享了他用SD制作材质的一些经验,youtube上有分享。 大佬现在在Bungie担任Lead Environment Artist,之前在EA Dice担任Senior Environment Artist/Senior Technical Artist. 制作的时候呢,还是要以现实世界为参考的,比如用3D扫描的材质做练习就是一种很好的方法。分析它的高度和法线,从中提取component单元的形状规律。 比如想要做一个热带雨林的材质,就要分析一下组成了,里面应该有树根,泥土,石头,落叶和草 制作过程中的一些要点 分析参考图 甄别出形状的组件,比如下面说的大树根/小树根/石头/泥土/叶子等等 一层层添加形状,从大到小 关注高度图,别分心 创造组...
Read More

Terrain Cliff Problem | 地形峭壁问题

Terrain Cliff Problem | 地形峭壁问题
传统高度图地形的制作方式不可避免会遇到峭壁拉伸严重的问题,另一方面峭壁要有分层的感觉。常见的解决方法主要有两种:一种是贴面,用石头的模型摆成悬崖,但是人力成本太高;另一种是用triplanar的uv,但是贴图采样次数过多。 一些新的程序化的方式包括:stochastic triplanar(Far Cry5),拆峭壁减少triplanar的贴图采样次数;启发式贴面Heruistic Quilting(Dauntless),程序化摆贴面模型,Ghost Recon目测大概也是这么做的。 不过triplanar仍然采样次数过多;而贴面意味着drawcall过多的问题。而要达到峭壁也有层积的效果,这里提出对峭壁mesh自动展UV的方法。 1. 建模 没什么好说的,houdini terrain程序化生成一下就好了,这里选择了一种大峡谷的地貌。方法就是经典的多层terrace然后e...
Read More

Some Shader Optimization Tricks | 一些Shader优化技巧

1 精度问题 精度越低的数值类型意味着更低的寄存器数量,更快的计算,以及更低的能耗。 能耗:half < float < short < int. 注意,最大的是int! 不过需要注意的是half的取值范围,IEEE754规定binary16类型用1个符号位,5个指数位,10个有效位。所以 [crayon-5def031bd9ecb780200825/] 嗯,65536就是INF了. 以及误差需要注意。在1附近,误差是2^-10,大约0.001。在4096到8192的范围,误差是4。 写shader时可以instanceid,vertexid,threadid都用ushort(不过shaderlab没有ushort是为啥。。。),写字面量时值的后面加个h就表示half了。 2. 算术问题-乘加MAD shader一般会有一个硬件指令MAD...
Read More

[Translate] Procedural Islands of ‘Dauntless’ | [译] “无畏”中的程序化生成岛屿

[Translate] Procedural Islands of ‘Dauntless’ | [译] “无畏”中的程序化生成岛屿
来自GDC2018的一个Talk:Technical Artist Bootcamp Procedural Islands of 'Dauntless' 主讲者两位, Michael Trottier,之前在Bioware做Artist和TA; Mykola Konyk,之前在Side Effect做工程师开发Houdini Phoenix Labs是Vancouver的一个工作室 关卡和原画是怎么一个需求,浮空岛。 下面这些是程序化生成的 1. UE-Houdini Pipeline UE4导入Houdini有很多自定参数,和Biomes相关的,比如用哪些植被哪些贴图等等;这些参数直接存了一个JSON格式放进houdini里用Python解析; Houdini倒回UE4会直接生成Actor。 2. 地形体量生成 最开...
Read More

[Translate] Procedural World Generation of ‘Far Cry 5’ | [译]孤岛惊魂5中的程序化场景生成

[Translate] Procedural World Generation of ‘Far Cry 5’ | [译]孤岛惊魂5中的程序化场景生成
来自GDC2018的Talk:Procedural World Generation of 'Far Cry 5' 主讲者 Etienne Carrier,法国人,Ubisoft Montreal的TA,之前在Frima Studio担任TA. 主要展示的是FarCry引擎DUNIA2中场景编辑流程和其中Houdini制作方法. 个人比较有用的是pipeline方法和细讲的两个工具:Cliff Tool和Biomes Tool 1.工作流程 工作是以基于高度图的Terrain为基础的,在其上可以制作水域/道路/栅栏/峭壁/植被/雾气/世界地图 美术的一般工作流程是: 1. 生成Terrain地形 2. 一键生成峭壁 3. 画一下水的范围然后生成 4. 刷biomes,biomes是一套贴图/植被的组合 5. 之后放路放电线杆放房子 6. 拜访资源,刷b...
Read More

Memo of some HScript and VEX Variables| 一些HSript Expression和VEX变量备忘整理

Memo of some HScript and VEX Variables| 一些HSript Expression和VEX变量备忘整理
Houdini中代码主要有三种语言:Python,HSript,VEX。HScript有点像MEL,Maya里的老祖宗语言;Python是最近支持的,可能有点像PyMel这种。这三种语言的复杂关系可以看这个科普帖子 Python和HScript都可以写Expression的,笔者见到的还是用HSript比较多,Expression可以写在所有node的channel里,感觉主要是起控制作用的。VEX是写在wrangler这种node里的,语法类似C++,在Obj这个context里主要是用来建模用的。其它Contex里好像还有很多用处,笔者是不太懂了。目前主要用的是Houdini的建模功能。。。。 看教程的时候,经常见到写Expression时候信手拈来一堆HScript变量,但是又很难查到定义,用起来的时候又经常记不住,在这里总结一下和Vex里类似的变量吧。 ...
Read More

Memo of Analysing Game Rendering 2 | 分析游戏渲染的姿势备忘之二

Memo of Analysing Game Rendering 2 | 分析游戏渲染的姿势备忘之二
上回文说到的主要是手游,这次说说别的。在PC平台上,IntelGPA的缺点是: 只能用核显,性能比较差 只支持DX VertexBuffer抓不全,导出模型比较难 PC上另一个重要工具就是NSight了,NVidia自家出的显卡debugger。不仅能用于CUDA科学计算的debug,还有FrameDebugger能分析渲染。集成在VisualStudio里,而且OpenGL和DirectX都支持,而且VertexBuffer直接能抓出来很全的数据。最重要的是,是用N卡渲的,性能不成问题了。 这次用NSight看中的PC上的游戏,是塞尔达旷野之息(Zelda:BotW,用WII模拟器)和STEAM的游戏。 NSight使用方法 新建一个VisualStudio空工程 工程上右键-Nsight User Property,Launch External Progr...
Read More

Some Methods to Occlusion Culling | 遮挡剔除的几种方式

目前主流的OC有这几种方式:预计算的原始的PVS,主要CPU端的umbra的dPVS。和主要GPU端的GPU-Driven。像RealTimeRendering书中中提到的Hierarchical Z-Buffering和HOM,大多比较底层,集成在其它实现方案里,比如dPVS用了HOM的技术。另外还有一些硬件层面的EarlyZ,比如PoverVR的Hidden Surface Removal这里就不讨论了。 1. 简单PVS 直接离线计算每个位置上的可见物体集。位置用cell描述,几米一个。给每个物体一个ID,存一个bitarray记录可见性,内存占用也很小。实时运行很快,只是离线计算比较慢,笔者经验1000m*1000m在几个小时左右。它在手游上很容易实现。有几个要点:1. Cell划分,最简单的就是平均切分了,更细致的考虑还有按密度自适应cell大小(比如四叉树),高度上可能有多...
Read More

Memo of Analysing Game Rendering 1 | 分析游戏渲染的姿势备忘之一

Memo of Analysing Game Rendering 1 | 分析游戏渲染的姿势备忘之一
目前(2018)手机的GPU基本只有三家了:Mali, Qualcomm Snapdragon, PoverVR. 其中Mali主要是华为在用,Snapdragon是其它大部分的安卓机在用,比如小米/三星/OV/一加. PowerVR是苹果专用的,集成在果家的A系列CPU里了。这之中,ios的Xcode只能分析自己build的程序,没法逆向工程其他游戏。而Mali和Snapdragon分别有自己的GPU Profiler支持。 Tegra的GPU可以用Tegra Graphic Debugger分析,不过NV的这个GPU现在手机上用的不多了,笔者唯一知道的是13年的小米3. Tegra据说比较好的一点是可以拿到vertex buffer,然后就可以自己写代码解析模型信息。由于顶点数据结构复杂,profiler并不知道每个stride的哪些部分是位置,哪些是uv之类,因此profiler看...
Read More

Mesh Vertex Animation In Unity | Unity中顶点动画

Mesh Vertex Animation In Unity | Unity中顶点动画
最后的效果,左为顶点shader,右为蒙皮 10根骨骼 有些远景动画、小动画,用骨骼蒙皮来做太费了。一个好的办法是用顶点动画。比如在顽皮狗GDC的分享Technical Art Techniques of Naughty Dog:Vertex Shaders and Beyond用这种方法模拟鸟的人群的运动。 Houdini集成了Game Development Tools里可以做到导出顶点动画,直接看这篇教程就好。Houdini官方做了Game Development Toolset的工具包,直接可以用的,在Github上有。包含了Houdini中的一些节点和Unity的shader。 制作流程 安装 首先要安装Houdini Game Development Toolset,看上面github即可不必多说。 导入 fbx导入houdini,在out窗口内找到Ver...
Read More

[Translate] Foliage Optimization in Unity | [译] Unity中植被渲染优化

[Translate] Foliage Optimization in Unity | [译] Unity中植被渲染优化
原文在此,下为译文 在我上篇博客——创建森林的美术建议中,我指出了创建3D森林的一些要点。那里我主要强调的是美术建议,资源应该有什么、如何布置。森林一个重要的事情是密度,随之而来的问题是性能优化。 问题 有很多方式优化树林,但如何来创建资源,通用的不多。然而,有一件事是通用的,那就是关注drawcall。 虽然面数也很重要,但不那么复杂。只需要设定一个合理的目标。下面是我们的资源的一些面数。如果你需要很多的透明插片来达到想要的效果,你需要提高贴图中叶子的占用率。 最后,是OverDraw。如果你有很多重叠的透明物体。我不太会关注这个,因为其实我也不知道怎么办。我会修改树的轮廓减少重叠。但是美术效果更加重要。但让树林真实还得考虑overdraw太难了。我只关注了面数和drawcall。 计划 如果你希望发现unity的一些隐藏参数,可以来...
Read More

Houdini Terrain 2 | Houdini地形生成之二

Houdini Terrain 2 | Houdini地形生成之二
之前一篇Houdini地形生成尝试在Houdini 15.5中生成地形。没想到Houdini 16的版本就出了地形的功能。在SOP里,菜单叫HeightField。其实原理看上去是一个二维体素,heightfield wrangler其实跟volume wrangler一样一样的。 其实之前15.5就能做地形,只不过erode比较麻烦。16.0版本里集成了Heightfield Erode的节点,目测是OpenCL写的。GPU跑比之前自己写的VEX版本快一些。 Houdini官方有一个Terrain的教程 作者Alex Dracott是似乎是Sony的Artist。这个教程用UE4配合Houdini做了一个非洲稀树草原的地形,感觉完全可以代替World Machine嘛! 1 Houdini制作地形的优点 1. drawmask节点直接可以手绘蒙版。但在WM里用layout...
Read More

Realtime Grass Rendering on Mobile Platform| 移动端实时草地渲染

Realtime Grass Rendering on Mobile Platform| 移动端实时草地渲染
有很多很多不同的技术了。 题图是一个人的demo,Real-Time Grass Rendering,跟我没啥关系 要渲草的话,OpenGL ES2.0/DX9及以下就不用考虑了。至少要支持GPU Instancing,有Compute Shader更好。 理想平台:OpenGL ES3.1/Metal/Vulkan 1. Rendering Countless Blades of Waving Grass GPU Gem上的文章,链接在这里 主要思路: 1. 贴图 一张alpha-test的贴图 2. 插片 3. 风 为了避免变形扭曲和减少drawcall,定点要记录每个草的中心位置,根据中心位置做随机偏移 主要意义在于提出了草插片,不过其他都没啥考虑。   2. Rendering Grass in Real Ti...
Read More

Mixed Lighting Lightmap & Shader in Unity | Unity中混合光照Lightmap研究

Mixed Lighting Lightmap & Shader in Unity | Unity中混合光照Lightmap研究
Unity中有三种灯光模式:Realtime Lighting, Mixed Lighting, Baked Lighting. 第一种是实时计算的,第二种是实时与烘焙混合的,第三种所有灯光都是烘焙的。 在Mixed Lighting中处理Lightmap的同时还要考虑实时灯光,Shader上会复杂一点。并且Mixed Lighting中有三种模式:ShadowMask, Bake Indirect和Subtractive,三种模式的Lightmap定义不一样,这就很尴尬了。那么首先介绍一下这几种模式: Bake Indirect 烘焙直接阴影,只烘焙间接光,在Shadow Distance(Project Settings>Quality>Shadows里面设置)之内的阴影都是实时计算的(Shadow Map)。 所谓间接光,就是物体之间互相反射的那些光,也包含A...
Read More

Maya Python Workflow | Maya Python工作流程

Maya Python Workflow | Maya Python工作流程
半年没有更新了,我一切都好。这半年经历的事情很多:参加CAADRIA、拒掉留学Offer、做完毕设研究生毕业、搬到杭州、加入猪厂。一个新阶段的开始。 这一篇主要总结一下使用Python开发Maya插件的准备工作和基本工作流程。 1. 环境部署 开发之前需要进行一些准备工作。 1. devkit 就是Developer Kit啦。 有了它就可以用C++写maya插件了。不过这不是我们关心的,我们想用python快速开发插件。devkit里提供了一些示例,当然最重要的是自动补全的功能。这个下面配置编辑器时会用到。 2. Sublime Text部署 笔者用sublime text写代码的,毕竟原生的控制窗口太难用了。部署sublime环境的第一件事是装Package Control。有了它就可以方便快捷地安装sublime的插件了。 在这里可以找到Package Contr...
Read More

Some Random Thoughts on Marlin | Marlin随想

Some Random Thoughts on Marlin | Marlin随想
为了毕设做打印机研究3D打印机啊。 1 Marlin Marlin是一种3D打印机的固件(Firmware)。所谓固件,就是刷进开发板(或者单片机,比如Arduino)的程序。我们用Arduino的时候,上传的程序就是固件。3D打印机有很多类型的,比如Makerbot,Ultimaker,ZCorp等等。其中最简便最普及的是Reprap的。Reprap是一类打印机,其中很多不同型号,其中比较有名的像Mendel, Prusa, Huxley。而它们共同的特点是由Reprap社区开发的,大多是开源的,自复制的。因此非常便于DIY和改装。 固件也是有很多种的,比较有名的就是Grbl,Sprinter,Teacup等等。Marlin是基于Grbl和Sprinter开发的,这两年非常的活跃。支持的板子和LCD型号极为丰富。参考一下Github上几种固件的活跃度。所以选择了这个固件...
Read More

PyQt+QtDesigner App Dev Workflow | PyQt + QtDesigner 小程序制作流程

PyQt+QtDesigner App Dev Workflow | PyQt + QtDesigner 小程序制作流程
0. 起因 毕设要做一个发送GCode的小程序,需要GUI。所以接触了一下PyQt. 1. 安装 需要Qt,在Qt官网下载即可。想下载的话要回答一些问题,我选的in-house deployment,接受LGPL v3之类。然后选择一个完整版的Qt,800Mb左右。 Python环境,我就用的Anaconda,一个集成的Python环境。要不然原生Python装依赖库比较麻烦。我选择的Python2.7,主要因为很多行业软件还没升到3,比如Rhino, Houdini. PyQt5,用Anaconda装比较方便。用pip的话似乎只有py3.5版本的? pyinstaller,发布为exe时用。直接 [crayon-5def031bdae6e426103579/] 2. 界面制作 制作GUI需要Qt Designer。类比一下,Qt Creato...
Read More

Houdini Terrain | Houdini 地形生成

Houdini Terrain | Houdini 地形生成
讲道理呢,World Machine的地形用Houdini都是可以做出来的。不过还是有些局限,尝试了一下。 1. 噪声地形 主要就是两类:Voronoi 和 Perlin Voronoi Voronoi很简单,VOP里面直接就有Voronoi Noise 出来和World Machine的很像。 Perlin Perlin可以用Vop 里面的aanoise,不过这里选择了用wrangler写VEX。思路就是很多不同频率的aanoise叠加起来,傅里叶变换嘛。 代码是: [crayon-5def031bdb29b662503277/] 频率每次乘lacunarity,强度每次乘roughness。 出来效果 perlin 和 voronoi叠加就基本可以得到目标地形的原型了。 2. 变形 World Machine里...
Read More

Special Particle Effects in Houdini Vex | 一些特殊粒子系统 in Houdini VEX

Special Particle Effects in Houdini Vex | 一些特殊粒子系统 in Houdini VEX
感受了一下Houdini VEX,语法比较像C。但如果要说相似度的话,我觉得它更像Shading Language比如GLSL。可以逐个操作Point, Vertex, Primitive。像极了GLSL的Vertex Shader/Fragment Shader。区别在于Point Vertex Primitive是Houdini内置的数据结构,而且VEX不是GPU片段。但是思路和写Shader无比相似。由于操作数据直接就是几何信息,而不是渲染使用,所以VEX也可以用来建模,效率很高。当然VEX也可以用来写shader,它有很多Context,Surface就是Surface Shader,建模用的SOP contex,还有粒子POP Context等等。 尤其是粒子系统,写VEX会比OpenGL,RhinoPython之类方便快捷的多。 和OpenGL对比: + 自带at...
Read More

Introduction to Cracking .Net Assembly | 一些.NET程序集的破解初探

Introduction to Cracking .Net Assembly | 一些.NET程序集的破解初探
0. 起因 当然就是要破解Grasshopper插件。但是其实起源于笔者破解另一个C#程序。 1. .NET .NET是微软开发的一套技术平台,在其上可以方便快捷地搭建各种应用。.NET应用是基于.NET Framework的,后者是一个类库,一个程序的基础框架,包含很多系统和常用的API。.NET框架主要适合于Windows应用的开发,毕竟是自家的操作系统。当然最近好像也开始支持Linux了,这样基于.NET编写的应用就可以跑在linux。 因为.NET框架在Windows系统上非常通用,所以很多软件都是基于.NET开发的,比如建筑学生最常用的Rhinoceros,以及同样的Rhino插件Grasshopper及GH插件。 .NET框架的一个特点是不限定编程语言,使用C#, VB.NET以及F#均可以开发,这些高级语言具有互操作性,也就是不管用什么语言都可以被编译成一套...

Some Notes on Physical Based Shading | 有关基于物理着色的资料

Some Notes on Physical Based Shading | 有关基于物理着色的资料
弱渣从头开始学图形学,大作业基本功能都做完了准备搞事情,想写个基于物理的着色器。只好从头开始学习BRDF。 PBS这套流程最近几年非常流行,主要是为了帮助美术减少材质的错误的。我就是主要读了几篇论文,看了看别人的代码。 Torrance-Sparrow 看的很多PRS的文献都会提到Torrance-Sparrow模型,1967年的一篇文章Theory for Off-Specular Reflection From Roughened Surfaces. 讲的是他们提出了一个粗糙表面的模型来解释材料受到光照时的表现。文中提出。如最上面那张图,Diffuse项之和入射角度有关,Specular实际上来自于物体表面有一定比率的微表面发现是入射与出射光的平分线(后来从Blinn-Phong中借鉴了下改叫H)。 当然论文了计算了一大堆,最后得到这样一个公式: 这个公式...
Read More