[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-5b791ffa6f20e133882096/] 嗯,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’ | [译] “无畏”中的程序化生成岛屿

来自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中的程序化场景生成

来自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变量备忘整理

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

上回文说到的主要是手游,这次说说别的。在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 Ex...
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之类,因此profile...
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

Call Houdini Engine in Unity | Unity中调用Houdini Engine

在Unity中调用Houdini Engine是可以的,不过如果直接拖进场景,然后bake,其实不太好管理的。mesh叫啥不太好控制。但是如果用代码调用Houdini Engine,就可以进行一系列自动化操作,而且不用担心手动操作管理混乱的问题。 HDA可以直接拖进场景。拖进去以后有一个HoudiniParms的组件,组件里显示的就是HDA的面板。 实例化HDA组件 用代码调用的话可以这样: HoudiniAssetUtility.instantiateAsset(hdapath); 其中,hdapath是hda的路径这就相当于把HDA拖进场景了。然后可以用GameObject.FindObjectOfType找到HoudiniParms类型的组件,命名为assetparm,我们之后修改参数也是改它。 有几种参数:字符串,float,int/...
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 Ti...
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)。 所谓间接光,就是物体之间互相反射的那些光,也包含A...
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

Houdini Terrain | Houdini 地形生成

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

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

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

Flowmap in OpenGL | OpenGL中Flowmap水面

笔试的时候有这么一道题,讲模拟水面,用FlowMap。当时没有太懂,就随便回答的,正好这次图形学大作业有机会来实现一下。 FlowMap是用来解决水面流动方向单一问题的方法,SIGGRAPH2010上有篇文章讲的V社做Portal2时使用Flowmap的方法,见此。V社官网上也有一篇文章讲水面内容相似。他们做好场景以后用Houdini做了一个Flowmap,也是蛮厉害的。还有一篇博客,不过讲的不是很清楚,没说FlowMapOffset0和FlowMapOffset1怎么算。 注:以下代码是GLSL version 3.3 最朴素的scrolling diffuse map,就是根据时间改变uv坐标了。 [crayon-5b791ffa719ba207581159/] 当然这有些愚蠢,更真实一点的是scrolling normal map [crayon-5b791ffa719c...
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

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

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