Will procedural generation still exist in the age of AGI? | AI时代程序化生成还会存在吗?

1. 背景 ChatGPT, MidJourney, StableDiffusion已经证明了它们具有强大的AGI能力,但它仍然存在着局限。 ChatGPT深陷数据隐私的问题,三星不允许员工使用便是一例。但更深层次的,围栏是人类的本性,有人的地方就有圈子,在垂直细分领域,将大模型专精化,便有其革命之地。 限制大模型训练的一是训练数据,二是硬件需求。StableDiffusion基于LAION数据集训练,它有50亿个样本,需要几百台A100训练几周,一般人承受不起。就算小一点的ControlNet,基于合成的数据集,训练量级也在100万样本,100GPU小时(A100)。这都不是一般人玩得起的。 但好在pretrained+finetune在很多时候效果已经足够好,也就可以成为垂直领域的应用逻辑。它意味着小样本,小计算量就能得到一个不错的模型,影响的因素只有训练的数...
Read More

Neural Network Lightmap | 神经网络光照贴图

live demo: Neural Network Lightmap (ma-yidong.com) 问题与猜想 众所周知,Lightmap是一种古老的预计算光照模拟GI方法,可以将间接漫反射信息烘焙到场景物体的UV上,在运行时通过一次UV采样即可获取漫反射GI信息。这种技术在本世代低端设备如移动设备、Web端以及PS3/4时代均有着广泛的应用。当然,本世代最新的GI技术如Lumen等对于动态光照有着更强的处理能力,但对于纯静态的光照,lightmap技术仍然是一种很好的方法。 假设场景是完全静态的,只有视角变化。在这种前提下,lightmap仍然存在一些不足,主要是对于复杂光路的不支持。比如Specular,仍然需要实时计算Punctual Light/EnvMap的BRDF来获取。至于更复杂的光路,如Subsurface Scattering,仍需要BS...
Read More

2022 | 年终

今年没写几篇博客,在图形技术方面的长进也不大。但今年感觉自己写代码开始入门了,以前可能都不算会写代码。 今年也是这么多年来写代码最多的一年,Github为证,今年提了3.6k commit,平均一天10个。 今年写的比较多的是Typescript/React,Python和 Unity/C#。但无关语言,感觉自己最大的收获是技术文化和方法论的总结,从软件工程师的角度。作为技术美术感觉技术到头了怎么办?还有很多软件工程/游戏玩法/产品设计的坑可以挖。 美术Pipeline 之前作为技术美术,从两三年前开始接触CI/CD的概念,但并没有太多实操的经验,只有在今年才开始逐渐加深认识。一方面是Code Review的团队文化,另一方面得益于Blender环境。由于开发的是Blender管线,而它是开源多端兼容,也就很容易嵌入到Docker/Github Action的工作...
Read More

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

The Girl With a Voxel Earring,Behind the Scene | 幕后

背景是公司内部的一个比赛:Taichi 99 行代码体素挑战。使用代码创建体素艺术。笔者提交的作品获得了头名,比较有意思,因此讲讲这个作品。 代码在此: maajor/maajor-voxel-challenge (github.com) 比赛的限制条件是:128x128x128的体素空间;99行taichi代码;不能用别的库;不能导入文件。但是笔者想搞一个具象的,复杂的东西,容易引起人共鸣的作品,而笔者只有一天时间。 想了想就是珍珠耳环的少女了,这幅画相对简单又比较有名,而且恶搞很多。 众多恶搞的珍珠耳环的少女(图片来源:网上搜索) 1. How 所以具体怎么做的?具体如下 1.1 使用MagicaCSG创建 如果你不知道MagicaCSG是啥,戳这里:MagicaVoxel (ephtracy.github.io) 一个...
Read More

HtoTi | Taichi Houdini物理模拟实验

首先祝大家国庆快乐! 笔者加入太极图形正好三个月了,工作的事情先按下不表。最近一个有意思的项目是 Taichi Houdini 。整个项目是Eydcao (Yadi Cao) 在实习期间单枪匹马搞出来的。 这个项目完成的工作是让Houdini用户使用taichi做模拟。具体使用了 taichi-dev/taichi_elements: High-performance multi-material continuum physics engine in Taichi (github.com). 后者是一个基于Taichi的多材质MPM物理引擎,支持水,弹性体,雪,沙子,泥土等材质。 例如 使用方法 1.1 安装 详见项目README 项目依赖taichi element, 因此clone项目是需要初始化...
Read More

