GDC2017【神秘海域 4】中所使用的顶点着色器技术

原文链接 http://game.watch.impress.co.jp/docs/news/1047802.html

会場:San Francisco Moscone Convention Center

Naughty Dog的Lead Technical Artist、Andrew Maximov氏

在GDC 2017的最后一天,Naughty Dog在题为【Technical Art Techniques of Naughty Dog: Vertex Shaders and Beyond】的分享会上,对公司的人气动态做冒险游戏【神秘海域4(Uncharted 4)】的Vertex Shader(顶点着色器)的使用实现的要素做了解说。

登场解说的,是Naughty Dog的技术美术组长(Lead Technical Artist)Andrew Maximov。Maximov所列举的【神秘海域4】的粒子着色器所做的内容,相当的丰富和有意思。

这次是基本上是沿袭SIGGRAPH 2016上的内容,不过因为是GDC 2017最后一天最后的一个主题,会场里包含站着听的开发者完全的满员,不得不进行入场的限制。

所谓的Vertex Shader是什么呢,在最近GPU上的支持了没有分工区别的统一渲染架构的Unified-Shader的同时,因为计算阶段也被细分化了,不能简单的来区别了,传统的GPU绘制图形进行演算的部分,Vertex所指的是负责的3维顶点的计算,到写入到缓冲部分的计算单元。而这次分享中提到的Vertex Shader,也是如此作为上下文来使用。然后为了绘制实际的图形,通过Pixel shader的运行,得出画面上像素的颜色后,来进行绘制。

现代的Vertex Shader是把3D的顶点数据的集合,转化为相机所看到的2D的顶点数据,在制作“绘制元素”时,把美术师制作的原始的3D的形状和颜色数据进行加工,就可以动态的制作出变化的形状和颜色。这部分Shader有着程序化(Procedural)的意义在里面。能这部分做好,实现与其他游戏的差异化,有着非常重要的意义。

【Uncharted 4 General-Purpose Vertex Processing - Naughty Dog】

Uncharted 4 General-Purpose Vertex Processing - Naughty Dog.mp4

在【神秘海域4】中实现的很有意思的,是通过几种基本系统的组合,制作出丰富多彩的变化。以此为大前提,在整体的空间,有着控制风的风系统(Wind System)。

组合这个风系统的对象,有着以一点为中心轴(Pivot)进行变形的元素,具体来讲就是以草木树枝的根为中心轴来弯曲的那样的白哦先。但是,草木随风的飘动,不光有风系统的影响,像叶子顶端激烈的晃动,是通过激烈切换法线贴图,用法线的凹凸表面来实现动画效果。这样把每个局部的动作用适当的技法组合来实现的。

另外,使用Wind System和Pivot制作的动态效果,不光只有背景。角色的毛发和衣服随风飘动的样子也是受风系统影响的。另外毛发还受重力变化的影响。在毛发干燥的时候,是不受重力影响的,而是跟随风系统随风摆动的,而切换到下雨的场景里,头发被雨润湿后受重力影响运动也变得沉重起来。为了实现这种变法,角色在通常使用的法线贴图外,还要准备其他用途信息的法线贴图。

【头发的Pivot受风的影响控制】



 

衣服飘动时候的处理也是,利用了方向信息的扩展贴图。并不是整个衬衣受风力控制,把飘动的那部分皱折用Mask的方式用法线来作出皱折的形状。然后再通过与向下Scroll的2轴向的2D法线进行混合,来作出衣服受风运动的效果。

【风对衣服的影响】



 

在垂直的旗杆挂着的旗子的飘动表现,也是采用的类似的方法。旗子飘动,是参考的保存在顶点颜色中的值,通过对描述的在无风状态下沿着旗杆下垂的状态和受风影响完全横向飘动状态之间做变形(Morph),再与风系统影响的动作做混合来表现。另外那种水平放置的旗杆,旗子垂下的状态,是通过Pivot和法线的来进行风的模拟的。

【重力对头发的影响以及旗子的飘动】



 

变形方面,又称作“Step Morph”,在脚底起伏所产生的步调的变化,足迹和脚下地面的变换,尘土粒子的控制上也被使用了。另外还有碰撞所产生的汽车的变形,是预先在顶点颜色里保存表现碰撞产生的凹凸的坐标信息。用变形状态的变化管理在Render Target中写入损坏值。在通过损坏值来对车体表面进行变形,称作“Skinned Morph Target”。

【地面的変化】



 

【汽车碰撞的变形】



 

【飞行物的控制】



 

除了这些实现之外,为了能充实细节,控制降雨强弱的信息,也保存了作为Scale值的动画数据,再参考这个值自动变化的来使用RayCast,水面上浮动的小船和水面的涟漪的表现,可以根据小船上下移动和左右旋转的偏移自动的生成。

【雨天/水面的控制】



 

【人群的控制】



 

在降低渲染处理负荷的措施上,例如Billboard的特效动画,加入了相机看不到的像素就不会描绘的优化。还有为了不会产生特效纹理的分辨率的低劣化,最低也会使用一半数据尺寸。也加入了跟随玩家角色的移动,增加角色包围网格范围内草的生成密度。

【负荷降低 / 优化】



 

除此之外,还有很多的“小技巧”,都是使用顶点着色器的功能来实现,每个都不是什么高级技术,不过实现了那么多要素,不得不佩服这些复合技术的使用。

