Crowded Plaza, a game with Bevy/Rust| 拥挤广场:使用Bevy/Rust开发小游戏

为什么是Bevy和Rust? 当然因为Rust有点火,笔者想试试玩玩,学习学习Rust。 目前看上去Rust应用比较多的领域是数据库/区块链/跨端部署应用,也就是传统C++的领域,追求性能和多平台,但是Rust多出现在较新的应用场景,比如区块链就是个典型的例子。 游戏引擎主要还都是C++的,并且需要跨端部署,这个领域也是Rust有可能进入的。Rust上游戏引擎目前(2022-7)最有名的就是Bevy了,一个原生ECS架构的游戏引擎,听着还挺新奇的。众所周知,目前流行的游戏引擎如UE,Unity大多是OOP,并没有从一开始就使用Data-Oriented和ECS的方式,有一些历史包袱,但也都新加了ECS模式。入门Rust就会发现,Rust语言比较推崇组合而不是继承,ECS也就顺理成章。 当然现在用Rust写游戏的还不多,笔者比较喜欢的Embark Studio就是其中之...
Read More

Headless Substance | 无头Substance材质生成

Headless主要讲的是无人工无GUI参与的软件,中文翻译成无头总感觉怪怪的,暂且这样吧。 Substance套件作为当下游戏美术资产制作中,贴图制作这一环节的主流工具是相当成功的。其优点 其一是方便美术在3D视角下绘制贴图,其二是可以利用程序纹理加快贴图制作效率。 本文探讨的是Headless Substance,即无人工无GUI参与的Substance贴图生成流程。当然这在大多数情况下并无必要,主流的生产管线中给美术做好程序纹理和SP智能材质模板就行了,然而这种方式仍然是人力密集的,并不方便scale up。本文希望探讨的技术可能对于以下应用场景有所帮助 自动化批量处理贴图,比如转通道,转mask给模型加贴图比如高模(美术制作或扫描)自动生成可用的游戏资产程序化资产直接生成可用的游戏资产传统管线中部分特殊mask的自动化生成甚至UGC的资产生成? ...
Read More

Rig a Hand | 绑定一只手

怎么绑定一个手?也并不是那么简单,这里笔者简单记录下自己在Maya中的实验的关键步骤和注意,以及整理了一些学术论文。 1. Topology | 模型 作为游戏内模型,首先要考虑的是面数。如何在低面数的条件下,保证变形效果?这就需要巧妙的布线。一般原则是: 对会扭转和弯曲的关节处给环状布线给可能需要变形的突起和皱褶处多一些圈数。 这样的主要考虑是,避免变形后,模型的轮廓出现明显的转折。 图片来源:Modelling a Human Hand https://topologyguides.com/human-hand 比如上图给了一个不错的布线走势示意图。美中不足是手背上这样布线有点浮夸。 笔者按照上图参考,建了一个低模。 图片来源:笔者自绘 2 Direct Rig | 直接绑定 手就是五个手指,骨骼没什么复杂的。 ...
Read More

Economize Your Texture | 如何节约贴图

做游戏时,我们的硬件资源不是无限的,而其中内存(显存)又是很容易紧缺的一个环节,而其中贴图又占了大头。如何节约贴图?是我们做资源管理时不可忽视的问题。 本文做一个个人的总结,主要在美术/TA制作的实践方面,也会简单扩展到压缩算法。而这些不同的方法,归根结底其思想也是共通的,甚至与别的领域,如音视频压缩,神经网络压缩有异曲同工之妙。以下分为几种重要思想描述: 重用量化特征降维频域分解 1. Reuse | 重用 Tiling | 连续贴图 当然这没什么好说的,一般分成 四方连续-即贴图四个方向都可以连续二方连续-即贴图在左右或者上下方向可以连续 用连续贴图可以让贴图在一或两个方向上重复,减少总贴图大小。四方贴图一般就是基础的地面墙面上会用。而二方连续贴图用处用处更广,可以单独做一张Atlas,一般成为Trim Sheet。也可以和非连续的部分放在一...
Read More

Realtime Physical Based Rendering, a Personal Outline | 实时基于物理的渲染-个人的大纲

什么是Physical Based Rendering? PBR到底包含什么? 一般离线渲染中PBR包含内容很多,从材质到灯光到曝光等。但是,在很多游戏PBR教程中从microfacet model,BRDF, 材质属性,辐照度开始讲,有时候也只讲材质。个人感觉对于新手来说很容易一下就掉入细节中,感到挫败和丧失兴趣。同时比较肤浅,没有考虑到PBR的各个方面。 由于实时计算机图形学有着硬件性能的限制,导致对于PBR不像离线有蒙特卡罗路径积分等统一的方法,而是对于各种特殊问题都有很具体的特殊解法,也更造成容易掉入细节中。 笔者这里尝试从光路开始分析,不用数学公式。从直观角度描述基本概念,讲解PBR有什么问题,在实时领域是怎么解决的?从而让读者快速得到一个宏观图景。 1. 渲染方程 尊重一下历史,我们从最著名的Kajiya渲染方程讲起。一个非常暴力的简化:渲染方...
Read More