Headless Substance | 无头Substance材质生成

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

Game Art Trick – Light Field and Imposter | 游戏美术技巧 – 光场与公告板

鸽了两个月回归。 笔者了解基于图像的方法时,初听感觉没有什么特别,但细细想来忽然感觉其实以前遇到的不少美术技巧都是和这个原理相关的。当时不知道这些技巧如何被人想到,如今才发现与图形学有其相通之处。因此这里整理成文。毕竟理论水平还要学习一个,大概只能给读者一个定性的认识了。 图形学中有两类文化-基于物理的(Physical Based) vs 基于图像的(Image-based)。前者是一种原子论的方法,演绎的方法,比如PBR,希望通过对现实世界的物理建模,还原现实。后者是一种整体论的方法,归纳的方法,对现实世界做整体性和经验性地描述而不那么关心物理变量,比如光场方法。游戏中,我们使用前者的时间比较多,光照模型PBR等等,本身就是希望接近物理现实的。后者也不完全是没有,比如用材质扫描方式生成贴图。 光场是一类表示方法,是上文提到的后者-基于图像方法-中的一种典型方法。英文...
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

Build a Blender Geometry CI Pipeline |搭建一个Blender模型CI(持续集成)框架

这里想验证的一个想法是,能否做美术资源的持续集成(CI)。 当然业界是有这样实践的,这里想自己搭遍框架。 涉及到版本发布的业务,比如app开发,引擎开发,应用开发等等,一般都会做CI,方便快速迭代。游戏影视行业亦有如此的需求。最常见的是游戏打包了。 不过,作为游戏TA/TD,我们更关心的是,美术资产生命周期上的质量保证。CI在美术工作流程上的意义,可以在于减少手动操作,更快看到最终效果。 如同在前面一篇Char Pipeline中讨论的,本文尝试了美术流程中一个最简单的步骤作为示例: 检查面数,生成LOD。我们的目标是,搭建一个CI框架 方便扩展写blender中的单元脚本,单元脚本用来做单元测试(这里是检查面数)或者单元build(这里是生成lod)使用docker运行blender,提高扩展性部署成Jenkins CI,使其有UI界面,并能自动触发bui...
Read More

Data-Driven IK in Character| 角色中的数据驱动反向动力学

读论文写代码有感,当我们从隐空间的角度看待动画,很多动画的机器学习算法的原理就比较好理解。以及IK,传统的方法可以看成是机器学习方法的近似和简化。 因此笔者试做了一个Data-driven IK的Demo Github地址:latent-pose Blender中使用 动作数据在引擎内显式表示为每根骨骼的TRS(位移旋转缩放)。这样来看其维度(自由度)是12*NJoints。即4x4其次矩阵去掉最后一行。如果只有旋转是3*Njoints(Axis-Angle表示下) 一个观察是,这个维数是不大的,就算100跟骨骼旋转,这才300个维度。相比于图片和模型处理动不动上百万的维度,已经相当好训练和运行了。因此动画中应用机器学习进展的相当快。比如最近几年比较火的motion matching, RL生成动画等等。 另一个观察是,这么多维度中, 各个维度不...
Read More

BxDF Truth to Realtime with Mitsuba. A case study of Fur BSSRDF | BxDF从真实到实时,以毛发为例

在写GAMES101大作业时,在Mitsuba里实现BxDF, 遇到的很大一个问题是, 怎么知道渲染结果是'物理正确'的? 我们凭什么相信渲染器或者游戏引擎的渲染结果,是“物理正确”的?如果不是物理正确的,限于模型和计算性能的限制,什么损失了? 要回答这个问题很不容易,不是所有引擎和渲染器都是开源的,也不会有时间去研究所有渲染的代码。 当然我们知道,PBR不仅仅是材质,还包括灯光,相机。有关PBR一个集大成的talk是来自Frosbite的Moving Frosbite to PBR. 材质BRDF只是其中很小一部分了。当然本文也只讨论材质(BRDF)了,仅仅以自己尝试实现一个实时的毛发渲染为例子。 笔者这里想实现的是,Yan Lingqi教授的An Efficient and Practical Near and Far Field Fur Reflecta...
Read More