Naughty Dog的下一款作品预订为【最后的生还者2 The Last of Us Part II】,虽然游戏风格不同,但可以确定的是下一款作品中肯定会实现更高密度的信息,非常的期待【The Last of US II】以及【Uncharted】系列的续作。

时间: 2024-08-11 11:40:33

GDC2017【神秘海域 4】中所使用的顶点着色器技术的相关文章

顶点着色器 学习笔记

顶点着色器 shader的三种变量类型 uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息:如果在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用:只读常量数据: attribute变量是只能在vertex shader中使用的变量:一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等: varying变量是vertex和fragment shader之间做数据传递用.一般vertex

unity shader 学习 (2)Vs【顶点着色器】 和 Ps【像素着色器】

上一章我写了渲染管线,中间提到了shader的作用,我们的大shader同学主要就是负责被CPU指派到GPU中做一些如顶点转换,关照模型,光栅化等操作的. 大shader有两种类型,他们分别是Vs[顶点着色器] 和 Ps[像素着色器].. 他们可以同时存在,也可以分开存在,没有任何使用限制. 当时如果同时存在的话,必须Vs执行完成后再交给Ps处理. 他们两个家伙是配合固定流程管线而存在的.

顶点着色器和片断着色器

顶点和片段着色器 必备知识 熟悉Stage3D API.最好之前使用过VertexBuffer.在继续这个教程之前一定要先阅读本系列的第一个教程(Stage3D原理).    所需软件 Flash Builder 4.5 Premium (Download trial) Flash Professional CS5.5 (Download trial) 在本章中,你将对着色器(Shaders)有一个大概的了解.着色器是Stage3D渲染管道的核心.你将学到顶点和片段着色器是个什么东东,它们在3D

OpenGL ES 2.0 顶点着色器的妙用

1.飘扬的旗帜(水面起伏) 基本原理 绘制一帧画面时由顶点着色器根据一定的规则变换各个顶点的位置,即可得到旗帜迎风飘扬的效果. 为了使旗帜的飘动过程比较平滑,采用基于正弦曲线的顶点位置变换规则. 计算方法 传入顶点着色器的原始顶点的Z{X|Y|Z}坐标都是相同的(本案例为0),经过顶点着色器变换后顶点的Z{X|Y|Z}坐标是根据正弦曲线分布的 首先计算出当前处理顶点的X坐标与最左侧顶点X坐标的差值,即X距离 然后根据距离与角度的换算率将X距离换算为当前顶点与最左侧顶点的角度差(tempAngle

对用OpenGL ES 2.0实现OpenGL ES 1.1的顶点着色器的研究

对用OpenGL ES 2.0实现OpenGL ES 1.1的顶点着色器的研究 想要彻底研究OpenGL ES 2.0与前一代OpenGL的区别,还是要费很大一番精力的.最近在仔细研读<OpenGL ES 2.0 Programming Guide>,虽然这本书最早出版日期是2008年,距今已经7年了,而著作的日期或许还要早上半年到1年,但是目前OpenGL ES 2.0是主流三维开发框架,因此这本书的知识直到现在,依然受用. OpenGL ES 2.0是桌面版OpenGL 2.0的一个子集,

顶点着色器详解 (Vertex Shaders)

学习了顶点处理,你就知道固定功能流水线怎么将顶点从模型空间坐标系统转化到屏幕空间坐标系统.虽然固定功能流水线也可以通过设置渲染状态和参数来改变最终输出的结果,但是它的整体功能还是受限.当我们想实现一个外来的光照模型,外来的Fog或者点大小计算方式,等等,我们可能就放弃使用固定功能流水线,转而使用CPU来实现这些计算. 使用vertex shaders,它用一段小程序替换固定功能处理.这段小程序的输入是模型空间的顶点,输出齐次剪裁空间的顶点,并且还携带一些信息,如:per-vertex diffu

向顶点着色器提供顶点参数

对于 CG/HLSL 顶点程序,模型网格顶点数据被作为输入传递给顶点着色器函数.每个输入都需要一个语义来详细指定.比如,POSITION输入是 顶点的位置,NORMAL是顶点的法线. 通常,顶点数据输入被声明成一个结构体,而不是一个个的罗列他们.几个常用的顶点结构体都被丁艳在UnityCG.cginc include file里面了,并且大多数情况下,这些都够用了.这些结构体是: appdata_base:位置.法线还有一个贴图坐标 appdata_tan:位置.切线.法线.还有一个贴图坐标 a

OpenGL学习随笔(四)-- 顶点着色器(VertexShader)

顶点着色器对顶点实现了一种通用的可编程方法. 顶点着色器的输入数据由下面组成: Attributes:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点位置.颜色等. Uniforms:顶点着色器使用的常量数据,不能被着色器修改,一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置. Samplers:这个是可选的,一种特殊的uniforms,表示顶点着色器使用的纹理. Shader program:顶点着色器的源码或可执行文件,描述了将对顶点执行

顶点着色器+片段着色器

一: 着色器 着色器只是一种把输入转化为输出的程序.着色器也是一种非常独立的程序,因为它们之间不能相互通信:它们之间唯一的沟通只有通过输入和输出. 在最简配置下,至少都得有两个着色器:一个叫顶点着色器(vertex shader),它将作用于每个顶点上:另一个叫片段着色器(fragment shader),它将作用于每一个采样点.我们采用4倍抗锯齿,因此每个像素有四个采样点. 如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入