[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游戏绑定,入门踩坑

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

原文参见 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, 暗角或计算平均亮...
Read More

[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的一些细节假定你了解延迟渲染的基本...
Read More

[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 的原因。因为它允许我们把很宽的亮...
Read More

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 | 模型云渲染-重现盗贼之海的云

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

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’ | [译]漫威蜘蛛侠中程序化创建曼哈顿

原文为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 Not Built In ...
Read More

Skin Decomposition | 蒙皮分解

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

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

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

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 构造子节点 4 构造内...
Read More

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的位置开销不大,主要是RayC...
Read More

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

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 | 分析游戏渲染的姿势备忘之一

目前(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中顶点动画

最后的效果,左为顶点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中植被渲染优化

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

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| 移动端实时草地渲染

有很多很多不同的技术了。 题图是一个人的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 Time with Dynamic Lighting 2006年SIGGR...
Read More

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)。所谓间接光,就是物体之间互相反射的那些光,也包含AO。Unity...
Read More

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 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

[Translation] Assassin’s Creed Unity: London is not built in one day | [译]刺客信条枭雄:伦敦不是一天建成的

上周虚拟主机运营商更换服务器,DNS解析挂掉了,网站就一直不能访问了。昨天把DNS解析搞到DNSPod,现在目测是局地能访问,笔者正挂着VPN写博客。 [su_spacer size="70"] 今天整理的是GDC2016的一个Presentation,题目是“Assassin's Creed Syndicate London' Wasn't Built in a Day”,来自育碧魁北克工室。主讲者Damien Bastian(下称老D)是魁北克工作室的Team Lead Tools工具主管,做工具链的程序员。稍微八卦一下,老D是法国人,在法国Epitech拿的CS本硕,一个著名的私立软件学院。之后在Eugen Systems当Tool Developer。EugenSystem 是一个小工作室,好像只有50名员工,制作了战争游戏(Wargame)和兵者诡道(R.U.S.E)...
Read More

[Translation]Model Cities in Independent Day 2 | [译]独立日2中的城市创建

主要是两个视频讲座:Model Cities with the Tech Behind Independence Day: Resurgence和Independence Day Resurgence – CityEngine Workflow with Matthias Buehler,这两个视频基本一样。后一个比前一个多补充了些live demo,就是CityEngine官方示例文件的展示。 主讲人Matthias Buehler(下称老M)有必要介绍下,建筑学的背景,之后转行做特效和场景。2007年从ETH MSc Arch毕业,目测是一个Post-Professional的研究型硕士。在建筑和景观事务所做设计和渲染干了两年,跳到了ESRI做产品。那时候ESRI应该刚收购CityEngine,猜测这位兄台应该也就是用CityEngine做些什么DEMO。15年跳到了温哥华Sca...
Read More

Transfer Lightmaps in Unity | Unity中转移光照贴图

unity中光照贴图(lightmapping)的存储方式比较特殊,烘焙好的光照贴图存储在场景中,而参与烘焙的物体本身不记录光照贴图,只记录一组uv数据对应光照贴图。在显示的时候,shader通过这组uv坐标访问物体的光照贴图信息,再显示出来。 并且这些光照贴图没法用手动编辑,只能写脚本编辑。 而相对应的如果不在unity中烘焙,而在maya中烘焙,就是一张lightmapping放在shader的自发光贴图里面了。 所以问题在于,在unity中一个场景里烘焙的物体很难带着光照贴图放到另一个场景里。如果我们非要这么干,就得给被烘焙的Prefab加个脚本,记录光照贴图,在加入其它场景中重新加载光照贴图。 1. 光照贴图访问 首先是要访问一下Prefab里面所有子物体,从根节点遍历一下这个树就可以了,非常简单就不提了。 烘焙过的物体会有一个光照贴图的uv信息,以及所使用的...
Read More

Transformation in ShaderLab | ShaderLab中的空间变换

写Shader经常会碰到一堆得空间变换,而又经常想不起来变换矩阵的名字,因此整理一下。 1 物体空间(Object Space), 顶点着色器接收的语义项比如POSITION, NORMAL, TANGENT都是在这个空间下 2 世界空间(World Space) 3 观察空间(View Space),以摄像机为原点 4 裁剪空间(Clip Space),裁剪空间,最常用的UNITY_MATRIX_MVP就是转换到这个空间 5 切线空间(Tangent Space),用了法线贴图就会涉及这个空间 关系到空间的转换,所以有5C2=10类。 再加上物体和世界空间中都有可能访问两种固定的类型,比如灯光,视线。 1. 物体空间-世界空间(1-2) 以前叫_Object2World,新版本改叫unity_WorldToObject了,其逆变换为unity_ObjectToWo...
Read More

[Translation]TechArt Culture in Uncharted4 | [译]“神秘海域4”中的技美文化

原视频是GDC2016上的演讲Technical Art Culture of 'Uncharted 4' "神秘海域4"(Uncharted 4)是顽皮狗(Naughty Dog)的新作,在今年GDC和SIGGRAPH都有很多展示。 主讲者Andrew Maximov(下称老莫)是顽皮狗的Lead Techinical Artist,似乎是俄罗斯(或者白俄罗斯人?)职业生涯从2008年开始于一个塞浦路斯游戏公司Wargaming.net,2012年跳到蒙特利尔Gameloft,2014年来到顽皮狗。 整个演讲分成七个小节。 1. Game Developers vs Specialists. 贵司的组织架构比较扁平和独立,员工都有自己负责的一部分内容。所以比如负责材质的找负责灯光的不需要经过上级领导。更多的是员工是自己那部分负责内容的Producer,所以贵司的员工更像...
Read More

Terrain Making in World Machine | World Machine地形制作

研究了一下WorldMachine生成地形 峡谷 丘陵 雪山说起来地形制作也有了一点经验,下面总结总结。 雪山 雪山,来自CryTek有关雪山的资源是比较多的,在ArtStation上就有很多人做过雪山,比如K. Teper的,M. Perchun的,I Shinsoj的. 视频教程也有不少,比如P Gaur,I Shinsoj的。 其中非常有启发的I Shinsoj那个教程。虽然WM有一个Snow的节点,但Shinsoj大神做雪山完全没有用那个节点。。。。。S的思路主要有如下几点: 1. 同一个基础模型做两个Erosion,使用Max方式来混合,前一个Erosion使用高Rock Hardness,模拟山体岩石,后一个高Sediment Carry Out,模拟冲刷走的积雪。二者混合。 2. 对Perlin Noise可以Select Height或Sel...
Read More

[Translation]Basic Theory of Physically-Based Rendering | [译]基于物理渲染的基本理论

原文是Jeff Russell所写的Basic Theory of Physically-Based Rendering 广义上的基于物理渲染(PBR)是最近在实时渲染领域激动人心的潮流。这个术语的广泛传播常常让人误解它的准确定义。简短的定义是“很多事”和“看情况”,当然这不令人满意。所以我决定自己些功夫解释PBR到底代表什么,以及它和传统渲染方法有哪些区别。这篇文档的主要对象是非工程师(主要是美术),而且不会展示任何的数学或者代码。 基于物理着色系统与之前方法的主要区别在于对光线和表面行为更细致的推理。这种着色方法已经足够先进,可以抛弃以前的近似方法,抛弃以前制作艺术的方法了。这意味着工程师和美术人员应当理解这些改变的动机。 我们将会从一些基本概念开始,它们已经有了很好的定义。之后我们会着重于新的部分。但如果你已经忍受过我的文章就会发现它们非常值得阅读。你也许会对看Jo...
Read More

Quick Intro to City Engine | City Engine浅谈

研究了一下City Engine。这个软件现在归ESRI公司,也就是开发ArcGIS的公司,所以这个软件的定位主要在GIS系统,城市规划等等。 主要原理 City Engine建模的主要原理叫Procedural Modelling,一个计算机图形学术语,大概就是用一些算法和规则来建模。比如分形,比如做树的L-System,比如建筑里面的Generative Modelling都属于Procedural Modelling。但隔行如隔山啊,读了五年建筑从来没听说过这个名词。逐渐接触了才知道,这特么不就是建筑学里的参数化建模么,而且更加彻底,模型都是完全用参数控制的。当然目的不是非线性建筑学追求的美学效果,那通常需要加入不少手动的操作。其目的是城市建模。用建筑学的说法大概像非线性建筑学想做的是地标建筑,Procedural Modelling当然也可以做,不过大部分在做背景性建筑。这种应...
Read More

Quick Intro to World Machine | World Machine初涉

最近在学习World Machine的作业。油管上有不少教程。 这个软件一般被用来制作游戏中的开放地形。 上图是一个小练习。 这个软件也是节点式的建模软件,非常类似GH,它的电池称为Device。而编辑地形原理又很像ps,只不过操作的不是颜色信息而是一个通道的高度信息。其原理一般分为五步: 创建地形。在Generator面板下。 Perlin噪波贴图生成地形(即噪波作为Height Map,就像ps噪音或者云雾), 自己绘制地形(Layout电池,就像ps笔刷) 。 还有梯度(Gradient电池),就像ps渐变色。等等。 修改地形。都在Filter面板下: Clamp把高度重新映射到一个范围,就像ps色阶下面的滑条 Terrace产生台阶地,就像ps色调均化。 还有blur。 equalizer比较像阈值? bias/gain有点像色...
Read More