A Differentiable Chair | 一把可微分椅子

最近做的一个实验,用一个椅子模型去匹配图片。 主要受到CMR这篇论文的启发,MPI之前的一系列文章,比如SMPlify。用到了最近比较热门的可微分渲染器,比如Neural Mesh Renderer。 最后能生成一个模型和一张贴图,贴上贴图在Blender里预览一下 由于预先分了对称的uv,以及拟合pose不太准的问题,贴图看上去还是有点莫名其妙,并且看不到的部分还是白的。 uv texture 这里给个引子介绍一下几篇相关的论文。 Category-Specific Mesh Reconstruction 论文标题Learning Category-Specific Mesh Reconstruction from Image Collections,ECCV2018的文章。作者Kanazawa是UCB的博士,之前在德国马普所交...
Read More

[Translate&Review]Intelligent Setups for Automating Character FX | [译评] 自动化角色FX配置

这篇主要讲的是影视中Character FX的自动化pipeline的,笔者觉得很有启发,因此翻译并做一讨论。 讲者Adam Katz是Animal Logics的Lead Character FX Artist,这个talk主要讲的是Character Fx,具体里来说主要是布料和毛发模拟。虽然在"术"的方面的可能和游戏开发关系不大,但是在"道"的层面,比如如何应用,如何架构等,很值得借鉴。 这套pipeline他们称为end-to-end charfx。End-to-end这个词在Machine Learning中用得很多,大概可以理解成”输入原始数据,输出的是最后结果“,中间全自动化。当然这是所有pipeline的理想目标,不需要人工介入就可以完成特定任务。 在这个talk的语境下,pipeline输入的是动画部分的关键帧动画,输出的是包含了毛发和布料的集合体,直...
Read More

微信公众号同步

欢迎关注公众号:码工图形 大家好,本网站受限于VPS内存容量(1GB),在大规模访问时经常出现MySQL服务挂掉的情况,不堪重负。 笔者已将最近两年来大部分原创文章备份到微信公众号:码工图形 一来分流,二来方便某些公众号转载 以后文章也将会同步到微信公众号,欢迎关注,望周知。
Read More

Interacting with Houdini Engine in Python | 使用Python与Houdini Engine交互

Houdini Engine是Houdini的一个无图形界面简化版,可以通过houdini engine与houdini内核交互,完成houdini fx中的操作。官方有For Maya, For Max, For Unity, For Unreal四个插件,可以在这四个host程序中调用houdini engine。这是极好的,意味着开发的HDA资源可以直接应用在host程序中。 不过笔者并不满足于此,是否可以不用host环境直接调用houdini engine?当然可以,官方提供了一套C API . 只不过笔者看着它就头疼,主要两个问题 面向过程,不面向对象语法繁琐 这也是笔者开发pyhapi的初衷,希望面向对象,简化语法。 文档请见 https://pyhapi.readthedocs.io 如何安装 已经发布到PyPI,安装直接使...
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

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生成城市白模

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

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中比较详细地描述了kajiyakay模型和一些hacking技...
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

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

本文尝试在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

(首先假定读者有基本的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中快速神经风格迁移后处理

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的输入图片,而是生成器的权重。这样生成好的生成器就可以离线将图片生成为风格化图片   和pix2pix很像了,pix2pix的genera...
Read More

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集群动画与马尔可夫链

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

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

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

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

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

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

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

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

  路网的程序式生成前人曾经提出过多种方式,比如用模板,用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

前记 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 | 顶点动画再议

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 | 地形峭壁问题

传统高度图地形的制作方式不可避免会遇到峭壁拉伸严重的问题,另一方面峭壁要有分层的感觉。常见的解决方法主要有两种:一种是贴面,用石头的模型摆成悬崖,但是人力成本太高;另一种是用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-647dd5529e168287636603/] 嗯,65536就是INF了. 以及误差需要注意。在1附近,误差是2^-10,大约0.001。在4096到8192的范围,误差是4。 写shader时可以instanceid,vertexid,threadid都用ushort(不过shaderlab没有ushort是为啥。。。),写字面量时值的后面加个h就表示half了。 2. 算术问题-乘加MAD shader一般会有一个硬件指令MAD,一次计算一个乘加,如Metal的...
Read More