??xml version="1.0" encoding="utf-8" standalone="yes"?>
GPU是图形处理器Q以往的GPU通用计算需要程序员先将资料伪装成GPU可识别的囑փQ再GPU输出的图像{换ؓ(f)惌的结果,而通过DX11中的Compute Shader通用计算QQ意类型的数据Q即使是非图形数据)(j)都可以直接进行计,而且不受囑Ş渲染程的束~,可以随时写入写出QGPU通用计算的效能提高(sh)(jin)很多?/p>
׃GPU的Q点运能力非常强大,支持GPUq行通用计算的技术发展势头很快,NVIDIA和AMD分别有CUDA和Stream技术,以前两家是各自ؓ(f)战,如今微Y也看C(jin)GPU通用计算的曙光,在DX11中加入了(jin)Compute Shaderq一技术,意在l一当前的通用计算技术。你可以认ؓ(f)Compute Shader标准是微Y提出的OPEN CL?/p>
Compute Shader技术是微YDirectX 11 API新加入的Ҏ(gu),在Compute Shader的帮助下Q程序员可直接将GPU作ؓ(f)q行处理器加以利用,GPU不仅具?D渲染能力Q也h其他的运能力,也就是我们说的GPGPU的概念和物理加速运。多U程处理技术游戏更好地利用系l的多个核心(j)?/p>
Compute Shader主要Ҏ(gu)包括线E间数据通信、一整套随机讉K和流式I/O操作基本单元{,能加快和化图像和后期处理效果{已有技术,也ؓ(f)DX11U硬件的新技术做好了(jin)准备Q对于游戏和应用E序开发有着很重大的意义?
在DirectX 11以及(qing)CS的帮助下Q游戏开发者便可以过复杂的数据结构,q在q些数据l构中运行更多的通用法。与其他完整的可~程的DX10和DX11线阶段一PCS会(x)׃n一套物质资源(也就是着色处理器Q?/p>
在硬件支持Compute Shader之后Q相应的g必须要比当代g更加灉|Q因为在q行CS代码的时候,g必须支持随机d、不规则列阵Q而不是简单的体或者固定大的2D列阵Q、多重输出、可Ҏ(gu)E序员的需要直接调用个别或多个U程?2k大小的共享寄存空间和U程l管理系l、粒数据指o(h)集、同步徏构以?qing)可执行无序IOq算的能力?/p>
Compute Shader可发挥的地方很多Q游戏中可以使用GPUq行光线q踪、A-Buffer采样抗锯ѝ物理特效、h工智能AI{游戏特效运。在游戏之外Q程序员?sh)可以利用CS架构q行囑փ处理、后期处理(Post ProcessQ等?/p>
Texture CompressionQ纹理压~)(j)是一U和虚拟U理cM的纹理管理方法,在很多情况下h6倍以上压~比例的U理压羃都可以极其有效地减小U理本n的大,从而避免纹理传输和理斚w的瓶颈,q且可以获得更加_的画面,由此看来其效率比虚拟U理要高?/p>
DirectX 11加入?jin)两U新的压~算法——BC6和BC7。其中,BC6是专门针对HDR囑փ设计的压~算法,压羃比ؓ(f)6Q?Q而BC7是专门ؓ(f)LDRQ低动态范_(d)(j)囑փ设计的压~算法,压羃比ؓ(f)3Q??
上图则是BC7针对LDRU理的压~与传统的BC3U理压羃Ҏ(gu)。可以看Zl的BC3U理压羃损失?jin)大量的U理l节Q压~之后的效果也很不好。而采用BC7法压羃后的U理Q丢ql节很少Q效果也非常好,q就是改q纹理压~的力?/p>
上图展示的是囑փ通过BC6压羃模式q行压羃的前后效果对比图。其中左边的囑փ为原始图像,中间的是在压~过E中损失的一些细节,而右边的是压羃后的囑փ。可以看出,从画质上来看几乎没有损失Q肉眼看不出Q,但是却可以大q度降低昑֭的占用?/p>
?着色器模型变化历程与ȝ
在图形渲染中QGPU中的可编E计单元被UCؓ(f)着色器QShaderQ,着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可~程单元式顶点着色器和像素着色器?/p>
Z(jin)实现更细腻逼真的画质,GPU的体pL构从最早的固定单元水U到可编E流水线Q到DirectX 8初步具备可编E性,再到DirectX 10时代的以通用的可~程计算单元Z、图形固定单元ؓ(f)辅的形式Q最新的DirectX 11更是明确提出通用计算API Direct Compute概念Q鼓励开发h员和用户更好地将GPU作ؓ(f)q行处理器用。在q一q程中,着色器的可~程性也随着架构的发展不断提高,下表l出的是每代模型的大概特炏V?/p>
表:(x)Shader Model版本演化与特?/p>
Shader Model |
GPU代表 |
昑֍时代 |
特点 |
|
1999q第一?/span>NV Geforce256 |
DirectX 7 1999~2001 |
GPU可以处理点的矩阵变换和q行光照计算Q?/span>T&LQ,操作固定Q功能单一Q不具备可编E?/span> |
SM 1.0 |
2001q第二代NV Geforce3 |
DirectX 8 |
图形硬件流水线作ؓ(f)处理器来解释,点部分出现可编E性,像素部分可编E性有限(讉KU理的方式和格式受限Q不支持点Q?/span> |
SM 2.0 |
2003 q?/span> ATI R300 和第三代NV Geforce FX |
DirectX 9.0b |
点和像素可~程性更通用化,像素部分支持FP16/24/32点Q可包含上千条指令,处理U理更加灉|Q可用烦(ch)引进行查找,也不再限?/span>[0,1]范围Q从而可用作L数组Q这一点对通用计算很重要)(j) |
SM 3.0 |
2004q?/span> W四?/span>NV Geforce 6 ?/span> ATI X1000 |
DirectX 9.0c |
点E序可以讉KU理VTFQ支持动态分支操作,像素E序开始支持分支操作(包括循环?/span>if/else{)(j)Q支持函数调用,64位Q点纹理o(h)波和融合Q多个绘制目?/span> |
SM 4.0 |
2007q?/span> W五?/span>NV G80?/span>ATI R600 |
DirectX 10 2007~2009 |
l一渲染架构Q支?/span>IEEE754点标准Q引?/span>Geometry ShaderQ可扚wq行几何处理Q,指o(h)C1K提升?/span>64KQ寄存器?/span>32个增加到4096个,U理规模?/span>16+4个提升到128个,材质Texture格式变(sh)ؓ(f)g支持?/span>RGBE格式Q最高纹理分辨率?/span>2048*2048提升?/span>8192*8192 |
SM 5.0 |
2009q?/span> ATI RV870 ?/span>2010q?/span>NV GF100 |
DirectX 11 2009~ |
明确提出通用计算API Direct Compute概念?/span>Open CL分庭抗衡Q以更小的性能衰减支持IEEE754?/span>64位双_ֺ点标准Q硬?/span>Tessellation单元Q更好地利用多线E资源加速多?/span>GPU |
传统的分L构中Q两U着色器的比例往往是固定的。在GPU核心(j)设计完成Ӟ各种着色器的数量便定下来Q比如著名的“黄金比例”——顶点着色器与像素着色器的数量比例ؓ(f)1Q?。但不同的游戏对点资源和像素资源的计算能力要求是不同的。如果场景中有大量的三角ŞQ则点着色器必须满负荷工作,而像素着色器则会(x)被闲|;如果场景中有量的大三角形,又会(x)发生相反的情c(din)因此,固定比例的设计无法完全发挥GPU中所有计单元的性能?/p>
点着色单元(Vertex ShaderQVSQ和像素着色单元(Pixel ShaderQPSQ两U着色器的架构既有相同之处,又有一些不同。两者处理的都是四元l数据(点着色器处理用于表示坐标的w、x、y、zQ但像素着色器处理用于表示颜色的a、r、g、bQ,点渲染需要比较高的计精度;而像素渲染则可以使用较低的精度,从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前Q两U着色器的精度都在不断提高,但同期顶点着色器的精度要高(sh)像素着色器?/p>
Shader Model 4.0l一?jin)两U着色器Q所以顶点和像素着色器的规D求完全相同,都支?2位QҎ(gu)。这是GPU发展的一个分水岭Q过d能处理顶点和只能处理像素的专门处理单元被l一之后Q更加适应通用计算的需求?/p>
DirectX 11提出的Shader Model 5.0版本l箋(hu)强化?jin)通用计算的地位,微Y提出的全新API——Direct Compute把GPU通用计算推向新的巅峰。同时Shader Model 5.0是完全针Ҏ(gu)处理器而设定的Q所有类型的着色器Q如Q像素、顶炏V几何、计、Hull和DomaimQ位于Tessellator前后Q都从新指令集中获益?/p>
如图Q快速傅里叶变换QF(tun)ast Fourier TransformQFFTQ有q泛的应用,如数字信号处理、计大整数乘法、求解偏微分方程{等。SIGGRAPH2008C(x)认ؓ(f)未来随着Compute Shader和新g、新法的加入,GPU执行FFT操作的性能得到快速提升?/p>
如果使用DirectX 11中的Computer Shader技术,API能借助GPU充裕的Q点计能力进行加速计,则能L完成大量的FFTQ傅里叶变换Q。在囑Ş渲染中,q项技术的q用极大地提高(sh)(jin)波浪生成速度Q而且画面质量也更好?/p>
以往受限于Q点运性能Q目?a class=hui14_line >CPUq行FFT变换只能局限在非常的区域内,比如64x64Q高端CPU最多能辑ֈ128x128Q而GTX 280则能实现每512x512的傅里叶变换Q所用时间不q?msQ效能非帔R?/p> DirectX11最为强调的囑ŞҎ(gu)就是TessellationQ曲面细分)(j)。Tessellation技术利用GPUg加速,现?D模型的三角Ş拆分得更l小、更l致Q也是大大增加三角形数量,使得渲染对象的表面和边缘更^滑、更_?font face=Arial sizcache="3" sizset="128">
?Tesslation试-Stone Giant
《Stone Giant》是一个针对DirectX 11 Tessellation效能十分依赖的DemoQ本ơ笔者将用其作ؓ(f)(g)验品Tessellation性能的工兗?/p>
以下Ҏ(gu)囑ַ侧ؓ(f)Geforce GTX480Q右侧ؓ(f)Radeon HD 5870?/p>
?NO Tessellation + NO Wireframe ?NO Tessellation + Wireframe ?Tessellation + NO Wireframe ?Tessellation + Wireframe ?Direct X11 SDK TestQSub D11 Direct X11 SDK TestQSub D11是集成在微Y的DirectX SDK开发包中的试lg之一Q它主要试GPU的Tessellation性能。这个测试一共包?1个层U,从第一U的d曲面l分?1U重度曲目细分,?a class=hui14_line >昑֍的几何处理能力考验不断升?/p>
我们Z(jin)对NVIDIA和AMD公^赯Q选择?jin)Factor=1/16/31Q这三个U别的测试曲面数量很有可能在未来作ؓ(f)囑Ş开发者的重要参考标准?/p>
我们能够看到一个很明显的性能变化Q在曲面l分压力不大的情况下QHD5870有接q于Fermi架构GTX480的表玎ͼHD5970则能够超GTX480。而在曲面l分压力变大之后QA卡出C(jin)非常严重的性能下降Q毕竟R800架构的一个曲面细分单元无法对抗NVIDIA在Fermi架构中给每个SM单元分配一个曲面细分单元?/p>
?DX11 SDK TestQPN Triangle PN Triangle和上一个Sub D11试有异曲同工之处,它们都着重测试GPU的曲面细分性能。这个SDK试E序是在微Y发布DirectX 11初期由AMD提供的?/p>
因ؓ(f)它同样也有曲面层U设|,所以我们选取?jin)负载较ȝ?和负载较重的19q行试。结果如下:(x) PN Triangle的测试结果和Sub D11非常怼Q毕竟两者的试目的相同。但是我们需要清楚知道的一Ҏ(gu)我们所作的都是理论性能试Q而且是有很强侧重性的?/p>
在图形运中不可能有完全U净的Tessellation环境和极大的Tessellation负蝲。所以我们不可能看到在DirectX 11游戏中出现A卡因为开启了(jin)DirectX 11支持的Tessellation功能之后性能大幅度下降?/p>
?DX11 SDK TestQDetail Tessellation Q?Q?/strong> Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准试E序Q它提供?jin)Bump Mapping、Parallax Occlusion Mapping和Tessellation三种L染模式,同时使用者可以在q?U模式之上添加其他附加效果,以达到较为复杂的Shader效果?/p>
q个试中只要涉?qing)置换位U脓(chung)囑֒传统的凹凸类贴图Q都?x)有大量的VS指o(h)Q而VS指o(h)天生是4D指o(h)Q因此R800?D+1Dl织SIMDl构处理器?x)表现出较强的性能。而NVIDIA昑֍的主要看点则在曲面细分性能上。越复杂的Shader效果对着色器性能要求高?/p>
Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准试E序Q它提供?jin)Bump Mapping、Parallax Occlusion Mapping和Tessellation三种L染模式,同时使用者可以在q?U模式之上添加其他附加效果,以达到较为复杂的Shader效果?/p>
Adaptive Tessellation技术一样会(x)通过调节VS来细化曲面结构,跟单U的讄点多边Ş的Tessellation技术来说不一栗我们发现这斚wAMD昑֍表现较ؓ(f)优秀Q比起单U的Tessellation技术来说性能衰减要小很多?/p>
而Tessellation UltraҎ(gu)面细分单元较为缺乏的A卡来_(d)性能下降非常q速,毕竟Fermi架构的GF100完整版拥?6个曲面细分单元,而AMD的R800架构只是在UTDP指o(h)分配?/u>中装配了(jin)一个曲面细分单元以辑ֈ微YDirectX 11的硬件要求,所以性能较弱理所应当?/p>
鉴于q项试对单卡双?a class=hui14_line >HD5970昑֍没有提供良好支持Q我们在Detail Tessellation试中忽略了(jin)q款昑֍的成l。我们可以从试中看刎ͼ在Shader效果较ؓ(f)单的前几Ҏ(gu)试中QAMD和NVIDAI的最新架构显卡ƈ没有太大分别Q而在来复杂的Shader效果中,全新设计的Fermi架构昑֍体现Z(jin)比较强劲的运能力?/p>
?月下旬,中关村在U显卡频道已l对DirectX 11现有的大部分游戏q行?jin)横向评,而今天这文章的目的Q就是让大家更加深入C(jin)解DirectX 11q套全新的API如何从囑Ş囑փ的渲染方面改变我们的“视界”?/p>
目前Fermi架构的Geforce GTX400pd昑֍刚上?jng)不久,整个DirectX 11周边配合E序q没有完善,用户方便执行的、可用于单项性能试的也只有屈指可数的Techdemo和SDK开发包内的E序Q而且它们的测试方向几乎都指向?jin)Tessellation技术。相信在未来的一D|间内Q我们可以运用更好的软g来了(jin)解DirectX 11昑֍的各Ҏ(gu)术特性?/p>
?DX11 SDK TestQDetail Tessellation Q?Q?/strong>
前言Q?009q?0?3日,微Y高调发布?jin)其最C?a >操作pȝ——Windows7Q这ƾ操作系l相对于之前的Vistapȝ有相当大的进步,特别核心(j)执行效率斚w得到显著改善Qƈ且加入了(jin)DirectX 11{新技术。微软此ơ推出全新图形API——DirectX 11目的很明,是能够充分利用昑֍资源Q旨在游戏以?qing)通用计算斚w辑ֈ更高的执行效率。今天本文就带大家一起分析DirectX 11技术带l图形业界和游戏玩家的双重体验。同时也让更多h?jin)解到自己是否需要一ƾ支持DirectX 11的显卡,具体选择哪些昑֍最为合适?/p>
?DirectX对GPU发展带来的媄(jing)?/p>
DirectXq不是一个单U的囑ŞAPIQ它是由微Y公司开发的用途广泛的APIQ它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects{多个组Ӟ它提供了(jin)一整套的多媒体接口Ҏ(gu)。只是其?D囑Ş斚w的优U表现Q让它的其它几个lg几乎被h们忽略?/p>
Direct Graphics的优U表现和微软的影响力,令无数硬件厂商生畏ƈ不断遵@其变化来开发新的图形处理器架构。同时ATI和NVIDIA两家厂商之所以至今仍不断跟随DirectX的步伐,是意识到M游戏相关的硬件厂商要是被微Y抛弃Q那么其后果是不堪设想的?/p>
在过ȝ数次DirectX更替中,有几ơ较大的更新Q比如我们熟知的从DirectX 7到DirectX 8到DirectX 9到再DirectX 10Q也是因L(fng)理由使得芯片变得更大。在向DirectX 8的{UM得可~程的硬件进入管U成Z(jin)双重构造。对于DirectX 9的顶点处理与像素处理Q则被真正的可编E处理器调换。而在向DirectX 10的{UMؓ(f)?jin)实现更灉|的可~程性,需要GPU架构q行Ҏ(gu)的改革?/p>
所以哪个世代的改变?sh)?qing)生什么样的GPU都关乎根本性的攚wQ而这U改革基本上都是围绕DirectXq个最重要的图形API来进行的。特别是DirectX 10时代架构的改革,从根本上改变?sh)(jin)GPU的本质。从DirectX 8向DirectX 9通过API的改革牵动了(jin)GPU架构的改革,而架构巨大变化的转折点则是DirectX 10?/p>
在DirectX 10时代Q我们非常有q看C(jin)Pixel ShaderQ顶点着色器Q、Vertex ShaderQ像素着色器Q和Geometry ShaderQ几何着色器Q,三种具体的硬仉辑被整合ؓ(f)一个全功能的着色器Shader。但是我们也发现QGPU在性能提升的同Ӟ芯片规模发生?jin)更快速的攑֤Q这不得不让人担?j)未来GPU的功耗和发热{等问题?/p>
事实上芯片变大有两个主要原因。一个是因ؓ(f)性能的增加。要提高q算性能׃(x)需要更多的资源Q这?x)增加晶体管的数量。另一个就是ؓ(f)?jin)发展可~程化。需要让单一的可~程处理器包括个别进行处理的固定功能gQ这必然也会(x)增加晶体数量。可是这样会(x)让性能出现大幅度下滑,因此Z(jin)保持同样的性能也需要大q度增加q算资源。结果就是对于GPU的情况需要从固定用向可~程g转换Q晶体管数和核心(j)?yu)寸也因此而增加?/p>
直到今天我们看到的DirectX 11出现Q这个问题得C(jin)一个^衡的解决Ҏ(gu)。DirectX 10带来?jin)众多绚丽无比的新特效,?#8220;滥用”各种Ҏ(gu)最l导致GPU不堪重负。在DirectX 10l历?jin)种UL折,瓉显Ӟ微Y也开始将重心(j)集中在如何提升算法和效率上面Q而不是一味的加入新特效或提高模型复杂度。因此我们看到的DirectX 11Q已l将技术重?j)放在如何用最的g开销在先q图形技术的辅助下实现最佳的渲染效果?br>
?DirectX 11带来的全新特?/p>
DirectX 11作ؓ(f)一套全新的囑ŞAPIQ提供给囑Ş开发者和用户极大的想象空_(d)同时降低?jin)开发难度,节省g资源Q特别是后两个特点,是DirectX 11区别与以往的DirectX最为显著的特点?/p>
2009qNVISION大会(x)上,微Y透漏?jin)DirectX 11的大量细节,此时DirectX 11已经完全成熟q获得硬件厂商支持,q和W(xu)in7操作pȝ一同上?jng)?jin)。同时借助SIGGRAPH以及(qing)GameFest 2008大会(x)上放出的qȝ片,我们可以q行一些深入的研究。此外,DX11Ҏ(gu)的提前攑ևQ对于目前DX10以及(qing)DX10.1g用户而言也很有帮助,因ؓ(f)AMD和NVIDIA可以照此提前开发适当的驱动支持?/p>
回顾历次DirectX的更替过E,几乎都对GPU架构产生?jin)颠覆性的影响Q它们大部分要求GPU改变现有的着色器Shader单元l构Q或者ؓ(f)着色器Shader单元q加资源Q这些改q都是ؓ(f)?jin)让GPU的指令数提升Q寄存器数量增加Q纹理规模提升,材质Texture_ֺ提升。这L(fng)改进隑օ带来晶体数量的增长Q也p说GPU内部的每个着色器Shader单元变得更加庞大?/p>
DirectX 11发布后,Z发现微Yq没有在Shader Model斚w做出重要提升Q虽然版本升至Shader Model 5.0Q但是更重要的是它实际上可以被看作是DirectX 10和DirectX 10.1的功能补全,你也可以认ؓ(f)它是DirectX 10和DirectX 10.1的超集,如果换个角度大胆设想Q我们今天看到的DirectX 11才是微Y惌的DirectX 10完美形态?/p>
DirectX 11针对不同斚w带来?jin)全新的?gu),目前通过现有资料分析Q它主要有以下几个方面的提升Q?/p>
?着色器版本提升到Shader Model 5.0Q采用面向对象的概念Qƈ且完全可以支持双_ֺ数据?br> ?Tessellation曲面l分技术获得微软正式支持,逐渐走向成熟Q?br> ?Multithreading多线E处理,让图形处理面对多U程~程环境不再尬Q?br> ?提出微Y自己的Compute Shader通用计算概念Q把GPU通用计算推向新的巅峰Q?br> ?新的Texture CompressionU理压羃Ҏ(gu)Q在画质损失极小的环境下带来?jin)硬件资源的节约?/p>
在今天的分析中,我们重Ҏ(gu)在Tessellation曲面l分技术方面,因ؓ(f)q是DirectX 11最为突出的特色之一Q也是给囑Şq算产生p影响的一Ҏ(gu)术,DirectX 11的其他特Ҏ(gu)们也?x)提及(qing)?br>
?Tessellation技术简?/p>
Tessellation又可译作拆嵌式细分曲面技术。其实这是ATI早在其第一代DirectX 10囑Ş核心(j)R600Q即HD2900XT上就引入的一个特D的计算模块。从HD2000pd开始,直到最新的HD5000pdQ整??a >昑֍全部支持q一技术。即使目前也仍然没有游戏能够支持q一技术,ATI也依然没有放弃在q项技术上的努力——从名字上也可以看出ATI在这Ҏ(gu)术上的心(j)血QTessell-ATI-on?/p>
Tessellation主要是靠GPU内部的一个模块Programmable TessellatorQ可~程拆嵌器)(j)来实现的。能够根?D模型中已l有的顶点,Ҏ(gu)不同的需求,按照不同的规则,q行插|一个多边Ş拆分成ؓ(f)多个多边形。而这个过E都是可以由~程来控制的Q这样就很好的解决了(jin)效率和效果的矛盾。TessellATIon能自动创造出数百倍与原始模型的顶点,q些不是虚拟的顶点,而是实实在在的顶点,效果是等同于建模的时候直接设计出来的?/p>
很明显,DirectX 11中的Tessellation让雪q凹凸感更为明显,q胜于DirectX 10里所采用的视差映脓(chung)图技术。虽然后者在较远距离观看的时候也能提供一定的视觉ƺ骗性,但和 Tessellation技术塑造出来的真实感觉q相差太q。我们用的分析图来自AMD在R600发布时放出的一DDemoQ这DDemo区别于以往的设计方式,它没有突Z角而E化背景,因ؓ(f)在没有Tessellation技术之前,大量点的生成和随之而来的计将lGPU的几何处理部分带来巨大压力,无法畅q行Q而Tessellation技术改变(sh)(jin)q一模式?/p>
除了(jin)大幅提升模型l节和画质外QTessellation最吸引E序员的地方是Q他们无需手动设计上百万个三角形的复杂模型Q只需单勾l(sh)个轮廓,剩下的就可以交给Tessellation技术自动拆嵌,大大提高?sh)(jin)开发效率;而且单的模型在GPU处理时也能大q节U显存开销Qo(h)渲染速度大幅提升?/p>
?Tessellation技术历史回?/strong>
Tessellation技术最早可以追溯到DX8时代Q当时ATI已l和微Y联手开发了(jin)TruFormQN-PatchQ技术,也就是Tessellation的前w,q被U_DX8.1的范畴?/p>
2001q_(d)ATI公布?jin)TruForm的技术细节,相关媒体也对q一技术进行了(jin)报道。简单地说TruForm技术就是将在芯片内部将游戏中的三角形{换成曲面然后再{换成一个新的三角ŞQ这个三角Ş可以在场景中昄?/p>
当三角Ş信息通过囑Ş芯片ӞTruForm技术开始工作,它通过创徏N-Patch来Ş成N-Patch|格?/p>
N-Patch|格是一个曲面,通过U性三角Ş信息来定义。N-Patches在三角Ş每个Ҏ(gu)两个控制点,q样׃生了(jin)六个新的点。这些控制点都在一个单独的q面上,可以位于原三角Ş之下或者之上。用储存在原三角Ş的顶点向量的信息Q可以决定控制点的位|?/p>
当然Q这q不是一个简单的工作Q而这正是TruForm技术的用处所在。当时h们认为它是ATI下一?a class=hui14_line >昑֍Radeon2的独门武器。在当时GPUq算能力极ؓ(f)有限的情况下QN-Patch技术可以大q提?D模型的细节和昄效果?/p>
但是它却出现?jin)一些非帔R憄pQ导致这Ҏ(gu)术最l被用户攑ּ。因为N-Patch技术技术比较适合于v豚、赛车等表面为曲面的模型上,而如果这个技术应用在坦克{不需要做曲面化的模型上的时候,效果׃(x)变得相当的滑E?/p>
N-Patch/TruForm技术就q样被市(jng)~化Q但是ATIq是没有攑ּ对它的开发和研究。终于在2005q出C(jin)转机Q在微Y与ATI的合作结晶——专为XBOX360设计的图形芯片Xenos当中Q经q改q的N-Patch/TruForm技术重出江湖,q次ATI它直接命名为我们熟(zhn)的TessellATIonQ直译ؓ(f)“拆嵌”意译?#8220;l分曲面”Q同时表CATI在这Ҏ(gu)术中不可灭的A(ch)献?/p>
?Tessellation技术拆解分?/strong>
Tessellationq个英文单词直译?#8220;镶嵌”Q也是在顶点与点之间自动嵌入新的点。Tessellationl常被意译ؓ(f)“l分曲面”Q因为在自动插入大量新的点之后Q模型的曲面?x)被分得非常l腻Q看上去更加qx(chng)致密。它是一U能够在囑Ş芯片内部自动创造顶点,使模型细化,从而获得更好画面效果的技术。Tessellation能自动创造出数百倍与原始模型的顶点,q些不是虚拟的顶点,而是实实在在的顶点,效果是等同于建模的时候直接设计出来的?/p>
在此之前Qh们对低代价多边Ş操作法已l探索了(jin)q?0q_(d)从最开始的对三角Ş的fan操纵Q到后来的龟裂和冲撞(g)查,q些Ҏ(gu)可以实现曲面l分效果Q但是对资源的消耗量太大不可控制。这ơ微软在DirectX 11中加入硬件Tessellation单元Q我们可以视作曲面细分技术历l长旉的磨l后修成正果。虽然它不太W合通用处理单元的设计方向,但是如果计算晶体的投入与性能回报Q独立的gTessellation单元是目前最好的选择?/p>
Tessellation技术是完全可编E的Q它提供?jin)多U插值顶点位|的Ҏ(gu)来创造各U曲面:(x)
1. N-Patch曲面Q就是和当年TruForm技术一PҎ(gu)基础三角形顶点的法线军_曲面Q?br> 2. 贝塞?dng)曲面,?gu)贝塞?dng)曲U的公式计算点的位|;
3. B-Spline、NURBs、NUBs曲线Q这三种曲线均ؓ(f)CAD领域常用曲线Q在Maya中均有相应工具可以生成)(j)
4. 通过递归法接近Catmull-Clark极限曲面?/p>
Tessellation技术最初主要被用以“l分曲面”Q随着该技术被U_DX11范畴Q得到大范围推广之后Q插值顶点的法也越来越多,因此用途也来广Q生了(jin)很多非常有创意的应用?/p>
Tessellation技术还l常与Displacement MapsQ脓(chung)囄换)(j)技术搭配用,从而将q面U理贴图攚w成为具有立体感的几何图形,大大增强3D模型或场景的真实性?/p>
除了(jin)大幅提升模型l节和画质外QTessellation最吸引E序员的地方是Q他们无需手动设计上百万个三角形的复杂模型Q只需单勾l(sh)个轮廓,剩下的就可以交给Tessellation技术自动镶嵌,大大提高开发效率;而且单的模型在GPU处理时也能大q节U显存开销Q同时大q提升渲染速度?/p>
?DirectX 11引入可编E曲面细分管U?/strong>
在DirectX10时代的细分曲面里Q最有新用途的是Geometry Shader和Stream OutQ前者可以输入一些数据,然后产生一些三角ŞQ后者可以断lPixel ShaderQ做完Geometry Shaderq接输出回Input AssemblerQ这意味着可以做GPU递归和P代?/p>
而DirectX 11相比DirectX 10QShader Model的变化ƈ不算大,只是增加?个全新的指o(h)集。但是对于游戏开发者而言QShader Model 5.0函数和子E序代码的开发都比上一代更加简单方ѝ增加的五个新指令集目的也是Z(jin)让编E者可以进行更灉|的数据访问和操作?/p>
在Shader Model 5.0中,Shaderq行?jin)类型的l一Q除?.0版本中就已经有的Vertex Shader、Pixel Shader、Geometry Shader外,q增加了(jin)Hull Shader、Compute Shader、Domain Shader三种新的ShadeQ它们的出现都是Z(jin)完善曲面l分线?/p>
ATI的HD2000以上U别昑֍其实都具备Tessellation的功能,但它们却无法与DX11中的Tessellation技术相兼容。这是因为微软ƈ没有原封未动的将R600的Tessellation技术抄到DX11之中Q而是对其q行?jin)优化,使之能与渲染程完美的结合在一P可以更高效率的细分出更多的多边Ş和曲面?/p>
与DX9C/DX10时代孤零零的Tessellator模块不同Q在DX11当中Q微软加入了(jin)两种全新着色器来全力配合Tessellator的工作,分别位于镶嵌器的前后?/p>
其中Hull ShaderQ外壳着色器Q用来控制自动生成顶点的数量和算法,也就是Tessellator的细分别,然后交给Tesselatorq行镶嵌处理Q最后由Domain ShaderQ域着色器Q按照程序要求生成所需曲面Qƈ自动q行法线q移、置换脓(chung)图,产生新的模型?/p>
与DX9/10中的Tessellation技术相比,DX11新增的两U着色器都受l一渲染架构支配Q因此处理能力非常富裕,DX11版Tessellation不仅效率更高、而且l分U别更丰富。但是,更高的细分等U对Tessellator模块本n的处理能力提Z(jin)苛刻要求Q这需要芯片厂商在设计之初p虑周全?br> ?Tessellation与Displacement Mappingl合应用
Displacement MappingQ脓(chung)囄换)(j)与TessellationQ曲面细分)(j)的结合用具有许多优ѝ虽然两者在原理斚w本来是没有Q何?/p>
贴图|换是一U通过VS和alpha混合操作来达成复杂表面的操作Q基本上贴图|换不会(x)增加新的多边形,即便增加也仅作操作点用。曲面细分则不一P它通过在已知多边Ş内设立新的顶点,达成fan操作来完成增加多边Ş的目的。这两种技术一个的重点是alpha和顶点移动,另一个的重点则是直接增加多边形数量。这是两U完全不同的复杂表面l节实现手段?/p>
Tessellation和Displacement Mappingl合应用
单来ԌDisplacement Mapping的目的就是借助Tessellation改变多变形的外观Q而不仅仅只是圆滑p?/p>
正如你所看到的那PDisplacement mapping能够透过Tessellation和Displacement Mapping让一张^面的|面真正实现h不同形状的外观(上面的例子是l늉起伏的山丘)(j)Q只要用Displacement Mapping映像到网面的点上,p够让|面善的点提升/升降C同的相对高度Q同L(fng)|面可以形成不同的Ş状?/p>
Tessellation和Displacement Mappingl合应用
和以往主要在光栅化阶段q行的Bump mapping不同的是QDisplacement Mapping是生成的是由更多多边形构成的真实外观Q而Bump mapping则是一U欺骗性手Dc(din)一U性能妥协Ҏ(gu)而已Q不能生真正不同的外ŞQ采用Displacement Mapping来实C富的表面l节实在有太多的好处?jin)?/p>
最l,利用Displacement MappingQ脓(chung)囄换)(j)与TessellationQ曲面细分)(j)相结合的方式所渲染出来的模型与艺术家所用工具中的原生模型很怼Q从而让艺术家不必创Z同几何细节别的模型Q无需重复地进行这U一般性劳动?/p>
?全新的多U程渲染技?/strong>
虽然线E概念已l在CPU领域发展?jin)数十年Q但大多数程序员q是直到q年来多核心(j)CPU行之后才开始关?j)程序的q化,在此之前大部分通用代码都是单的单线E,在这些代码里Lq挖掘多U程化带来的性能提升是非常困隄?/p>
Z(jin)改变q一现状QDirectX 11Ҏ(gu)还包括很重要一点:(x)支持多线E(multi-threadingQ。没错,无论是DirectX 10q是DirectX 11Q所有的色彩信息最l都被光栅化ƈ昄在电(sh)脑显C屏上(无论是通过U性的方式q是同步的)(j)Q但是DirectX 11新增?jin)对多线E技术的支持?/p>
得益于此Q应用程序可以同步创造有用资源或者管理状态,q从所有专用线E中发送提取命令,q样做无疑效率更高。DX11的这U多U程技术可能ƈ不能加速绘囄子系l(特别是当我们的GPU资源受限Ӟ(j)Q但是这样却可以提升U程启动游戏的效率,q且可以利用台式CPU核心(j)数量不断提高所带来的潜力?/p>
在DirectX 11中,微Y通过目前单一执行的Direct 3D讑֤被分Z个独立的接口Q设备(DeviceQ、立x(chng)行范_(d)immediate ContextQ和延迟执行范畴QDeferred ContextQ?/p>
q三者都被分发到各自独立的线E,而且讑֤和Deferred contextq可以分配多个线E,负责等待执行的d发送给immediate Context或渲染线E。这L(fng)设计可以图形生成所需的资源做预先的存取。同ӞCPUq可以利?a class=hui14_line >昑֍的多U程处理加快DirectX的处理,减少CPU的响应时间而游戏不再受到CPU的瓶颈限制?/p>
W?:(x)物理大战新篇?/strong> |
2008q?月,NVIDIA与AMD-ATI先后发布?jin)自家新一代高阶品GT200QGeForce GTX 280/260Q与RV770QRadeon HD 4850/4870Q,我们在惊诧于C品的极限性能Ӟ众多新技术引用也是玩家关注的重点Q例如NVIDIA的CUDA架构QAMD-ATI的GPGPU解决Ҏ(gu){。在众多的技术当中,物理加速技术由于震撼的视觉体验?qing)两家不同的解决?gu)再次成ؓ(f)?jin)h们关注的焦点?/font>
NVIDIA发布的CUDA 2.0开发包中蕴含了(jin)PhysX物理加速技术,NVIDIA的意向是使用GPU通过CUDA架构来实现物理加速;而作为同时拥有CPU与GPU业务的AMD自然?x)选择CPU+GPUZ导的Havok物理引擎?007q?月Intel闪电(sh)收购Havok之后QNVIDIA与AMD-ATI的GPU物理加速计就昑־非常尬Q因为Intel收购Havok的目的就是Havok引擎专注于CPU物理q算Qؓ(f)?jin)对抗IntelQ亦或是说CPUQ,NVIDIA收购?jin)Ageia?qing)其PhysX引擎QPhysX引擎专注于GPU物理q算。AMD-ATI如何选择物理加速方案在RV770之前业界充满?jin)猜,因?f)无论是Havokq是PhysX引擎Q都是竞争对手的产品Q而ؓ(f)?jin)AMD更加长远的Fusion计划QAMD-ATI最l选择?jin)前者?/font>
物理加速技术在2006qAgeia发布物理PhysX加速卡时被Z所x(chng)Q甚x(chng)人笑U?D加速成׃(jin)3DFXQ而物理加速将成就AgeiaQ但是由于Ageia采用的是PhysXg物理卡加速方式,而物理卡又h(hun)gԌ虽然Ageia也出售PhysX引擎Q但是由于没有PhysXg加速卡支持的话效率?x)降低,在加上NVIDIA与AMD-ATI当时都采用了(jin)Havok引擎作ؓ(f)标准Q因此一直没有受到游戏开发商?qing)广大玩家的重视。而Havok引擎在很长一D|间都是致力于CPU软g加速,但是随着Havok 4.0工具中Havok FX的发布就不一样了(jin)QHavok FX引擎是通过GPU来进行物理加速,主要针对当时的PhysX引擎?/font>
关于GPU与CPU在做物理q算时的差距q里׃多做介绍?jin),有很多这斚w的文章可寻,M来说GPUq行物理q算可以是四核CPU的十几倍到几十倍不{,比PPU有几倍到几十倍的性能提升。而我们这里主要探讨的NVIDIA与AMD-ATI GPU加速昨天、今天与明天Q?/font>
W?:(x)昨天—殊归同途的Havok FX引擎 |
Havok FX发布?006q中Q前文已l提刎ͼHavok FX引擎是通过GPU来进行物理加速,当时的NVIDIA与AMD-ATI都不U而同的支持Havok FX引擎Q首先来看NVIDIA的NVIDIA SLI Physics技术,NVIDIA是采用SLI模式的第二块昑֍来进行物理加速?/font>
从上图中可以看出QHavok FX API通过DirectX数据发lGPU驱动Q如果游戏或者驱动不支持SLI物理Q那么将不会(x)发送物理数据,反之则交lGPU 2q行物理计算Q计结果则q回lHavok API?/font>
与NVIDIA的物理解x(chng)案类|AMD-ATI同样采用Havok FX引擎Q同样基于多卡互联CrossFire来实现物理加速,W二块显卡来q行GPU物理加速?/font>
当时AMD-ATI的X1000pdGPU的设计理忉|搭徏化的芯片架构Q得芯片内部的q算灉|性增强,Ҏ(gu)外部接口API的不同,可以实现完全不同的运Q务,q且命名为DPPQData Parallel Processing Qƈ行数据处理架构?/font>
虽然同样采用?jin)Havok FX引擎Qƈ且都是双卡互联Ş式实玎ͼ但是两家的解x(chng)案却大相径庭QNVIDIA是通过DirectX API来实现物理加速,而AMD-ATI则是通过数据q行计算架构提取QData Parallel Processing Architecture Abstraction Q直接与Havok FX引擎交换数据Q让Havok FX引擎直接与GPU沟通,而不需要通过Direct3D和OpenGL APIQAMD-ATI著名的Close To Metal(CTM)接口是在这个时期提出的。简单的理解是QAMD-ATI的实现方式是“GPGPU”通用计算的Ş式来做物理运,而NVIDIA是让昑֍通过DirectX?#8220;GPU”的工作方式在做物理加速(其实也是GPGPU应用范畴Q?/font>
至于两种Ҏ(gu)的优劣其实讨v来真的没有意义,因ؓ(f)实际上除?jin)NVIDIA与AMD-ATI自家演示的小DEMO与视频之外,目前支持GPU物理加速的游戏几乎没有Q大部分使用到物理加速的游戏q都是用CPU物理加速的方式Q包括我们熟知顶U大作《Crysis》、《命召?Q现代战?sh)》等{?#8230;…
W?:(x)今天—PhysXx(chng)Havok FX |
当NVIDIA宣布CUDA集成PhysX物理引擎Ӟ很多人都?x)认为PhysX引擎只支持GPU物理加速技术,q也是AMD-ATI选择Havok FX引擎的主要原因。然而实际上PhysX引擎最初是只支持CPU与PPUQ而不支持GPUQ即使是融入CUDA之后QPhysX引擎也仍然支持CPU物理加速。之所以给人PhysX引擎只支持GPU物理加速的错觉Q是因ؓ(f)NVIDIA表示今后大力发展GPU物理加速,但这q不表示PhysX引擎排斥CPU或者CPU+GPU的解x(chng)案?/font>
无论是GPUq是CPU、PPU、CellQPS3Q都可以通过HAL译层来实现软、固质体动力(Soft or Rigid Body Dynamics)、通用撞侦测(Universal Collision Detection)、有限元素分?Finite Element Analysis)、流体动?Fluid Dynamics)、毛发模?Hair Simulation)以及(qing)更先q的布料模拟(Cloth Simulation)、自然模拟(Natural MotionQ等在内新颖技术?/font>
通过CUDA通用接口QPhysX引擎NVIDIA GPU中的Thread SchedulerQ线E管理器Q模拟成Control Engine(控制引擎CE)Q而Streaming Processors来模拟Vector Processing Engine(矢量处理引擎,VPE)Q其中CE控制引擎负责d的指z,相当于PhysX中的ȝ机构Q而真正的物理q算d则是由VPE矢量引擎来完成,最后通过Data Movement Engine(数据Ud引擎DME)输出。关于最新GT200物理q算的优势已l被NVIDIA吹的天花乱坠Q这里就不多介绍?jin),感兴的朋友参?a >《NVIDIA夺面双雄 GT200全球同步首测?/a>一文?/font>
而AMD-ATI则l选择Havok FX引擎Q不qRV770pd实现物理加速的Ҏ(gu)也已l不同于之前的CrossFire双卡解决Ҏ(gu)Q之前Radeon X1000pd是通过据ƈ行计架构提取直接与Havok FX引擎相连接(其实也可以通过Direct3D和OpenGL APIQ,然而由于对抗CUDA的原因,AMD-ATI也需要自qGPGPU规范Q而AMD-ATI则选择?jin)苹果公司力推的通用计算行业标准OpenCLQ它能与囑Şg?qing)多核CPU相协调以提高pȝ的整体性能Q而AMD-ATI的Havok物理加速技术就是基于CAL/Brook+的?/font>
实质上讲无论是CTM接口Q还是现在的CAL/Beook+QAMD-ATI执行物理加速的概念都没有变Q那是GPGPU的ƈ行能力进行物理运,而NVIDIA斚w可以真正U的上市(jng)GPGPU物理加速还是从CUDA开始的。另外我们也注意刎ͼ之前无论NVIDIAq是AMD-ATI在展Cq理运时都是Z双卡技术,而如今他们更愿意谈论单卡?/font>
W?:(x)明天—技术与现实之间的抉?/strong> |
那么物理加速技术的明天到底是Havok FX引擎q是PhysX引擎的天下?我们先来看一下双方的阵营QPhysX引擎目前只有NVIDIA一家支持,有消息称AMD-ATI目前也正在与NVIDIA商榷授权的问题,那么有可能AMD-ATI最l也支持PhysX引擎QHavok FX引擎目前已经得到AMD-ATI的支持,加上Havok的所有者IntelQ目前构成了(jin)Intel+AMD-ATIҎ(gu)NVIDIA的局面?/font>
物理加速阵营对?/strong>
|
|
||
支持引擎 | 加速态度 | ||
Intel
|
Havok
|
CPU
|
|
AMD-ATI
|
HavokQPhysX引擎正在商榷Q?/font>
|
CPU+GPU
|
|
NVIDIA
|
PhysX引擎
|
GPU
|
三方对于物理加速是由GPUq是由CPU执行的态度开已l阐明,实际上这场物理大战最l的抉择是落在?jin)到底是CPU加速还是GPU加速上Q我们先来看一下最单的物理加速计过E?font color=white size=-1>熊在线www.beareyes.com.cn
无论PhysX引擎q是Havok引擎物理计算都基于以下步骤:(x)
Integrate整合初步计算
Collide撞判定
Solve Collisions撞l果计算
在Integrate整合初步计算阶段Q进行物理对象的一些初始物理状态的初始化,包括速度、加速度{各信息,为后面的q算做准备。Collide 撞判定q行一些对象之间的撞(g),q以对的形式q行处理Q因为碰撞L两个物体怺的)(j)QSolve Collisions撞l果计算阶段则是对碰撞的后处理,包括撞后的速度{。Solve Collisions撞l果计算阶段是最复杂的,那么我们可以看出物理计算是一个对q行计算非常依赖的运?font color=white size=-1>熊在线www.beareyes.com.cn
Solve Collisions
我们看到Q物理运所需的大量ƈ行计正是GPU所具备的优势,利用GPU做物理运确实是天经C的事Q那么是不是说物理计目前就是该由GPU来负责呢Q在回答q个问题?sh)前我们先来看一下NVIDIA在近期发布的PhysX驱动Q搭配PhysX驱动在运?DMark Vantage CUP试W二个场景的时候,׃GPU接替Q或者说是加速)(j)物理q算Qɘq个场景成W暴增Q可以看出GPU取代CPU物理加速时的决定性优势,而在NVIDIA最新发布虚q?物理地图演示中,我们却可以看到如下的成WQ?/p>
1680×1050
2560×1600
GPUq行物理加速在q行很少使用到图形渲染的3DMark Vantage CPU试W二个场景,以及(qing)较低分L率下q行游戏ӞGPU物理加速确实效果o(h)人满意,但是随着分L率的增加QGPU物理加速在游戏中的表现׃在我们想象的那样完美Q对比CPU加速,有些场景甚至q有成W的下降!
q是游戏中GPU与CPU的关pd定的Q在游戏中,昑֍大多数时候都是在满负药行,q时Ҏ(gu)无暇分n做物理运!那么q时CPU在做什么?游戏是非抢占型程序,也就是说如果一般游戏不?x)全部榨qCPU性能Q所以我们在q行游戏时经常看到CPU的占用率q100%Q如果是4核CPU而游戏又不支持多核的话,那么q时CPU的性能在费Q?/p>
实际的情况已l很明了(jin)QGPU实非常做物理运,但是实际情况却是GPU?j)有余而力不Q利用目前闲|的CPU来做物理加速似乎是最好的选择Q而如果我们有两块昑֍的话也许p决了(jin)GPU自顾不暇的问题,q是不是让你惛_?jin)当初NVIDIA?qing)AMD-ATI都不U而同选择Havok FX物理加速的原因——一块显卡做囑Ş渲染Q一块显卡做物理加速!
今后物理的发展最l走向何方?也许?x)是GPU强大到做物理加速如现在的视频解码,也许是今后游戏l榨q显卡的性能Q由多核CPU闲暇来做物理计算Q也许是Fusion的CPU+GPU协同操作QMQ一切皆有可能,我们拭目以待……
我看?jin)不插值的Ҏ(gu)Q有的方法讲得莫名其妙,一个程序,一些系敎ͼZ么这个系数是1Q而不?.5从来不讲Q让人很怀疑其可用性?/p>
后来做刀光的时候,采集的刀光的点不够圆滑,需要用到插值——想惌q高数q没有完全忘光,q脆自己推导一个得?jin)?/p>
首先我们要明白什么叫做光滑的曲线Q可以这么认为,q个曲线是一个运动物体,在时间[0Q?]内运动的轨迹。而要求的光滑的曲U,是要求物体q动 q程中没有速度的突变。且要求不同的曲U段之间Q速度也不能有H变。据此,我们可以大约知道插gD|U,需要指导曲U其实点的位|和速度Q结束点的位|?和速度。由于有四个已知变量Q显?dng)用一个四ơ方E来描述q个曲线是再合适不q了(jin)?/p>
方程如下Q?/p>
f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]
对f(t)求导Q得到速度方程Q?/p>
f'(t) = 3 * a * t ^ 2 + 2 * b * t + c [0 <= t <= 1]
所?br>f(0) = d = x0(起始点位|?
f(1) = a + b + c + d = x1(l束点位|?
f'(0) = c = y0(起始炚w度)
f'(1) = 3 * a + 2 * b + c = y1(l束炚w度)
联合上面四个式子可解?/p>
a = 2 * x0 - 2 * x1 + y0 + y1
b = 3 * x1 - 3 * x0 - y1 - 2 * y0
c = y0
d = x0
再利?/p>
f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]
可以插D断曲U了(jin)
当然Q事情还没有完,通常情况下,我们得到的数据只有各个采L(fng)的位|,没有速度。这个时候,速度怎么办?我的解决办法是,在有3个采L(fng)的时?p0,p1,p2)Q计出p1采样点的速度Q另外,再假Nh间间隔是均匀的,因此Q?/font>
v1 = (p2 - p0) * 0.5
在有N个采L(fng)时候,Ҏ(gu)处理起始点和l束点的速度
v0 = p1 - p0;
vn = pn - p(n-1)
q样得到的曲U完全满_^滑的要求Q缺Ҏ(gu)Q曲U开始插值的时候要延迟一个采L(fng)的时_(d)有的时候,v0 速度很快Q因此,?x)出C条有~隙刀光。针对当前项目,我在W一ơ采L(fng)时候,时间稍微往后加?.001U,按照当前的运动趋势多采样?jin)一ơ,从而消 除了(jin)q个~隙。因为预的q动旉很短Q即佉K错误,也不影响刀光的外观?/font>
先说个题外话, 本来我想解答一下最qCreators Club论坛上经常出现的一个问? 意外的是在网上竟然找不到什么全面的{案..
q是个有着复杂{案的简单问?
当绘制一?D场景? 对图形进行深度排序是非常重要? q样镜头近才画在远处物体的前面. 我们不会(x)希望看到q处的山把近在眼前的建筑l挡住了(jin)!
如今有三U深度排序方法得C(jin)q泛的应?
不幸的是, 每种都有其局限? Z(jin)辑ֈ好的l果, 大多数游戏是把三U方法结合v来用的.
深度~冲单而有? l果也很完美. 但是对于透明的物体它?yu)无能?f)力了(jin)!
q是因ؓ(f)深度~冲只记录了(jin)当前已经l制的最q像? 对于不透明的物? q已l能够满x(chng)们的需要了(jin). 看一下这个绘制两个三角Ş的例? A和B:
如果我们先画B再画A, 深度~冲?x)看到新的像?A?比之前的(B?要近, 那么它就d?jin)前? 如果我们用相反的序?先A后B), 深度~冲?x)看到B的像素比之前A已经ȝ要远, 所以就把它们给丢弃掉了(jin). 无论哪种情况我们都会(x)得到正确的结? A在前? B隐藏在后?
但是当这些几何图形是透明? 即B透过A是部分可见的时会(x)怎样? 如果我们先画B再画A的话是没有问题的, 但反q来׃行了(jin). 在这U情况下, 深度~冲?x)从B取一个像? 同时注意到已l绘制了(jin)一个更q的像素(A?, 然后它就没辙? 唯一的选择是绘制B(q会(x)得到一个错误的l果, B?x)画在A前面, 但A的alpha 混合却没有v作用), 或者完全抛弃B. 不爽!
深度~冲对于不透明的物体是很完的, 但对于透明的物体却不实?
深度~冲没法应付?sh)错误的序来绘刉明物体的情? q很好解? 对吧? 保证它们按正的序l制可以了(jin)! 如果对场景中的所有物体进行排? 那我们就可以先画q处? 再画q处? q样可以确保前面例子中的B可以在A之前l制.
不幸的是, q说hҎ(gu)做v来难. 对物体进行排序在很多情况下ƈ不适用, 如A和B怺的情况该怎么?
如果A是个ȝ杯而B是它里面的一个玻璃球时就是这? 现在我们没法对它们q行排序? 因ؓ(f)A的一部分比Bq? 而另一部分又比Bq?
甚至我们不需要两个不同的物体来复现这个问? l成ȝ杯的那些三角形会(x)怎样? 要让它们昄正确, 需要在前面的绘制之前先l制后面? 所? 只对物体q行排序是不够的: 我们要对每一个三角Şq行排序.
问题? Ҏ(gu)个三角Şq行排序的代价太? q我们能够承受, q也不是在所有的场合下都能得到正的l果? 比如说两个透明的三角Ş怺时会(x)怎样?
没有Ҏ(gu)对这L(fng)三角形进行排? 因ؓ(f)我们需要把B的上半部分画在A的前? A的下半部分画在B的前? 唯一的解x(chng)案就是把三角形从怺处分割开? 但是q样的消耗是不可承受?
油画家算法需要你在选择排序的粒度好好权衡一? 如果你仅仅对一些大的的物体q行排序, 速度很快但不是很_; 如果你对一些小物体q行排序(包括三角形个体的极限情况), 速度?x)慢一? 但更加精?
一般不把背面剔除当成是一U排序技? 但它实是一U重要的Ҏ(gu). 它的局限性就是只适用于凸面体.
考虑一下一个简单的凔R? 如一个球体或立方? 无论你从哪个角度? 每个屏幕上的像素都会(x)被覆盖两? 一ơ是物体的前? 一ơ是后面. 如果你用背面剔除丢弃?jin)背面的三角? 那就只剩前面? 哈哈, 如果每个屏幕上的像素只进行一ơ判? 那你p动得C(jin)一个完的混合l果, 没有必要排序M东西.
当然, 大多数的游戏不会(x)只画球体或立方体J 所以只是背面剔除的话不是一个妥善的解决Ҏ(gu).
背面剔除对于凔R体是完美? 但是对于其它的就无能为力?
最常用的方?
q依赖于三种排序技术的l合
透明物体和不透明物体仍然?x)被深度~冲处理(所以你永远不会(x)通过一个不透明物体看到一个透明?
油画家算法对透明的物体排?两个透明物体怺时仍然会(x)有排序错?
依赖背面剔除来对单个透明物体上的三角形排?如果物体不是凔R体也?x)生错?
l果q不是非常完? 但是非常高效, 易于实现, 对于大多数游戏来说也够用?
当然q可以采取一些措施来改进排序的精度:
避免alpha混合! 你的不透明物体多, 排序pҎ(gu), 也越_. 仔细思考一? 真得每个地方都需要alpha混合? 如果兛_设计师要在玻璃窗上再加一? 那你应该考虑把设计改成更易于实现的方? 如果你正使用alpha混合来绘制树(wi)木之cȝ囑Ş, 那考虑用alpha试来代替它, 只分完全透明和完全不透明q两U情? q样不透明的地方仍然可以通过深度~冲来排?
放松, 不用担心(j). 可能排序错误q不是很严重? 你可以试着调整一下你的图?让alpha通道更加柔和, 更加透明一? 来让q个错误看v来没有那么显? q个Ҏ(gu)用在?jin)我们?Particle 3D sample? 它ƈ不会(x)对单独一个烟雾中的粒子进行排? 而是选择?jin)一个合适的_子U理让它看v来是好的. 如果你把烟雾的纹理换成更加不透明? 那排序错误可能就比较Ҏ(gu)觉察?
如果你有透明物体不是凔R? 或许你可以尝试让它们更加”?#8221;一? q它们不是完全地凸面体, 那它们越”?#8221;, 排序错误p? q有是考虑把复杂的模型分成多块, q样它们可以分开q行排序. 一个h体看h一点也不像凔R? 但你把它分成? 背, 驱干{几部分? 每一块都接近凔R体了(jin).
如果你有部分区域透明的纹?如树(wi)?, q且图案边缘包含?jin)一些半透明的像素用于反走样, 那你可以使用双pass渲染技?
Pass 1: l制不透明部分: alpha混合关闭, alpha试只接?00%不透明的区? 深度~冲开?
Pass 2: l制边缘: alpha混合开? alpha试讄只接受alpha<1? 深度~冲开? 深度写入关闭
?每个物体渲染两次的代? 为纹理中间完全不透明的部分提供了(jin)100%正确的深度缓冲排? 和相对精的半透明边缘排序. q个Ҏ(gu)为纹理裁剪的边缘q行?jin)一些反走样, 同时也保证了(jin)不用Ҏ(gu)一|(wi)或者草叶进行额外的排序. 在我们的 Billboard sample 中用了(jin)q个技? 请阅M下Billboard.fx中的pass和注?
使用 z prepass. 当你需要EZ个原来不透明的物体又不想透过它看到的是它自己的另一部分? q是一个好Ҏ(gu). 例如从右边看一个hcȝw体. 如果它是ȝ做的, 你应该会(x)希望透过x(chng)臂看到躯q和左手? 但如果它是实?j)?不透明)你会(x)希望透过x(chng)臂看到后面的背景, 而不应该是躯q和左手? 要达到这个目标需要这样做:
讄 ColorWriteChannels=None, 开启深度缓?
l制物体到深度缓?不媄(jing)响颜色缓?
讄ColorWriteChannels=All, DepthBufferFunction=Equal, 开启alpha混合
再次l制q个物体, q样只有最q的q一面与颜色~冲q行混合?
Published Wednesday, February 18, 2009 1:47 PM by ShawnHargreaves