zoukankan      html  css  js  c++  java
  • (转)刨根问底!曲面细分技术到底是个啥?

    泡泡网显卡频道8月13日 有竞争的地方总会有争吵,虽然偶尔感觉聒噪,但也总比鸦雀无声来的好些,毕竟说明这地方还有人烟,还有关注。

        都在说DIY市场受到了整机,特别是笔记本很大的冲击,但一个DX11的发布,还是引来了NVIDIAAMD双方声嘶力竭的对吼,显然说明这个市场还是蓬勃的,至少大家还都很重视,不愿轻易输这一阵。我们也乐见双方这样的争吵出现,毕竟这表示它们没有倦怠,还在通过产品技术的升级进行着宿命般的伟大竞争。

    刨根问底!曲面细分到底是个啥?

        但犹如神仙打架,我们这些凡人也只是看着天上彩云飞舞,雷电交加,热闹看够却不知其然。不小心哪位神仙的天兵跌落凡间,没准还要殃及无辜。就好象这次双方的DX11大战,不管是率先发难的AMD还是奋起直追的NVIDIA,都把焦点集中到了一个很长的名字上——Tessellation!口水仗打了不少,其实也没几个普通用户了解这是个啥,有啥作用。这个名词普遍被接受的中文翻译叫做“曲面细分”,在专业领域也往往被称作“镶嵌”,由于国内IT媒体普遍采纳了“曲面细分”这样一个称呼,所以在后文中,我们也从善如流,使用这个称谓。

    刨根问底!曲面细分到底是个啥?

        实际上,曲面细分绝不是DX11更新的全部内容,从某种角度看,甚至称不上最具革命性的更新。那为什么A/N双方对于曲面细分这样的在意,寸土不让,NVIDIA以GTX400系列拥有超强的曲面细分性能而自居,而AMD在开始推广DX11显卡时也把重点放在了对它的诉求上,甚至目前被最广泛使用的DX11测试程序Heaven也基本是围绕着曲面细分来做文章?

        简单的讲,虽然在改善增强画质方面DX11有不少新特性,但在短期内可以立竿见影看到效果,游戏开发商最容易掌握的就是曲面细分技术。这种容易使用又能出效果的东西,在DX11普及的漫长的初级阶段,将会是最能代表DX11效果和性能的技术,自然会引来各方关注。所以大家也就理解了为什么NVIDIAAMD在这个问题上争吵不休了。

        那曲面细分到底是什么?能为我们这些普通玩家带来什么?这正是本文要重点讲述的内容,让大家知其然后,自己判断它能否左右您的选择。

    DX11中的曲面细分引擎


        当厂商以及用户开始神话曲面细分的时候,可能它自己都没想到能有这样出人头地的一天。实际上曲面细分也是DX11收编的“散兵游勇”。

    刨根问底!曲面细分到底是个啥?

        曲面细分最早出现在专业领域,在蛰伏了多年后,终于被AMD引入到PC图形技术中,通过R600系列的发布,见诸于桌面图形市场。但由于没有微软给予的官方身份,专属性太强,无论是其它图形核心生产厂商,还是游戏开发商,都很难也不愿意去跟进这样的技术。幸好AMD为微软打造的XBOX360图形核心Xenos采用了它,由于主机市场的封闭性,所以XBOX360的大量游戏中都采用了曲面细分技术,微软亲自体验到了它的好处,并终于在DX11中收编,通过自己的标准强势推广,否则还真不知道它要在边缘徘徊多久。

        实际上,我们所说的曲面细分的作用,只是机械的为一个多边形模型增加更多的多边形数量,这就是其核心内容,如果不加前后期控制,这样的技术对于提升图形效果起不到任何作用,对于性能反而还会起到负面影响。

    刨根问底!曲面细分到底是个啥?

        之所以在DX11中,曲面细分会有改善画质的作用,我们通过一张DX11流水线图的观察就能发现其原因。在增加了Tessellator外,流水线前面还多出了Hull Shader后面还增加了Domain Shader两个模块,也就是说要想通过曲面细分获得图形效果提升,必须在曲面细分前后加以人工控制,不能任由其发挥。

    刨根问底!曲面细分到底是个啥?

        对于Hull Shader、Tessellator、Domain Shader这三个新加入的单元的作用,上面这张图给予了较为明确的回答。Hull Shader主要负责定义细分等级(LOD)和相关控制点在细分中的“形变”趋势,这里的形变之所以加引号,是要说明这种形变仅仅是类似于曲率改变等小幅度的变化,而非大幅度的多边形位移;Tessellator则负责根据HS传输下来的信息,通过暴力增加多边形去实现HS的要求;Domain Shader负责的最重要的功能就是通过贴图控制的方式,实现模型的形变,也就是我们大家在DX11的细分曲面中看到的高细节画面。

        通过上述的分析,大家应该可以得出一个结论,实际上细分曲面负责的仅仅是为后续的提升画质的运算提供物质基础,无论是置换贴图和平滑效果,都需要有大量多边形的存在才能实现。试想,如果开发者想在一个三角形上通过置换贴图实现一座城市的地貌效果,空有精美的置换贴图,区区三个顶点如何形变拉伸?巧妇难为无米之炊,但如果给你100000个顶点呢,事情就容易多了。

        实际上,从用户的角度讲,这一段的内容并不重要,从曲面细分上获得什么样的快乐才是他们关心的,而非原理。

    曲面细分——更光滑的模型


        我们已经知道,曲面细分的作用是在原有模型上,将多边形数量大幅增加。一个原来只有100个三角形构成的模型,突然间被赋予了100000个三角形,游戏开发人员能如何利用这些多出来的免费资源?或者说,玩家如何看出100000个多边形的模型和100个多边形模型的区别?

        由于现在桌面级图形技术都是基于多边形建模原理,所以无论是四边形、三角形、圆形,还是任意形状,都是由数量有限的三角形构成的。这就导致我们经常会发现物体,特别是本应圆滑的物体出现生硬的边缘,即使粗看下是圆滑的边缘,在放大观察的情况下,也是由一条条直线连接而成,这都是因为多边形数量不足造成的。如果想要获得能欺骗视觉的圆滑效果,就必须将多边形数量提升到一定程度。

    刨根问底!曲面细分到底是个啥?

        举个例子,现在不再火热但却更加风情万种的劳拉小姐,在《古墓丽影》第一代中出现的时候,全身都是“硬朗”风格的直线条,号称肌肉美女。但并不是游戏开发人员希望把劳拉变成史泰龙,而是在当时图形运算能力极为有限的情况下,多边形数量必须严格控制,否则游戏速度就不能得到保证。而在最新的《古墓丽影》版本中,由于硬件机能的极大提升,多边形已经不是游戏开发者值得顾虑的问题,劳拉又回归了最初设定的性感丰满,只是玩家的热情和游戏的素质不再了。

    刨根问底!曲面细分到底是个啥?

        还有,当年最红的FPS游戏《Quake III Arena》,当我们把几何细节开到最高的时候,包括门洞等模型都将呈现出比较圆滑的过度,而当几何细节降低后,依然是丑陋的三脚边。虽然id software给这种技术其了很拉风的名字,但实际内容还是通过更多的多边形去近似描绘圆滑表面。

        以上的两个例子都说明了一个问题,当多边形数量提升后,我们将会获得更平滑圆润的模型,而曲面细分正式能相当轻松的提供给游戏开发者数量极为庞大的多边形去使用,结果自然是让100个三角形的简陋模型变成了100000个三角形的圆润模型。玩家看到的图形效果也就获得了提高,这正是细分曲面提升画质的第一重作用。

    曲面细分——更多细节的模型


        同样还是那个由100个三角形组成的模型,同样还是免费的将它升级到100000个三角形,但是这个模型从劳拉变成了怪兽,我们不再需要圆滑,而是丰富可信的细节,这100000个多边形能有什么作用?

    刨根问底!曲面细分到底是个啥?

        很多用户都知道凹凸贴图(Bump Mapping)、法线贴图(Normal Mapping)等技术,可以通过贴图的方式提升模型的细节。但是这些贴图技术只是通过欺骗肉眼的方式模拟出细节,而且不能进行深度较大的视角偏移或者拉近观看,否则很容易看出破绽,因为它们都不能对模型本身做任何处理,可以说是光影的欺骗术。

    刨根问底!曲面细分到底是个啥?

        而通过曲面细分技术产生的数量巨大的多边形,就给了模型一个“重生”的机会,以为更多的顶点可以通过人工控制的方式实现真实的顶点位移,直接对模型的外形产生影响,让模型具备真实可信的细节。而利用这大量免费多边形产生模型顶点位移的技术就被称作置换贴图(Displacement Mapping)。

    刨根问底!曲面细分到底是个啥?

        置换贴图是通过一张深度贴图(实际上可以理解为一张黑白贴图,通过黑白深浅的不同来确定对应的顶点的偏移量),来控制通过曲面细分产生的大量顶点,制造出实际的模型位移,使得模型的细节大幅提升,明显改善画面质量。从实际的意义和效果上说,这将远比简单的平滑模型来的更重要,对于画面的改善效果也更明显。

    刨根问底!曲面细分到底是个啥?

        举个例子来说明更容易理解。以目前被广泛使用的DX11测试软件Heaven而言,在开启曲面细分后(实际上是开启了曲面细分+置换贴图的组合),画面的细节程度被极大的提升了,无论是地砖的沟槽还是红龙身上的褶皱骨骼细节,都被细致的描绘了出来,而且由于是通过对模型顶点的位移操作,这些多出来的细节还能产生真实的阴影等效果。反观在关闭曲面细分选项后,一切归于平静,城市不再华丽,红龙也不再威严。

        置换贴图由于需要大量的顶点去进行位移,所以需要模型具备足够数量的多边形,而曲面细分做的事情也正是如此,这也就成为了它提升画面质量的第二重作用。

    绕开各种水坑


        文字写道这里,相信大家应该明白,曲面细分技术确实可以帮助用户获得更好的画面质量,简单的说,是个有用实用的好技术。但是很多好技术,由于在实际运用中遇到了种种问题,最后也是无疾而终,曲面细分是否也会遇到同样的问题而夭折呢?特别是对于游戏开发商而言,一个技术是否容易被使用才是他们更关心的,容易使用和好效果之间,开发商往往选择前者,特别是PC游戏开发商,大部分都是在工期+预算的双重压力下赶工,好用可能是他们评价一种新技术的唯一标准,因为你不能指望到处都是暴雪,到处都是山内一典的《GT5》。

        前文我们明确了曲面细分能带给来的两种提升画质的方式,在下面的章节中我们将分开阐述这两种方式中可能遇到的问题,以及曲面细分能否解决或者如何解决。

    刨根问底!曲面细分到底是个啥?

        从容易使用的角度看,曲面细分自动生成大量的多边形数量去实现模型的圆滑效果,这个对于开发人员而言应该是非常容易使用的,所以开发商接受起来并不难。

        但是这里产生了一个很有趣的问题,由于产生多边形是自动的,可以说产生圆滑效果也是自动的,如何控制哪里不产生圆滑效果反而是开发人员需要考量的问题,看似可笑,实际上这样的问题确实存在,并且扼杀过一些曲面细分的早期版本。

    刨根问底!曲面细分到底是个啥?

        如果是对于显卡发展比较了解的用户可能会记得AMD在RADEON 8500时代推出的Truform技术,实际上这也是一种曲面细分技术,只不过它仅仅是只能自动生成多边形而已,缺乏相对应的控制手段。在AMD的演示中,Truform确实可以把一些看起来见棱见角的模型进行优良的圆滑处理,但在实际游戏中,这种“地毯式”的圆滑处理就暴露出了问题。

    刨根问底!曲面细分到底是个啥?

        当时最知名的Truform BUG就是在《英雄萨姆》中,将本开线条硬朗的机枪“圆滑”了,使得我们的英雄端着一把很有喜感的圆肚冲锋枪周旋于满屏幕的怪物中。也正是由于这个原因,Truform失败了。

        而DX11中的细分曲面技术,在开发阶段就已经看到了前人翻船的水坑,最大限度的避免同类问题发生。这也就是在DX11渲染管线中不仅仅增加了Tessellator单元,还在之前加入了Hull Shader的作用。Hull Shader作为一个控制器,可以根据开发者的意图,去判断哪里需要增加多边形达到圆滑的效果。

        这种判断实际上也并不困难。在细分曲面出现前,一个多边形数量不高,但又需要圆滑效果的模型,一般都是用软边(Soft Edge)、硬边(Hard Edge)的方式去实现。实际上,也就是通过对发现的操作达到圆滑显示的效果。

    刨根问底!曲面细分到底是个啥?

        我们可以通过上图去说明这是如何实现的。同样的一个模型,多边形数量并不多,左侧的模型进行了软边处理,使得模型看上去圆滑了很多;右边的是原始的,或者说是硬边处理的模型,能清楚的看到模型上的棱角。

        在很早以前,游戏中就已经采用了这种技术,而软边和硬边的操作在法线上是不同的,而Hull Shader就可以根据程序员的指令去判断这种差异,并告知Tessellator该为哪个模型或者模型的哪个部分去进行曲面细分,从而达到可控圆滑模型的效果。可控性成为了DX11曲面细分胜于之前同类技术的关键。

    模拟逼真自然场景


        细分曲面另外一种提升画质的方式是通过置换贴图实现的,而这里就需要大量的后期控制,也就是说在大量顶点生成后,通过什么方式去控制这些新增加的顶点形变,以期达到我们想要的增加模型细节的目的。

        实际上,控制新增加顶点形变的手段并不只有置换贴图一种方式,只不过它是被用到最多也相对来说比较容易的,所以我们在前文中一直是用“置换贴图”来表述形变控制。大体而言,形变控制除了用置换贴图外,还可以使用程序控制的方式。

    刨根问底!曲面细分到底是个啥?

        由于通过细分曲面新产生的大量新顶点都是实际存在的,也就是都有三维空间坐标,通过一定程序的制定,就可以控制这些坐标进行位移,如果说通过贴图控制是静态的,那通过程序控制就是动态的,因为在程序中我们可以加入很多种变量,让顶点呈现不断的变化,比如说水面或者飘动的旗帜。

    刨根问底!曲面细分到底是个啥?

    刨根问底!曲面细分到底是个啥?

        通过Occean technology demo这个测试可以非常明显的观察到,打开曲面细分技术,并且调节细分级数的不同,海面将呈现出明显不同的变化。特别是当级数提升后,海面的细节就变得极为丰富逼真。实际上去控制海面变化效果的程序代码是一样的,但是由于可控制顶点数量的不同,所以呈现出来的效果也就出现了不同,这就是曲面细分在这里发挥的作用。

    刨根问底!曲面细分到底是个啥?

    刨根问底!曲面细分到底是个啥?

        实际上,在DX11曲面细分技术出现之前,这类效果就已经开始被使用了。在目前依然顶着最强画质头衔的《Crysis》中,Crytek2引擎就采用了一种叫做Screen-Space Tessellation的技术,实际上就是通过程序去控制大量的曲面细分顶点制造出逼真的海洋效果,再配合游戏本身出众的光影技术,使得效果更佳逼真。

    刨根问底!曲面细分到底是个啥?

        AMD在演示HD5000系列的曲面细分效果时,展示了一个经过曲面细分处理后的旗帜拥有了更自然顺畅的飘动效果。这就是当顶点数量增加后,通过重力、风等物理程序控制的效果更佳连贯的结果。

    展现高细节模型的威力


        虽然通过程序控制顶点形变效率很高,但是这种效果只能适用于无序、大面积的场景中,比如像海洋这样的自然地貌。如果需要针对特定的模型,进行特定的控制,比如说游戏人物,我们还是要动用前面说过的置换贴图技术。而置换贴图本身实际上又可以分为两种不同的方式去操作。

        所谓的两种方式,实际上是指用以置换的贴图获得方式的不同,这对于用户而言是不可见的差别,但对于游戏开发商而言,就存在难以的差别。

    刨根问底!曲面细分到底是个啥?

        第一种方式,实际上在早前的一些游戏引擎的介绍中,已经讲述过很多次,只不过当时我们谈论的不是置换贴图,而是法线贴图。就是在游戏开发的前期,模型师就建立一套高细节的模型,然后通过“烘焙(BAKE)”的方式将这些细节信息保存成一张置换贴图,然后在游戏中通过这张贴图的信息去控制曲面细分出来的数量众多的顶点。实际结果就是一个低多边形模型通过曲面细分+置换贴图达到了与高细节模型相同的效果。

    刨根问底!曲面细分到底是个啥?

    刨根问底!曲面细分到底是个啥?

        这种方式可以获得效果最佳的置换贴图,但开发商要在前期建立一个高细节模型,其开发成本实际上并没有太多的降低。不过随着像ZBrush这类建模软件的成熟,制作一个高细节模型也并不是什么太复杂的事情了。以上是《虚幻3》中的法线贴图制作流程,实际上和置换贴图的制作过程一样。

        第二种方式,就让游戏开发商非常省心省力了,因为根本就不用制作专门的置换贴图,这样就节省了大量的开发成本和开发周期。

    刨根问底!曲面细分到底是个啥?

        我们都知道一般模型至少会有一张色彩贴图,而色彩贴图中的Alpha通道所包含的信息,就可以直接当作置换贴图使用,当然如果利用凹凸贴图去做效果会更好一些。上图就是利用专业图形软件MAYA去简单展示的利用色彩贴图中Alpha通道信息去控制顶点的效果。

    刨根问底!曲面细分到底是个啥?

        当然,这种贴图本身所包含的信息并不是针对顶点位移控制建立的,所以在精度上不是很高,用来对人物模型使用可能并不合适。但对于场景,比如像Heaven中的地转,墙壁等部位使用就非常合适了,其效果与专用的置换贴图相差无几。

    我们需要曲面细分


        通过这篇文章,我们尽量希望通过简单的语言描述,为大家去讲解DX11中曲面细分的作用和意义,以及对于用户而言可以获得哪些实际的画面提升感受,并针对这些技术是否容易被开发商采用而广泛的出现在更多的游戏作品中。

    GTX460

    大量使用曲面细分技术的《天堂2.0》中,N卡遥遥领先于A卡

        相信大部分读者已经认同,曲面细分是一项很优秀的技术,但是曲面细分实际上只是一个中间过程,并非我们最后看到的结果。曲面细分产生的大量多边形,在人为控制下产生的各种形变才是改善画面质量的根本因素,这是一个相辅相成的过程。

        对于开发商而言,一款好技术如果不容易使用,也会被抛弃。而在我们分析的几种情况下,曲面细分实际上都还算是容易使用的,而且在之前开发商通过其它同类相关技术已经积累了不少经验,相信在未来的游戏中我们会越来越多的看到由曲面细分技术为我们带来的惊艳视觉效果。

    刨根问底!曲面细分到底是个啥?

        是个好技术,容易被使用,确实能够改善画面质量,那结论自然是用户需要曲面细分,而且会越来越多的需要。这就告诉了我们一个现实的问题,当游戏越来越多的使用曲面细分的时候,显卡本身是否有足够强大的曲面细分引擎就成为了关键。虽然目前NVIDIAAMD都已经推出了DX11级别的显卡产品,但在测试中已经表明,NVIDIA GTX400系列显卡拥有明显超越对手的曲面细分能力,这在未来的应用中将会帮助使用NVIDIA GTX400显卡的用户获得更好的游戏体验。■

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/lancidie/p/1866837.html
Copyright © 2011-2022 走看看