﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-芳草春晖-文章分类-图形技术</title><link>http://www.cppblog.com/CrazyDev/category/13652.html</link><description>偶尔记录自己思绪的地方...</description><language>zh-cn</language><lastBuildDate>Sun, 09 May 2010 04:30:16 GMT</lastBuildDate><pubDate>Sun, 09 May 2010 04:30:16 GMT</pubDate><ttl>60</ttl><item><title>浅析DirectX11技术带给图形业界的改变(二) </title><link>http://www.cppblog.com/CrazyDev/articles/114710.html</link><dc:creator>CrazyDev</dc:creator><author>CrazyDev</author><pubDate>Thu, 06 May 2010 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/CrazyDev/articles/114710.html</guid><wfw:comment>http://www.cppblog.com/CrazyDev/comments/114710.html</wfw:comment><comments>http://www.cppblog.com/CrazyDev/articles/114710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CrazyDev/comments/commentRss/114710.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CrazyDev/services/trackbacks/114710.html</trackback:ping><description><![CDATA[<p><strong>&nbsp;&nbsp;&nbsp; ● Compute Shader与Texture Compression</strong></p>
<p>&nbsp;&nbsp;&nbsp; GPU是图形处理器，以往的GPU通用计算需要程序员先将资料伪装成GPU可识别的图像，再将GPU输出的图像转换为想要的结果，而通过DX11中的Compute Shader通用计算，任意类型的数据（即使是非图形数据）都可以直接进行计算，而且不受图形渲染流程的束缚，可以随时写入写出，GPU通用计算的效能提高了很多。</p>
<p>&nbsp;&nbsp;&nbsp; 由于GPU的浮点运算能力非常强大，支持GPU进行通用计算的技术发展势头很快，NVIDIA和AMD分别有CUDA和Stream技术，以前两家是各自为战，如今微软也看到了GPU通用计算的曙光，在DX11中加入了Compute Shader这一技术，意在统一当前的通用计算技术。你可以认为Compute Shader标准就是微软提出的OPEN CL。</p>
<p>&nbsp;&nbsp;&nbsp; Compute Shader技术是微软DirectX 11 API新加入的特性，在Compute Shader的帮助下，程序员可直接将GPU作为并行处理器加以利用，GPU将不仅具有3D渲染能力，也具有其他的运算能力，也就是我们说的GPGPU的概念和物理加速运算。多线程处理技术使游戏更好地利用系统的多个核心。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4517851.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/851/ceypKiUdElfc.png"></a><br>Compute Shader图形流水线</p>
<p>&nbsp;&nbsp;&nbsp; Compute Shader主要特性包括线程间数据通信、一整套随机访问和流式I/O操作基本单元等，能加快和简化图像和后期处理效果等已有技术，也为DX11级硬件的新技术做好了准备，对于游戏和应用程序开发有着很重大的意义。 </p>
<p>&nbsp;&nbsp;&nbsp; 在DirectX 11以及CS的帮助下，游戏开发者便可以越过复杂的数据结构，并在这些数据结构中运行更多的通用算法。与其他完整的可编程的DX10和DX11管线阶段一样，CS将会共享一套物质资源（也就是着色处理器）。</p>
<p>&nbsp;&nbsp;&nbsp; 在硬件支持Compute Shader之后，相应的硬件必须要比当代硬件更加灵活，因为在运行CS代码的时候，硬件必须支持随机读写、不规则列阵（而不是简单的流体或者固定大小的2D列阵）、多重输出、可根据程序员的需要直接调用个别或多个线程、32k大小的共享寄存空间和线程组管理系统、粒数据指令集、同步建构以及可执行无序IO运算的能力。</p>
<p>&nbsp;&nbsp;&nbsp; Compute Shader可发挥的地方很多，游戏中可以使用GPU进行光线追踪、A-Buffer采样抗锯齿、物理特效、人工智能AI等游戏特效运算。在游戏之外，程序员也可以利用CS架构进行图像处理、后期处理（Post Process）等。</p>
<p>&nbsp;&nbsp;&nbsp; Texture Compression（纹理压缩）是一种和虚拟纹理类似的纹理管理方法，在很多情况下具有6倍以上压缩比例的纹理压缩都可以极其有效地减小纹理本身的大小，从而避免纹理传输和管理方面的瓶颈，并且可以获得更加精细的画面，由此看来其效率比虚拟纹理要高。</p>
<p>&nbsp;&nbsp;&nbsp; DirectX 11加入了两种新的压缩算法——BC6和BC7。其中，BC6是专门针对HDR图像设计的压缩算法，压缩比为6：1；而BC7是专门为LDR（低动态范围）图像设计的压缩算法，压缩比为3：1。 </p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4517852.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/852/ceGJmY9A76VQ.png"></a></p>
<p align=left>&nbsp;&nbsp;&nbsp; 上图则是BC7针对LDR纹理的压缩与传统的BC3纹理压缩对比。可以看出传统的BC3纹理压缩损失了大量的纹理细节，压缩之后的效果也很不好。而采用BC7算法压缩后的纹理，丢失的细节很少，效果也非常好，这就是改进纹理压缩的魅力。</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4517854.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2e.zol-img.com.cn/product/45_500x2000/854/ceane9q2LuI6U.png"></a></p>
<p>&nbsp;&nbsp;&nbsp; 上图展示的是图像通过BC6压缩模式进行压缩的前后效果对比图。其中左边的图像为原始图像，中间的是在压缩过程中损失的一些细节，而右边的就是压缩后的图像。可以看出，从画质上来看几乎没有损失（肉眼看不出），但是却可以大幅度降低显存的占用。</p>
<p><strong>&nbsp;&nbsp;&nbsp; ● 着色器模型变化历程与总结</strong></p>
<p>&nbsp;&nbsp;&nbsp; 在图形渲染中，GPU中的可编程计算单元被称为着色器（Shader），着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可编程单元式顶点着色器和像素着色器。</p>
<p>&nbsp;&nbsp;&nbsp; 为了实现更细腻逼真的画质，GPU的体系架构从最早的固定单元流水线到可编程流水线，到DirectX 8初步具备可编程性，再到DirectX 10时代的以通用的可编程计算单元为主、图形固定单元为辅的形式，最新的DirectX 11更是明确提出通用计算API Direct Compute概念，鼓励开发人员和用户更好地将GPU作为并行处理器使用。在这一过程中，着色器的可编程性也随着架构的发展不断提高，下表给出的是每代模型的大概特点。</p>
<p>&nbsp;&nbsp;&nbsp; 表：Shader Model版本演化与特点</p>
<p align=center sizcache="3" sizset="128"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all>
<table style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-COLLAPSE: collapse; BORDER-TOP: medium none; BORDER-RIGHT: medium none" class=MsoTableGrid border=1 cellSpacing=0 cellPadding=0 width=516 sizcache="3" sizset="128">
    <tbody sizcache="3" sizset="128">
        <tr style="HEIGHT: 30.35pt" sizcache="3" sizset="128">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 30.35pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>Shader Model</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 30.35pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top>
            <p class=MsoNormal><strong><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>GPU</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">代表</span></strong></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 30.35pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top sizcache="3" sizset="128">
            <p class=MsoNormal sizcache="3" sizset="128"><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" sizcache="3" sizset="128"><a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>时代</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 30.35pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700">特点</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 53.15pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 51px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US></span>&nbsp;</p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 51px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>1999</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年第一代</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV Geforce256</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 51px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 7</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>1999~2001</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 51px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>GPU</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">可以处理顶点的矩阵变换和进行光照计算（</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>T&amp;L</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">），操作固定，功能单一，不具备可编程性</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 46.8pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 67px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>SM 1.0</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 67px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2001</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年第二代</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV Geforce3</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 67px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 8</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 67px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">将图形硬件流水线作为流处理器来解释，顶点部分出现可编程性，像素部分可编程性有限（访问纹理的方式和格式受限，不支持浮点）</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 60pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 100px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>SM 2.0</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 100px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2003 </span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>ATI R300</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">和第三代</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV Geforce FX</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 100px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 9.0b</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 100px; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">顶点和像素可编程性更通用化，像素部分支持</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>FP16/24/32</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">浮点，可包含上千条指令，处理纹理更加灵活：可用索引进行查找，也不再限制</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>[0,1]</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">范围，从而可用作任意数组（这一点对通用计算很重要）</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 33.75pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 33.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>SM 3.0</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 33.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2004</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">第四代</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV Geforce 6</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">和</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US> ATI X1000</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 33.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 9.0c</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 33.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">顶点程序可以访问纹理</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>VTF</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">，支持动态分支操作，像素程序开始支持分支操作（包括循环、</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>if/else</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">等），支持函数调用，</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>64</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">位浮点纹理滤波和融合，多个绘制目标</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 48.75pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 48.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>SM 4.0</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 48.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2007</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">第五代</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV G80</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">和</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>ATI R600</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 48.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 10</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2007~2009</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 48.75pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">统一渲染架构，支持</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>IEEE754</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">浮点标准，引入</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>Geometry Shader</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">（可批量进行几何处理），指令数从</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>1K</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">提升至</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>64K</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">，寄存器从</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>32</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">个增加到</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>4096</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">个，纹理规模从</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>16+4</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">个提升到</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>128</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">个，材质</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>Texture</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">格式变为硬件支持的</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>RGBE</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">格式，最高纹理分辨率从</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2048*2048</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">提升至</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>8192*8192</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 45pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; TEXT-ALIGN: center; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 77.4pt; PADDING-RIGHT: 5.4pt; HEIGHT: 45pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" bgColor=#c0c0c0 vAlign=top width=103>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt; FONT-WEIGHT: 700" lang=EN-US>SM 5.0</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 80px; PADDING-RIGHT: 5.4pt; HEIGHT: 45pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2009</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>ATI RV870</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">和</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2010</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">年</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>NV GF100</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 66px; PADDING-RIGHT: 5.4pt; HEIGHT: 45pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>DirectX 11</span></p>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>2009~</span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 206px; PADDING-RIGHT: 5.4pt; HEIGHT: 45pt; BORDER-TOP: medium none; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" vAlign=top>
            <p class=MsoNormal><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">明确提出通用计算</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>API Direct Compute</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">概念和</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>Open CL</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">分庭抗衡，以更小的性能衰减支持</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>IEEE754</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">的</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>64</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">位双精度浮点标准，硬件</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>Tessellation</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt">单元，更好地利用多线程资源加速多个</span><span style="FONT-FAMILY: Century; FONT-SIZE: 10pt" lang=EN-US>GPU</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p align=left>&nbsp;&nbsp;&nbsp; 传统的分离架构中，两种着色器的比例往往是固定的。在GPU核心设计完成时，各种着色器的数量便确定下来，比如著名的&#8220;黄金比例&#8221;——顶点着色器与像素着色器的数量比例为1：3。但不同的游戏对顶点资源和像素资源的计算能力要求是不同的。如果场景中有大量的小三角形，则顶点着色器必须满负荷工作，而像素着色器则会被闲置；如果场景中有少量的大三角形，又会发生相反的情况。因此，固定比例的设计无法完全发挥GPU中所有计算单元的性能。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 顶点着色单元（Vertex Shader，VS）和像素着色单元（Pixel Shader，PS）两种着色器的架构既有相同之处，又有一些不同。两者处理的都是四元组数据（顶点着色器处理用于表示坐标的w、x、y、z，但像素着色器处理用于表示颜色的a、r、g、b），顶点渲染需要比较高的计算精度；而像素渲染则可以使用较低的精度，从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前，两种着色器的精度都在不断提高，但同期顶点着色器的精度要高于像素着色器。</p>
<p align=left>&nbsp;&nbsp;&nbsp; Shader Model 4.0统一了两种着色器，所以顶顶点和像素着色器的规格要求完全相同，都支持32位浮点数。这是GPU发展的一个分水岭；过去只能处理顶点和只能处理像素的专门处理单元被统一之后，更加适应通用计算的需求。</p>
<p align=left>&nbsp;&nbsp;&nbsp; DirectX 11提出的Shader Model 5.0版本继续强化了通用计算的地位，微软提出的全新API——Direct Compute将把GPU通用计算推向新的巅峰。同时Shader Model 5.0是完全针对流处理器而设定的，所有类型的着色器，如：像素、顶点、几何、计算、Hull和Domaim（位于Tessellator前后）都将从新指令集中获益。</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4517911.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/911/ceISCxgeiPqr6.png"></a><br>GPU执行FFT性能将在未来迅速提升</p>
<p align=left>&nbsp;&nbsp;&nbsp; 如图，快速傅里叶变换（Fast Fourier Transform，FFT）有广泛的应用，如数字信号处理、计算大整数乘法、求解偏微分方程等等。SIGGRAPH2008峰会认为未来随着Compute Shader和新硬件、新算法的加入，GPU执行FFT操作的性能将得到快速提升。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 如果使用DirectX 11中的Computer Shader技术，API将能借助GPU充裕的浮点计算能力进行加速计算，则能轻易完成大量的FFT（傅里叶变换）。在图形渲染中，这项技术的运用极大地提高了波浪生成速度，而且画面质量也更好。</p>
<p align=left sizcache="3" sizset="130">&nbsp;&nbsp;&nbsp; 以往受限于浮点运算性能，目前<a class=hui14_line href="http://detail.zol.com.cn/cpu_xilie_index/subcate468_list_1.html"><font style="COLOR: #333"><u>CPU</u></font></a>进行FFT变换只能局限在非常小的区域内，比如64x64，高端CPU最多能达到128x128，而GTX 280则能实现每帧512x512的傅里叶变换，所用时间不过2ms，效能非常高。</p>
&nbsp;&nbsp; DirectX11最为强调的图形特性就是Tessellation（曲面细分）。Tessellation技术利用GPU硬件加速，将现有3D模型的三角形拆分得更细小、更细致，也就是大大增加三角形数量，使得渲染对象的表面和边缘更平滑、更精细。<font face=Arial sizcache="3" sizset="128">
<p align=left><font face=Arial><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● Tesslation测试-Stone Giant</strong></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《Stone Giant》是一个针对DirectX 11 Tessellation效能十分依赖的Demo，本次笔者将用其作为检验产品Tessellation性能的工具。</p>
</font>
<p align=left sizcache="3" sizset="128">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下对比图左侧为Geforce <a class=hui14_line href="http://detail.zol.com.cn/vga/index235721.shtml"><font style="COLOR: #333"><u>GTX480</u></font></a>，右侧为Radeon HD 5870。</p>
<font face=Arial sizcache="3" sizset="129">
<p align=left><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● NO Tessellation + NO Wireframe</strong></p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_433/index4329957.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2d.zol-img.com.cn/product/43_240x180/957/cevcZXRK5PsLM.jpg"></a><strong sizcache="3" sizset="130">&nbsp;&nbsp;&nbsp; <a href="http://detail.zol.com.cn/picture_index_433/index4329962.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2c.zol-img.com.cn/product/43_240x180/962/ceFCmGY2CIGhA.jpg"></a></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● NO Tessellation + Wireframe</strong></p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_433/index4329959.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2f.zol-img.com.cn/product/43_240x180/959/ceR2ny9HYsHw.jpg"></a>&nbsp;&nbsp;&nbsp; <a href="http://detail.zol.com.cn/picture_index_433/index4329964.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2e.zol-img.com.cn/product/43_240x180/964/ceMhvwSAu7SpE.jpg"></a></p>
<p align=left><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● Tessellation + NO Wireframe</strong></p>
<p align=center sizcache="3" sizset="133"><a href="http://detail.zol.com.cn/picture_index_433/index4329958.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2e.zol-img.com.cn/product/43_240x180/958/ceqxVca5dUGro.jpg"></a>&nbsp;&nbsp;&nbsp; <a href="http://detail.zol.com.cn/picture_index_433/index4329961.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2b.zol-img.com.cn/product/43_240x180/961/ce8Wrn8NleLmg.jpg"></a></p>
<p align=left><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● Tessellation + Wireframe</strong></p>
<p align=center sizcache="3" sizset="135"><a href="http://detail.zol.com.cn/picture_index_433/index4329960.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2a.zol-img.com.cn/product/43_240x180/960/cexAWZ6W6NWW2.jpg"></a>&nbsp;&nbsp;&nbsp; <a href="http://detail.zol.com.cn/picture_index_433/index4329963.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="领先A卡强项达50% 卡皇GTX480全球首测 " align=no src="http://2d.zol-img.com.cn/product/43_240x180/963/ceDXwknYqVsdQ.jpg"></a><br></p>
<p align=center sizcache="3" sizset="137"><a href="http://detail.zol.com.cn/picture_index_452/index4518064.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2e.zol-img.com.cn/product/45_500x2000/64/ceTP8YejuguLU.png"></a><br><br><br></p>
<p align=center sizcache="3" sizset="138"><a href="http://detail.zol.com.cn/picture_index_452/index4518065.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/65/ceiA4e1RgEYDE.png"></a></p>
<p align=left><strong>&nbsp;&nbsp;&nbsp; ● Direct X11 SDK Test：Sub D11</strong></p>
<p align=left sizcache="3" sizset="128">&nbsp;&nbsp;&nbsp; Direct X11 SDK Test：Sub D11是集成在微软的DirectX SDK开发包中的测试组件之一，它主要测试GPU的Tessellation性能。这个测试一共包含31个层级，从第一级的轻度曲面细分到31级重度曲目细分，对<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>的几何处理能力考验不断升级。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 我们为了对NVIDIA和AMD公平起见，选择了Factor=1/16/31，这三个级别的测试曲面数量很有可能在未来作为图形开发者的重要参考标准。</p>
<font face=Arial sizcache="3" sizset="129">
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_445/index4449289.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="HD5850新对手 翔升金刚GTX470性能揭秘 " align=no src="http://2b.zol-img.com.cn/product/44_500x2000/289/ceycuZcsw0KB6.png"></a></p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4518082.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2e.zol-img.com.cn/product/45_500x2000/82/cepTDnR7jewzc.png"></a><br></p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4518083.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/83/ceaOHR9TKpkvs.png"></a><br></p>
<p align=center sizcache="3" sizset="132"><a href="http://detail.zol.com.cn/picture_index_452/index4518084.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2a.zol-img.com.cn/product/45_500x2000/84/ceebukTpyH1v6.png"></a><br></p>
</font>
<p align=left sizcache="3" sizset="133">&nbsp;&nbsp;&nbsp; 我们能够看到一个很明显的性能变化，在曲面细分压力不大的情况下，HD5870有接近于Fermi架构<a class=hui14_line href="http://detail.zol.com.cn/vga/index235721.shtml"><font style="COLOR: #333"><u>GTX480</u></font></a>的表现，<a class=hui14_line href="http://detail.zol.com.cn/vga/index236466.shtml"><font style="COLOR: #333"><u>HD5970</u></font></a>则能够超越GTX480。而在曲面细分压力变大之后，A卡出现了非常严重的性能下降，毕竟R800架构的一个曲面细分单元无法对抗NVIDIA在Fermi架构中给每个SM单元分配一个曲面细分单元。</p>
<p align=left><strong>&nbsp;&nbsp;&nbsp; ● DX11 SDK Test：PN Triangle</strong></p>
<p>&nbsp;&nbsp;&nbsp; PN Triangle和上一个Sub D11测试有异曲同工之处，它们都着重测试GPU的曲面细分性能。这个SDK测试程序是在微软发布DirectX 11初期由AMD提供的。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4518149.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/149/cenewBCSlq7kY.png"></a></p>
<p>&nbsp;&nbsp;&nbsp; 因为它同样也有曲面层级设置，所以我们选取了负载较轻的5和负载较重的19进行测试。结果如下：</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4518117.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/117/ceXOVY41n3dm2.png"></a><br><br><br><a href="http://detail.zol.com.cn/picture_index_452/index4518119.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/119/ceenkNgHIyMi2.png"></a></p>
<p align=left>&nbsp;&nbsp;&nbsp; PN Triangle的测试结果和Sub D11非常相似，毕竟两者的测试目的相同。但是我们需要清楚知道的一点是我们所作的都是理论性能测试，而且是有很强侧重性的。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 在图形运算中不可能有完全纯净的Tessellation环境和极大的Tessellation负载。所以我们不可能看到在DirectX 11游戏中出现A卡因为开启了DirectX 11支持的Tessellation功能之后性能大幅度下降。</p>
<p align=left><strong>&nbsp;&nbsp;&nbsp; ● DX11 SDK Test：Detail Tessellation （1）</strong></p>
<p align=left>&nbsp;&nbsp;&nbsp; Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准测试程序，它提供了Bump Mapping、Parallax Occlusion Mapping和Tessellation三种主渲染模式，同时使用者可以在这3种模式之上添加其他附加效果，以达到较为复杂的Shader效果。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4518171.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/171/ceucq3AQCGlY.png"></a></p>
<p align=left sizcache="3" sizset="129">&nbsp;&nbsp;&nbsp; 这个测试中只要涉及置换位移贴图和传统的凹凸类贴图，都会有大量的VS指令，而VS指令天生就是4D指令，因此R800的4D+1D组织SIMD结构流处理器会表现出较强的性能。而NVIDIA<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>的主要看点则在曲面细分性能上。越复杂的Shader效果对着色器性能要求越高。</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4518188.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/188/ce2LyuMLb2rw.png"></a><br></p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4518189.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/189/ceUCMk0urNjU.png"></a><br></p>
<p align=center sizcache="3" sizset="132"><a href="http://detail.zol.com.cn/picture_index_452/index4518190.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2e.zol-img.com.cn/product/45_500x2000/190/cevCHj68CzDQA.png"></a></p>
&nbsp;&nbsp;&nbsp; Detail Tessellation虽然同样侧重曲面细分能力，但是它添加了大量其他贴图效果，像我们熟知的置换位移贴图和传统的凹凸类贴图都会在这项测试中找到。这项测试已经逐渐接近真实使用环境，同时大量的VS指令也让4D+1D组织SIMD结构流处理器找到了爆发理论值的用武之地。&nbsp;<br><strong>&nbsp;&nbsp; ● DX11 SDK Test：Detail Tessellation （2）</strong>
<p align=left>&nbsp;&nbsp;&nbsp; Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准测试程序，它提供了Bump Mapping、Parallax Occlusion Mapping和Tessellation三种主渲染模式，同时使用者可以在这3种模式之上添加其他附加效果，以达到较为复杂的Shader效果。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4518171.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/171/ceucq3AQCGlY.png"></a></p>
<p align=left sizcache="3" sizset="129">&nbsp;&nbsp;&nbsp; Adaptive Tessellation技术一样会通过调节VS来细化曲面结构，跟单纯的设置顶点碎多边形的Tessellation技术来说不一样。我们发现这方面AMD<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>表现较为优秀，比起单纯的Tessellation技术来说性能衰减要小很多。</p>
<p align=left sizcache="3" sizset="130">&nbsp;&nbsp;&nbsp; 而Tessellation Ultra对曲面细分单元较为缺乏的A卡来说，性能下降非常迅速，毕竟Fermi架构的GF100完整版拥有16个曲面细分单元，而AMD的R800架构只是在UTDP指令<a class=hui14_line href="http://detail.zol.com.cn/distributor_index/subcate575_list_1.html"><font style="COLOR: #333"><u>分配器</u></font></a>中装配了一个曲面细分单元以达到微软DirectX 11的硬件要求，所以性能较弱理所应当。</p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4518191.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/191/ceVYr3DiksR2.png"></a><br></p>
<p align=center sizcache="3" sizset="132"><a href="http://detail.zol.com.cn/picture_index_452/index4518192.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2a.zol-img.com.cn/product/45_500x2000/192/cemMmO9M9162.png"></a><br></p>
<p align=center sizcache="3" sizset="133"><a href="http://detail.zol.com.cn/picture_index_452/index4518193.shtml"><img style="BORDER-BOTTOM: black 0px solid; BORDER-LEFT: black 0px solid; BORDER-TOP: black 0px solid; BORDER-RIGHT: black 0px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/193/cejMjvHmL7ms.png"></a></p>
<p align=left sizcache="3" sizset="134">&nbsp;&nbsp;&nbsp; 鉴于这项测试对单卡双芯<a class=hui14_line href="http://detail.zol.com.cn/vga/index236466.shtml"><font style="COLOR: #333"><u>HD5970</u></font></a>显卡没有提供良好支持，我们在Detail Tessellation测试中忽略了这款显卡的成绩。我们可以从测试中看到，在Shader效果较为简单的前几项测试中，AMD和NVIDAI的最新架构显卡并没有太大分别，而在越来越复杂的Shader效果中，全新设计的Fermi架构显卡体现出了比较强劲的运算能力。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 在4月下旬，中关村在线显卡频道已经对DirectX 11现有的大部分游戏进行了横向评测，而今天这篇文章的目的，就是让大家更加深入地了解DirectX 11这套全新的API将如何从图形图像的渲染方面改变我们的&#8220;视界&#8221;。</p>
<p align=left>&nbsp;&nbsp;&nbsp; 目前Fermi架构的Geforce GTX400系列显卡刚上市不久，整个DirectX 11周边配合程序还没有完善，用户方便执行的、可用于单项性能测试的也只有屈指可数的Techdemo和SDK开发包内的程序，而且它们的测试方向几乎都指向了Tessellation技术。相信在未来的一段时间内，我们可以运用更好的软件来了解DirectX 11显卡的各项技术特性。</p>
</font></font>
<img src ="http://www.cppblog.com/CrazyDev/aggbug/114710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CrazyDev/" target="_blank">CrazyDev</a> 2010-05-06 22:45 <a href="http://www.cppblog.com/CrazyDev/articles/114710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析DirectX11技术带给图形业界的改变(一)</title><link>http://www.cppblog.com/CrazyDev/articles/114706.html</link><dc:creator>CrazyDev</dc:creator><author>CrazyDev</author><pubDate>Thu, 06 May 2010 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/CrazyDev/articles/114706.html</guid><wfw:comment>http://www.cppblog.com/CrazyDev/comments/114706.html</wfw:comment><comments>http://www.cppblog.com/CrazyDev/articles/114706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CrazyDev/comments/commentRss/114706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CrazyDev/services/trackbacks/114706.html</trackback:ping><description><![CDATA[浅析DirectX11技术带给图形业界的改变<br>
<p sizcache="3" sizset="128">前言：2009年10月23日，微软高调发布了其最新一代<a href="http://detail.zol.com.cn/os_index/subcate121_list_1.html">操作系统</a>——Windows7，这款操作系统相对于之前的Vista系统有相当大的进步，特别核心执行效率方面得到显著改善，并且加入了DirectX 11等新技术。微软此次推出全新图形API——DirectX 11目的很明确，就是能够充分利用<a href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html">显卡</a>资源，旨在游戏以及通用计算方面达到更高的执行效率。今天本文就带大家一起分析DirectX 11技术带给图形业界和游戏玩家的双重体验。同时也让更多人了解到自己是否需要一款支持DirectX 11的显卡，具体选择哪些显卡最为合适。</p>
<br>
<div align=center><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/440/ceA1aKjSKok.png"></div>
<br>
<p>&nbsp;&nbsp;&nbsp; ● DirectX对GPU发展带来的影响</p>
<p>&nbsp;&nbsp;&nbsp; DirectX并不是一个单纯的图形API，它是由微软公司开发的用途广泛的API，它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件，它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现，让它的其它几个组件几乎被人们忽略。</p>
<p>&nbsp;&nbsp;&nbsp; Direct Graphics的优秀表现和微软的影响力，令无数硬件厂商生畏并不断遵循其变化来开发新的图形处理器架构。同时ATI和NVIDIA两家厂商之所以至今仍不断跟随DirectX的步伐，是意识到任何游戏相关的硬件厂商要是被微软抛弃，那么其后果是不堪设想的。</p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4516779.shtml"><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/779/ceL8l4psPtWk2.png"></a><br>大家都在畅想DirectX技术的未来</p>
<p>&nbsp;&nbsp;&nbsp; 在过去的数次DirectX更替中，有几次较大的更新，比如我们熟知的从DirectX 7到DirectX 8到DirectX 9到再DirectX 10，也是因为这样的理由使得芯片变得更大。在向DirectX 8的转移使得可编程的硬件进入管线成为了双重构造。对于DirectX 9的顶点处理与像素处理，则被真正的可编程处理器调换。而在向DirectX 10的转移为了实现更灵活的可编程性，需要GPU架构进行根本的改革。</p>
<p>&nbsp;&nbsp;&nbsp; 所以哪个世代的改变以及生产什么样的GPU都关乎根本性的改革，而这种改革基本上都是围绕DirectX这个最重要的图形API来进行的。特别是DirectX 10时代架构的改革，从根本上改变了GPU的本质。从DirectX 8向DirectX 9通过API的改革牵动了GPU架构的改革，而架构巨大变化的转折点则是DirectX 10。</p>
<p align=center sizcache="3" sizset="132"><a href="http://detail.zol.com.cn/picture_index_452/index4516787.shtml"><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/787/cevgNB9x4j1I.jpg"></a><br>DirectX 10时代 着色器单元走向统一</p>
<p>&nbsp;&nbsp;&nbsp; 在DirectX 10时代，我们非常有幸看到了Pixel Shader（顶点着色器）、Vertex Shader（像素着色器）和Geometry Shader（几何着色器），三种具体的硬件逻辑被整合为一个全功能的着色器Shader。但是我们也发现，GPU在性能提升的同时，芯片规模发生了更快速的放大，这不得不让人担心未来GPU的功耗和发热等等问题。</p>
<p>&nbsp;&nbsp;&nbsp; 事实上芯片变大有两个主要原因。一个是因为性能的增加。要提高运算性能就会需要更多的资源，这会增加晶体管的数量。另一个就是为了发展可编程化。需要让单一的可编程处理器包括个别进行处理的固定功能硬件，这必然也会增加晶体管数量。可是这样会让性能出现大幅度下滑，因此为了保持同样的性能也需要大幅度增加运算资源。结果就是对于GPU的情况需要从固定硬用向可编程硬件转换，晶体管数和核心尺寸也因此而增加。</p>
<p>&nbsp;&nbsp;&nbsp; 直到今天我们看到的DirectX 11出现，这个问题得到了一个平衡的解决方案。DirectX 10带来了众多绚丽无比的新特效，但&#8220;滥用&#8221;各种特效最终导致GPU不堪重负。在DirectX 10经历了种种波折，瓶颈尽显时，微软也开始将重心集中在如何提升算法和效率上面，而不是一味的加入新特效或提高模型复杂度。因此我们看到的DirectX 11，已经将技术重心放在如何用最小的硬件开销在先进图形技术的辅助下实现最佳的渲染效果。<br></p>
<p>&nbsp;&nbsp;&nbsp; ● DirectX 11带来的全新特性</p>
<p>&nbsp;&nbsp;&nbsp; DirectX 11作为一套全新的图形API，提供给图形开发者和用户极大的想象空间，同时降低了开发难度，节省硬件资源，特别是后两个特点，是DirectX 11区别与以往的DirectX最为显著的特点。</p>
<p sizcache="3" sizset="128">&nbsp;&nbsp;&nbsp; 2009年NVISION大会上，微软就透漏了DirectX 11的大量细节，此时DirectX 11已经完全成熟并获得硬件厂商支持，就等和Win7<a href="http://detail.zol.com.cn/os_index/subcate121_list_1.html">操作系统</a>一同上市了。同时借助SIGGRAPH以及GameFest 2008大会上放出的幻灯片，我们可以进行一些深入的研究。此外，DX11特性的提前放出，对于目前DX10以及DX10.1硬件用户而言也很有帮助，因为AMD和NVIDIA可以照此提前开发适当的驱动支持。</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4516836.shtml"><br clear=all><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2a.zol-img.com.cn/product/45_500x2000/836/cerhyJraiusoc.png"></a><br>2008年度NVISION资料截图</p>
<p>&nbsp;&nbsp;&nbsp; 回顾历次DirectX的更替过程，几乎都对GPU架构产生了颠覆性的影响，它们大部分要求GPU改变现有的着色器Shader单元结构，或者为着色器Shader单元追加资源，这些改进都是为了让GPU的指令数提升，寄存器数量增加，纹理规模提升，材质Texture精度提升。这样的改进难免带来晶体管数量的增长，也就说说GPU内部的每个着色器Shader单元变得更加庞大。</p>
<p>&nbsp;&nbsp;&nbsp; DirectX 11发布后，人们发现微软并没有在Shader Model方面做出重要提升，虽然版本升至Shader Model 5.0，但是更重要的是它实际上可以被看作是DirectX 10和DirectX 10.1的功能补全，你也可以认为它是DirectX 10和DirectX 10.1的超集，如果换个角度大胆设想，我们今天看到的DirectX 11才是微软想要的DirectX 10完美形态。</p>
<p>&nbsp;&nbsp;&nbsp; DirectX 11针对不同方面带来了全新的特性，目前通过现有资料分析，它主要有以下几个方面的提升：</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4516843.shtml"><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/843/ce255tN0KOgN2.jpg"></a><br>DirectX 11带来的全新特性</p>
<p>&nbsp;&nbsp;&nbsp; ● 着色器版本提升到Shader Model 5.0，采用面向对象的概念，并且完全可以支持双精度数据。<br>&nbsp;&nbsp;&nbsp; ● Tessellation曲面细分技术获得微软正式支持，逐渐走向成熟；<br>&nbsp;&nbsp;&nbsp; ● Multithreading多线程处理，让图形处理面对多线程编程环境不再尴尬；<br>&nbsp;&nbsp;&nbsp; ● 提出微软自己的Compute Shader通用计算概念，把GPU通用计算推向新的巅峰；<br>&nbsp;&nbsp;&nbsp; ● 新的Texture Compression纹理压缩方案，在画质损失极小的环境下带来了硬件资源的节约。</p>
<p>&nbsp;&nbsp;&nbsp; 在今天的分析中，我们将重点放在Tessellation曲面细分技术方面，因为这是DirectX 11最为突出的特色之一，也是给图形运算产生深远影响的一项技术，DirectX 11的其他特点我们也会提及。<br></p>
<p>&nbsp;&nbsp;&nbsp; ● Tessellation技术简析</p>
<p sizcache="3" sizset="128">&nbsp;&nbsp;&nbsp; Tessellation又可译作拆嵌式细分曲面技术。其实这是ATI早在其第一代DirectX 10图形核心R600，即HD2900XT上就引入的一个特殊的计算模块。从HD2000系列开始，直到最新的HD5000系列，整整4代<a href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html">显卡</a>全部支持这一技术。即使目前也仍然没有游戏能够支持这一技术，ATI也依然没有放弃在这项技术上的努力——从名字上也可以看出ATI在这项技术上的心血：Tessell-ATI-on。</p>
<p>&nbsp;&nbsp;&nbsp; Tessellation主要是靠GPU内部的一个模块Programmable Tessellator（可编程拆嵌器）来实现的。能够根据3D模型中已经有的顶点，根据不同的需求，按照不同的规则，进行插值，将一个多边形拆分成为多个多边形。而这个过程都是可以由编程来控制的，这样就很好的解决了效率和效果的矛盾。TessellATIon能自动创造出数百倍与原始模型的顶点，这些不是虚拟的顶点，而是实实在在的顶点，效果是等同于建模的时候直接设计出来的。</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4516925.shtml"><br clear=all><img alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/925/ce2vP7mTMijDQ.png"></a><br>Tessellation工作流程三部曲</p>
<p>&nbsp;&nbsp;&nbsp; 很明显，DirectX 11中的Tessellation让雪山的凹凸感更为明显，远胜于DirectX 10里所采用的视差映射贴图技术。虽然后者在较远距离观看的时候也能提供一定的视觉欺骗性，但和 Tessellation技术塑造出来的真实感觉还相差太远。我们使用的分析图来自AMD在R600发布时放出的一段Demo，这段Demo区别于以往的设计方式，它没有突出主角而淡化背景，因为在没有Tessellation技术之前，大量顶点的生成和随之而来的计算将给GPU的几何处理部分带来巨大压力，无法流畅运行，而Tessellation技术改变了这一模式。</p>
<p>&nbsp;&nbsp;&nbsp; 除了大幅提升模型细节和画质外，Tessellation最吸引程序员的地方就是：他们无需手动设计上百万个三角形的复杂模型，只需简单勾绘一个轮廓，剩下的就可以交给Tessellation技术自动拆嵌，大大提高了开发效率；而且简单的模型在GPU处理时也能大幅节约显存开销，令渲染速度大幅提升。</p>
<p><strong>&nbsp;&nbsp;&nbsp; ● Tessellation技术历史回顾</strong></p>
<p>&nbsp;&nbsp;&nbsp; Tessellation技术最早可以追溯到DX8时代，当时ATI就已经和微软联手开发了TruForm（N-Patch）技术，也就是Tessellation的前身，并被纳入DX8.1的范畴。</p>
<p>&nbsp;&nbsp;&nbsp; 2001年，ATI公布了TruForm的技术细节，相关媒体也对这一技术进行了报道。简单地说TruForm技术就是将在芯片内部将游戏中的三角形转换成曲面然后再转换成一个新的三角形，这个三角形可以在场景中显示。</p>
<p>&nbsp;&nbsp;&nbsp; 当三角形信息通过图形芯片时，TruForm技术开始工作，它通过创建N-Patch来形成N-Patch网格。</p>
<p>&nbsp;&nbsp;&nbsp; N-Patch网格是一个曲面，通过线性三角形信息来定义。N-Patches在三角形每个边放两个控制点，这样就产生了六个新的顶点。这些控制点都在一个单独的平面上，可以位于原三角形之下或者之上。使用储存在原三角形的顶点向量的信息，可以决定控制点的位置。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4517006.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/6/cevSWshZaaFw.jpg"></a><br>N-Patch技术示意图</p>
<p sizcache="3" sizset="129">&nbsp;&nbsp;&nbsp; 当然，这并不是一个简单的工作，而这正是TruForm技术的用处所在。当时人们认为它是ATI下一代<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>Radeon2的独门武器。在当时GPU运算能力极为有限的情况下，N-Patch技术可以大幅提升3D模型的细节和显示效果。</p>
<p>&nbsp;&nbsp;&nbsp; 但是它却出现了一些非常遗憾的失误，导致这项技术最终被用户放弃。因为N-Patch技术技术比较适合于海豚、赛车等表面为曲面的模型上，而如果这个技术应用在坦克等不需要做曲面化的模型上的时候，效果就会变得相当的滑稽。</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4516997.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/997/cePKA7cbXxiM.png"></a><br>Tessellation技术带来的3D流水线变化</p>
<p>&nbsp;&nbsp;&nbsp; N-Patch/TruForm技术就这样被市场边缘化，但是ATI还是没有放弃对它的开发和研究。终于在2005年出现了转机，在微软与ATI的合作结晶——专为XBOX360设计的图形芯片Xenos当中，经过改进的N-Patch/TruForm技术重出江湖，这次ATI将它直接命名为我们熟悉的TessellATIon，直译为&#8220;拆嵌&#8221;意译为&#8220;细分曲面&#8221;，同时表示ATI在这项技术中不可磨灭的贡献。</p>
<p><strong>&nbsp;&nbsp;&nbsp; ● Tessellation技术拆解分析</strong></p>
<p>&nbsp;&nbsp;&nbsp; Tessellation这个英文单词直译为&#8220;镶嵌&#8221;，也就是在顶点与顶点之间自动嵌入新的顶点。Tessellation经常被意译为&#8220;细分曲面&#8221;，因为在自动插入大量新的顶点之后，模型的曲面会被分得非常细腻，看上去更加平滑致密。它是一种能够在图形芯片内部自动创造顶点，使模型细化，从而获得更好画面效果的技术。Tessellation能自动创造出数百倍与原始模型的顶点，这些不是虚拟的顶点，而是实实在在的顶点，效果是等同于建模的时候直接设计出来的。</p>
<p align=center><a href="http://detail.zol.com.cn/picture_index_452/index4517095.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/95/ceoCbpu8vIjw.png"></a><br>图形业界对于曲面细分的探索不断深入</p>
<p>&nbsp;&nbsp;&nbsp; 在此之前，人们对低代价多边形操作法已经探索了近10年，从最开始的对三角形的fan操纵，到后来的龟裂和冲撞检查，这些方法可以实现曲面细分效果，但是对资源的消耗量太大不可控制。这次微软在DirectX 11中加入硬件Tessellation单元，我们可以视作曲面细分技术历经长时间的磨练后修成正果。虽然它不太符合通用处理单元的设计方向，但是如果计算晶体管的投入与性能回报，独立的硬件Tessellation单元是目前最好的选择。</p>
<p>&nbsp;&nbsp;&nbsp; Tessellation技术是完全可编程的，它提供了多种插值顶点位置的方法来创造各种曲面：</p>
<p>　　1. N-Patch曲面，就是和当年TruForm技术一样，根据基础三角形顶点的法线决定曲面；<br>　　2. 贝塞尔曲面，根据贝塞尔曲线的公式计算顶点的位置；<br>　　3. B-Spline、NURBs、NUBs曲线（这三种曲线均为CAD领域常用曲线，在Maya中均有相应工具可以生成）<br>&nbsp;&nbsp;&nbsp; 4. 通过递归算法接近Catmull-Clark极限曲面。</p>
<p align=center><a href="http://detail.zol.com.cn/picture_index_452/index4517111.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/111/ce8qMj6zBQxi6.png"></a><br>不同方式的曲面细分效果实例</p>
<p>&nbsp;&nbsp;&nbsp; Tessellation技术最初主要被用以&#8220;细分曲面&#8221;，随着该技术被纳入DX11范畴，得到大范围推广之后，插值顶点的算法也越来越多，因此用途也越来越广，产生了很多非常有创意的应用。</p>
<p>&nbsp;&nbsp;&nbsp; Tessellation技术还经常与Displacement Maps（贴图置换）技术搭配使用，从而将平面纹理贴图改造成为具有立体感的几何图形，大大增强3D模型或场景的真实性。</p>
<p>&nbsp;&nbsp;&nbsp; 除了大幅提升模型细节和画质外，Tessellation最吸引程序员的地方就是：他们无需手动设计上百万个三角形的复杂模型，只需简单勾绘一个轮廓，剩下的就可以交给Tessellation技术自动镶嵌，大大提高开发效率；而且简单的模型在GPU处理时也能大幅节约显存开销，同时大幅提升渲染速度。</p>
<p><strong>&nbsp;&nbsp;&nbsp; ● DirectX 11引入可编程曲面细分管线</strong></p>
<p>&nbsp;&nbsp;&nbsp; 在DirectX10时代的细分曲面里，最有新用途的就是Geometry Shader和Stream Out，前者可以输入一些数据，然后产生一些三角形，后者可以断绝Pixel Shader，做完Geometry Shader就直接输出回Input Assembler，这就意味着可以做GPU递归和迭代。</p>
<p>&nbsp;&nbsp;&nbsp; 而DirectX 11相比DirectX 10，Shader Model的变化并不算大，只是增加了5个全新的指令集。但是对于游戏开发者而言，Shader Model 5.0函数和子程序代码的开发都比上一代更加简单方便。增加的五个新指令集目的也是为了让编程者可以进行更灵活的数据访问和操作。</p>
<p>&nbsp;&nbsp;&nbsp; 在Shader Model 5.0中，Shader进行了类型的统一，除了4.0版本中就已经有的Vertex Shader、Pixel Shader、Geometry Shader外，还增加了Hull Shader、Compute Shader、Domain Shader三种新的Shade，它们的出现都是为了完善曲面细分管线。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4517183.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/183/ce8SfKTlG2Zqs.png"></a></p>
<p sizcache="3" sizset="129">&nbsp;&nbsp;&nbsp; ATI的HD2000以上级别<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>其实都具备Tessellation的功能，但它们却无法与DX11中的Tessellation技术相兼容。这是因为微软并没有原封未动的将R600的Tessellation技术抄到DX11之中，而是对其进行了优化，使之能与渲染流程完美的结合在一起，可以更高效率的细分出更多的多边形和曲面。</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4517185.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/185/cexK74EfFUXg.png"></a></p>
<p>&nbsp;&nbsp;&nbsp; 与DX9C/DX10时代孤零零的Tessellator模块不同，在DX11当中，微软加入了两种全新着色器来全力配合Tessellator的工作，分别位于镶嵌器的前后。</p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4517187.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/187/cegslnqf0MKQ.png"></a></p>
<p>&nbsp;&nbsp;&nbsp; 其中Hull Shader（外壳着色器）用来控制自动生成顶点的数量和算法，也就是Tessellator的细分级别，然后交给Tesselator进行镶嵌处理，最后由Domain Shader（域着色器）按照程序要求生成所需曲面，并自动进行法线平移、置换贴图，产生新的模型。</p>
<p align=center sizcache="3" sizset="132"><a href="http://detail.zol.com.cn/picture_index_452/index4517189.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2f.zol-img.com.cn/product/45_500x2000/189/ceKcl2WExtvrM.png"></a></p>
<p>&nbsp;&nbsp;&nbsp; 与DX9/10中的Tessellation技术相比，DX11新增的两种着色器都受统一渲染架构支配，因此处理能力非常富裕，DX11版Tessellation不仅效率更高、而且细分级别更丰富。但是，更高的细分等级对Tessellator模块本身的处理能力提出了苛刻要求，这需要芯片厂商在设计之初就考虑周全。<br><strong>&nbsp;&nbsp; ● Tessellation与Displacement Mapping综合应用</strong></p>
<p>&nbsp;&nbsp;&nbsp; Displacement Mapping（贴图置换）与Tessellation（曲面细分）的结合使用具有许多优势。虽然两者在原理方面本来是没有任何。</p>
<p>&nbsp;&nbsp;&nbsp; 贴图置换是一种通过VS和alpha混合操作来达成复杂表面的操作；基本上贴图置换不会增加新的多边形，即便增加也仅作操作点用。曲面细分则不一样，它通过在已知多边形内设立新的顶点，达成fan操作来完成增加多边形的目的。这两种技术一个的重点是alpha和顶点移动，另一个的重点则是直接增加多边形数量。这是两种完全不同的复杂表面细节实现手段。</p>
<p align=center sizcache="3" sizset="128"><a href="http://detail.zol.com.cn/picture_index_452/index4517768.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/768/cePhz6O1F9UG2.jpg"></a><br>Tessellation和Displacement Mapping结合应用</p>
<p>&nbsp;&nbsp;&nbsp; 简单来讲，Displacement Mapping的目的就是借助Tessellation改变多变形的外观，而不仅仅只是圆滑棱角。</p>
<p>&nbsp;&nbsp;&nbsp; 正如你所看到的那样，Displacement mapping能够透过Tessellation和Displacement Mapping让一张平面的网面真正实现具有不同形状的外观（上面的例子是绵绵起伏的山丘），只要使用Displacement Mapping映像到网面的顶点上，就能够让网面善的顶点提升/升降到不同的相对高度，同样的网面可以形成不同的形状。</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4517767.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2b.zol-img.com.cn/product/45_500x2000/767/cepjOHGii1cHk.png"></a><br>Tessellation和Displacement Mapping结合应用</p>
<p align=left>&nbsp;&nbsp;&nbsp; 和以往主要在光栅化阶段进行的Bump mapping不同的是，Displacement Mapping是生成的是由更多多边形构成的真实外观，而Bump mapping则是一种欺骗性手段、一种性能妥协方案而已，不能产生真正不同的外形，采用Displacement Mapping来实现丰富的表面细节实在有太多的好处了。</p>
<p>&nbsp;&nbsp;&nbsp; 最终，利用Displacement Mapping（贴图置换）与Tessellation（曲面细分）相结合的方式所渲染出来的模型与艺术家所用工具中的原生模型很相似，从而让艺术家不必创建不同几何细节级别的模型，无需重复地进行这种一般性劳动。</p>
<p><strong>&nbsp;&nbsp;&nbsp; ● 全新的多线程渲染技术</strong></p>
<p sizcache="3" sizset="128">&nbsp;&nbsp;&nbsp; 虽然超线程概念已经在<a class=hui14_line href="http://detail.zol.com.cn/cpu_xilie_index/subcate468_list_1.html"><font style="COLOR: #333"><u>CPU</u></font></a>领域发展了数十年，但大多数程序员还是直到近年来多核心CPU流行之后才开始关心程序的平行化，在此之前大部分通用代码都是简单的单线程，在这些代码里寻找并挖掘多线程化带来的性能提升是非常困难的。</p>
<p>&nbsp;&nbsp;&nbsp; 为了改变这一现状，DirectX 11特性还包括很重要一点：支持多线程（multi-threading）。没错，无论是DirectX 10还是DirectX 11，所有的色彩信息最终都将被光栅化并显示在电脑显示屏上（无论是通过线性的方式还是同步的），但是DirectX 11新增了对多线程技术的支持。</p>
<p align=center sizcache="3" sizset="129"><a href="http://detail.zol.com.cn/picture_index_452/index4517804.shtml"><br style="LINE-HEIGHT: 0; FONT-SIZE: 0px" clear=all><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2c.zol-img.com.cn/product/45_500x2000/804/ceqwQJCB11pw.png"></a><br>从DirectX 10到DirectX 11的多线程变化</p>
<p>&nbsp;&nbsp;&nbsp; 得益于此，应用程序可以同步创造有用资源或者管理状态，并从所有专用线程中发送提取命令，这样做无疑效率更高。DX11的这种多线程技术可能并不能加速绘图的子系统（特别是当我们的GPU资源受限时），但是这样却可以提升线程启动游戏的效率，并且可以利用台式CPU核心数量不断提高所带来的潜力。</p>
<p align=center sizcache="3" sizset="130"><a href="http://detail.zol.com.cn/picture_index_452/index4517817.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2d.zol-img.com.cn/product/45_500x2000/817/ce5hmdAVGto.png"></a><br>多线程渲染示意图1</p>
<p>&nbsp;&nbsp;&nbsp; 在DirectX 11中，微软通过将目前单一执行的Direct 3D设备被分为三个独立的接口：设备（Device）、立即执行范畴（immediate Context）和延迟执行范畴（Deferred Context）。</p>
<p align=center sizcache="3" sizset="131"><a href="http://detail.zol.com.cn/picture_index_452/index4517818.shtml"><img style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="浅析DirectX11技术带给图形业界的改变 " align=no src="http://2e.zol-img.com.cn/product/45_500x2000/818/ceeevyDzAV3JU.png"></a><br>多线程渲染示意图2</p>
<p sizcache="3" sizset="132">&nbsp;&nbsp;&nbsp; 这三者都被分发到各自独立的线程，而且设备和Deferred context还可以分配多个线程，负责将等待执行的任务发送给immediate Context或渲染线程。这样的设计可以将图形生成所需的资源做预先的存取。同时，CPU还可以利用<a class=hui14_line href="http://detail.zol.com.cn/vga_index/subcate6_list_1.html"><font style="COLOR: #333"><u>显卡</u></font></a>的多线程处理加快DirectX的处理，减少CPU的响应时间而使游戏不再受到CPU的瓶颈限制。</p>
<img src ="http://www.cppblog.com/CrazyDev/aggbug/114706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CrazyDev/" target="_blank">CrazyDev</a> 2010-05-06 22:24 <a href="http://www.cppblog.com/CrazyDev/articles/114706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Havok VS PhysX 漫谈物理加速世界！</title><link>http://www.cppblog.com/CrazyDev/articles/114383.html</link><dc:creator>CrazyDev</dc:creator><author>CrazyDev</author><pubDate>Tue, 04 May 2010 14:53:00 GMT</pubDate><guid>http://www.cppblog.com/CrazyDev/articles/114383.html</guid><wfw:comment>http://www.cppblog.com/CrazyDev/comments/114383.html</wfw:comment><comments>http://www.cppblog.com/CrazyDev/articles/114383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CrazyDev/comments/commentRss/114383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CrazyDev/services/trackbacks/114383.html</trackback:ping><description><![CDATA[<p>
<table width="100%" bgColor=#bbe5cc>
    <tbody>
        <tr>
            <td><font color=#006600 size=3><strong>第1页：物理大战新篇章</strong></font></td>
        </tr>
    </tbody>
</table>
<p></font></p>
<p><font face="Arial, Helvetica, sans-serif">　　2008年6月，NVIDIA与AMD-ATI先后发布了自家新一代高阶产品GT200（GeForce GTX 280/260）与RV770（Radeon HD 4850/4870），我们在惊诧于新产品的极限性能时，众多新技术引用也是玩家关注的重点，例如NVIDIA的CUDA架构，AMD-ATI的GPGPU解决方案等。在众多的技术当中，物理加速技术由于震撼的视觉体验及两家不同的解决方案再次成为了人们关注的焦点。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/570f8c58e439e8ca9c8204e1.jpg" width=125 height=44></font></p>
<p><font face="Arial, Helvetica, sans-serif">　　NVIDIA发布的CUDA 2.0开发包中蕴含了PhysX物理加速技术，NVIDIA的意向是使用GPU通过CUDA架构来实现物理加速；而作为同时拥有CPU与GPU业务的AMD自然会选择CPU+GPU为主导的Havok物理引擎。2007年9月Intel闪电收购Havok之后，NVIDIA与AMD-ATI的GPU物理加速计算就显得非常尴尬，因为Intel收购Havok的目的就是使Havok引擎专注于CPU物理运算，为了对抗Intel（亦或是说CPU），NVIDIA收购了Ageia及其PhysX引擎，使PhysX引擎专注于GPU物理运算。AMD-ATI如何选择物理加速方案在RV770之前业界充满了猜测，因为无论是Havok还是PhysX引擎，都是竞争对手的产品，而为了AMD更加长远的Fusion计划，AMD-ATI最终选择了前者。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/havok_logo.jpg" width=460 height=134></font></p>
<p><font face="Arial, Helvetica, sans-serif">　　物理加速技术在2006年Ageia发布物理PhysX加速卡时被人们所关注，甚至有人笑称3D加速成就了3DFX，而物理加速将成就Ageia，但是由于Ageia采用的是PhysX硬件物理卡加速方式，而物理卡又价格不菲，虽然Ageia也出售PhysX引擎，但是由于没有PhysX硬件加速卡支持的话效率会降低，在加上NVIDIA与AMD-ATI当时都采用了Havok引擎作为标准，因此一直没有受到游戏开发商及广大玩家的重视。而Havok引擎在很长一段时间都是致力于CPU软件加速，但是随着Havok 4.0工具中Havok FX的发布就不一样了，Havok FX引擎是通过GPU来进行物理加速，主要针对当时的PhysX引擎。</font></p>
<p><font face="Arial, Helvetica, sans-serif">　　关于GPU与CPU在做物理运算时的差距这里就不多做介绍了，有很多这方面的文章可寻，总体来说GPU运行物理运算可以是四核CPU的十几倍到几十倍不等，比PPU有几倍到几十倍的性能提升。而我们这里主要探讨的NVIDIA与AMD-ATI GPU加速昨天、今天与明天！</font></p>
<table width="100%" bgColor=#bbe5cc>
    <tbody>
        <tr>
            <td><font color=#006600 size=3><strong>第2页：昨天—殊归同途的Havok FX引擎</strong></font></td>
        </tr>
    </tbody>
</table>
<p></font></p>
<p><font face="Arial, Helvetica, sans-serif">　　Havok FX发布于2006年中，前文已经提到，Havok FX引擎是通过GPU来进行物理加速，当时的NVIDIA与AMD-ATI都不约而同的支持Havok FX引擎，首先来看NVIDIA的NVIDIA SLI Physics技术，NVIDIA是采用SLI模式的第二块显卡来进行物理加速。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/20060322161509_38385.jpg" width=480 height=344></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　从上图中可以看出，Havok FX API通过DirectX将数据发给GPU驱动，如果游戏或者驱动不支持SLI物理，那么将不会发送物理数据，反之则交给GPU 2进行物理计算，计算结果则返回给Havok API。</font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　与NVIDIA的物理解决方案类似，AMD-ATI同样采用Havok FX引擎，同样基于多卡互联CrossFire来实现物理加速，第二块显卡来进行GPU物理加速。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/62818375825.jpg" width=500 height=262></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　当时AMD-ATI的X1000系列GPU的设计理念是搭建智能化的芯片架构，使得芯片内部的运算灵活性增强，根据外部接口API的不同，可以实现完全不同的运算任务，并且命名为DPP（Data Parallel Processing ）并行数据处理架构。</font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　虽然同样采用了Havok FX引擎，并且都是双卡互联形式实现，但是两家的解决方案却大相径庭：NVIDIA是通过DirectX API来实现物理加速，而AMD-ATI则是通过数据并行计算架构提取（Data Parallel Processing Architecture Abstraction ）直接与Havok FX引擎交换数据，让Havok FX引擎直接与GPU沟通，而不需要通过Direct3D和OpenGL API，AMD-ATI著名的Close To Metal(CTM)接口就是在这个时期提出的。简单的理解就是，AMD-ATI的实现方式是&#8220;GPGPU&#8221;通用计算的形式来做物理运算，而NVIDIA是让显卡通过DirectX以&#8220;GPU&#8221;的工作方式在做物理加速（其实也是GPGPU应用范畴）。</font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　至于两种方案的优劣其实讨论起来真的没有意义，因为实际上除了NVIDIA与AMD-ATI自家演示的小DEMO与视频之外，目前支持GPU物理加速的游戏几乎没有，大部分使用到物理加速的游戏还都是使用CPU物理加速的方式，包括我们熟知顶级大作《Crysis》、《使命召唤4：现代战争》等等&#8230;&#8230;</font></p>
<table width="100%" bgColor=#bbe5cc>
    <tbody>
        <tr>
            <td><font color=#006600 size=3><strong>第3页：今天—PhysX决战Havok FX</strong></font></td>
        </tr>
    </tbody>
</table>
<p></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　当NVIDIA宣布CUDA集成PhysX物理引擎时，很多人都会认为PhysX引擎只支持GPU物理加速技术，这也是AMD-ATI选择Havok FX引擎的主要原因。然而实际上PhysX引擎最初是只支持CPU与PPU，而不支持GPU，即使是融入CUDA之后，PhysX引擎也仍然支持CPU物理加速。之所以给人PhysX引擎只支持GPU物理加速的错觉，是因为NVIDIA表示今后将大力发展GPU物理加速，但这并不表示PhysX引擎排斥CPU或者CPU+GPU的解决方案。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/wul2.jpg" width=550 height=306></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　无论是GPU还是CPU、PPU、Cell（PS3）都可以通过HAL翻译层来实现软、固质体动力(Soft or Rigid Body Dynamics)、通用碰撞侦测(Universal Collision Detection)、有限元素分析(Finite Element Analysis)、流体动力(Fluid Dynamics)、毛发模拟(Hair Simulation)以及更先进的布料模拟(Cloth Simulation)、自然模拟（Natural Motion）等在内新颖技术。</font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　通过CUDA通用接口，PhysX引擎将NVIDIA GPU中的Thread Scheduler（线程管理器）模拟成Control Engine(控制引擎CE)，而Streaming Processors来模拟Vector Processing Engine(矢量处理引擎,VPE)，其中CE控制引擎负责任务的指派，相当于PhysX中的主管机构，而真正的物理运算任务则是由VPE矢量引擎来完成，最后通过Data Movement Engine(数据移动引擎DME)输出。关于最新GT200物理运算的优势已经被NVIDIA吹的天花乱坠，这里就不多介绍了，感兴趣的朋友参见<a href="http://www.beareyes.com.cn/2/lib/200806/16/20080616386.htm">《NVIDIA夺面双雄 GT200全球同步首测》</a>一文。</font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　而AMD-ATI则继续选择Havok FX引擎，不过RV770系列实现物理加速的方法也已经不同于之前的CrossFire双卡解决方案，之前Radeon X1000系列是通过据并行计算架构提取直接与Havok FX引擎相连接（其实也可以通过Direct3D和OpenGL API），然而由于对抗CUDA的原因，AMD-ATI也需要自己的GPGPU规范，而AMD-ATI则选择了苹果公司力推的通用计算行业标准OpenCL，它能与图形硬件及多核CPU相协调以提高系统的整体性能，而AMD-ATI的Havok物理加速技术就是基于CAL/Brook+的。</font></p>
<p align=center><font face="Arial, Helvetica, sans-serif"><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/a5e32630-029b-4b00-9718-2818ff18e104.jpg" width=500 height=375></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　实质上讲无论是CTM接口，还是现在的CAL/Beook+，AMD-ATI执行物理加速的概念都没有变，那就是GPGPU的并行能力进行物理运算，而NVIDIA方面可以真正称的上市GPGPU物理加速还是从CUDA开始的。另外我们也注意到，之前无论NVIDIA还是AMD-ATI在展示自己物理运算时都是基于双卡技术，而如今他们更愿意谈论单卡。</font></p>
<table width="100%" bgColor=#bbe5cc>
    <tbody>
        <tr>
            <td><font color=#006600 size=3><strong>第4页：明天—技术与现实之间的抉择</strong></font></td>
        </tr>
    </tbody>
</table>
<p></font></p>
<p align=left><font face="Arial, Helvetica, sans-serif">　　那么物理加速技术的明天到底是Havok FX引擎还是PhysX引擎的天下？我们先来看一下双方的阵营：PhysX引擎目前只有NVIDIA一家支持，有消息称AMD-ATI目前也正在与NVIDIA商榷授权的问题，那么有可能AMD-ATI最终也支持PhysX引擎；Havok FX引擎目前已经得到AMD-ATI的支持，加上Havok的所有者Intel，目前构成了Intel+AMD-ATI对抗NVIDIA的局面。</font></p>
<table border=0 cellSpacing=1 borderColor=#cccccc cellPadding=4 width=500 align=center height=243>
    <tbody>
        <tr borderColor=#ccffff bgColor=#ffffff>
            <p>&#160;</p>
            <td height=45 colSpan=3>
            <div align=center><font face="Arial, Helvetica, sans-serif"><strong>物理加速阵营对比</strong></font></div>
            <div align=center></div>
            </td>
            <td>
            <p>&#160;</p>
            </td>
        </tr>
        <tr borderColor=#ccffff>
            <td bgColor=#0099ff height=27>&nbsp;</td>
            <td bgColor=#f1fafa><font face="Arial, Helvetica, sans-serif">支持引擎</font></td>
            <td bgColor=#f1fafa><font face="Arial, Helvetica, sans-serif">加速态度</font></td>
        </tr>
        <tr borderColor=#ccffff>
            <td bgColor=#0099ff width=117>
            <div align=center><font face="Arial, Helvetica, sans-serif"><strong><font color=#ffffff>Intel</font></strong></font></div>
            </td>
            <td bgColor=#f1fafa width=187>
            <div align=center><font face="Arial, Helvetica, sans-serif">Havok</font></div>
            </td>
            <td bgColor=#f1fafa width=182>
            <div align=center><font face="Arial, Helvetica, sans-serif">CPU</font></div>
            </td>
        </tr>
        <tr borderColor=#ccffff>
            <td bgColor=#0099ff>
            <div align=center><font face="Arial, Helvetica, sans-serif"><strong><font color=#ffffff>AMD-ATI</font></strong></font></div>
            </td>
            <td bgColor=#f1fafa>
            <div align=center><font face="Arial, Helvetica, sans-serif">Havok（PhysX引擎正在商榷）</font></div>
            </td>
            <td bgColor=#f1fafa>
            <div align=center><font face="Arial, Helvetica, sans-serif">CPU+GPU</font></div>
            </td>
        </tr>
        <tr borderColor=#ccffff>
            <td bgColor=#0099ff>
            <div align=center><font face="Arial, Helvetica, sans-serif"><strong><font color=#ffffff>NVIDIA</font></strong></font></div>
            </td>
            <td bgColor=#f1fafa>
            <div align=center><font face="Arial, Helvetica, sans-serif">PhysX引擎</font></div>
            </td>
            <td bgColor=#f1fafa>
            <div align=center><font face="Arial, Helvetica, sans-serif">GPU</font></div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;
<p><font face="Arial, Helvetica, sans-serif"></p>
<p align=left>　　三方对于物理加速是由GPU还是由CPU执行的态度开篇已经阐明，实际上这场物理大战最终的抉择就是落在了到底是CPU加速还是GPU加速上，我们先来看一下最简单的物理加速计算过程。<font color=white size=-1>小熊在线www.beareyes.com.cn</font></p>
<p align=left>　　无论PhysX引擎还是Havok引擎物理计算都基于以下步骤：</p>
<p align=left>　　Integrate整合初步计算<br>Collide碰撞判定<br>Solve Collisions碰撞结果计算</p>
<p align=left>　　在Integrate整合初步计算阶段，进行物理对象的一些初始物理状态的初始化，包括速度、加速度等各项信息，为后面的运算做准备。Collide 碰撞判定进行一些对象之间的碰撞检测，并以对的形式进行处理（因为碰撞总是两个物体相互的），Solve Collisions碰撞结果计算阶段则是对碰撞的后处理，包括碰撞后的速度等。Solve Collisions碰撞结果计算阶段是最复杂的，那么我们可以看出物理计算是一个对并行计算非常依赖的运算。<font color=white size=-1>小熊在线www.beareyes.com.cn</font></p>
<p align=center><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/000260326.jpg" width=500 height=306><br>Solve Collisions</p>
<p align=left>　　我们看到，物理运算所需的大量并行计算正是GPU所具备的优势，利用GPU做物理运算确实是天经地义的事，那么是不是说物理计算目前就是该由GPU来负责呢？在回答这个问题之前我们先来看一下NVIDIA在近期发布的PhysX驱动，搭配PhysX驱动在运行3DMark Vantage CUP测试第二个场景的时候，由于GPU接替（或者说是加速）物理运算，使这个场景成绩暴增，可以看出GPU取代CPU物理加速时的决定性优势，而在NVIDIA最新发布虚幻3物理地图演示中，我们却可以看到如下的成绩：</p>
<p align=center><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/S11235726.jpg" width=481 height=372><br>1680&#215;1050</p>
<p align=center><img src="http://www.beareyes.com.cn/2/lib/200807/01/251/11243226.jpg" width=481 height=372><br>2560&#215;1600</p>
<p align=left>　　GPU进行物理加速在进行很少使用到图形渲染的3DMark Vantage CPU测试第二个场景，以及较低分辨率下进行游戏时，GPU物理加速确实效果令人满意，但是随着分辨率的增加，GPU物理加速在游戏中的表现就不在我们想象的那样完美，对比CPU加速，有些场景甚至还有成绩的下降！</p>
<p align=left>　　这是游戏中GPU与CPU的关系决定的，在游戏中，显卡大多数时候都是在满负荷运行，这时根本无暇分身做物理运算！那么这时CPU在做什么？游戏是非抢占型程序，也就是说如果一般游戏不会全部榨干CPU性能，所以我们在进行游戏时经常看到CPU的占用率并非100%，如果是4核CPU而游戏又不支持多核的话，那么这时CPU的性能就在浪费！</p>
<p align=left>　　实际的情况已经很明了，GPU确实非常做物理运算，但是实际情况却是GPU心有余而力不足，利用目前闲置的CPU来做物理加速似乎是最好的选择，而如果我们有两块显卡的话也许就解决了GPU自顾不暇的问题，这是不是让你想到了当初NVIDIA及AMD-ATI都不约而同选择Havok FX物理加速的原因——一块显卡做图形渲染，一块显卡做物理加速！</p>
<p align=left>　　今后物理的发展最终走向何方？也许会是GPU强大到做物理加速如现在的视频解码，也许是今后游戏继续榨干显卡的性能，由多核CPU闲暇来做物理计算，也许是Fusion的CPU+GPU协同操作，总之，一切皆有可能，我们拭目以待&#8230;&#8230;<br></p>
</font><!--cpb1--><!--cpb2-->
<img src ="http://www.cppblog.com/CrazyDev/aggbug/114383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CrazyDev/" target="_blank">CrazyDev</a> 2010-05-04 22:53 <a href="http://www.cppblog.com/CrazyDev/articles/114383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏中的曲线插值简单介绍</title><link>http://www.cppblog.com/CrazyDev/articles/113736.html</link><dc:creator>CrazyDev</dc:creator><author>CrazyDev</author><pubDate>Tue, 27 Apr 2010 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/CrazyDev/articles/113736.html</guid><wfw:comment>http://www.cppblog.com/CrazyDev/comments/113736.html</wfw:comment><comments>http://www.cppblog.com/CrazyDev/articles/113736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CrazyDev/comments/commentRss/113736.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CrazyDev/services/trackbacks/113736.html</trackback:ping><description><![CDATA[<div id=ctl00_MainContent_Contents>
<p>我看了不少插值的方法，有的方法讲得莫名其妙，一个程序，一些系数，为什么这个系数是1，而不是0.5从来不讲，让人很怀疑其可用性。</p>
<p>后来做刀光的时候，采集的刀光的点不够圆滑，需要用到插值——想想自己的高数还没有完全忘光，干脆自己推导一个得了。</p>
<p>首先我们要明白什么叫做光滑的曲线，可以这么认为，这个曲线是一个运动物体，在时间[0，1]内运动的轨迹。而要求的光滑的曲线，就是要求物体运动 过程中没有速度的突变。且要求不同的曲线段之间，速度也不能有突变。据此，我们可以大约知道插值一段曲线，需要指导曲线其实点的位置和速度，结束点的位置 和速度。由于有四个已知变量，显然，用一个四次方程来描述这个曲线是再合适不过了。</p>
<p>方程如下：</p>
<p><font size=4>f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;[0 &lt;= t &lt;= 1]</font></p>
<p>对f(t)求导，得到速度方程：</p>
<p><font size=4>f'(t) = 3 * a * t ^ 2 + 2 * b * t + c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0 &lt;= t &lt;= 1]</font></p>
<p>所以<br><font size=4>f(0) = d = x0(起始点位置)<br>f(1) = a + b + c + d = x1(结束点位置)<br>f'(0) = c = y0(起始点速度)<br>f'(1) = 3 * a + 2 * b + c = y1(结束点速度)<br></font></p>
<p>联合上面四个式子可解得</p>
<p><font size=3>a = 2 * x0 - 2 * x1 + y0 + y1<br>b = 3 * x1 - 3 * x0 - y1 - 2 * y0<br>c = y0<br>d = x0<br></font></p>
<p>再利用</p>
<p><font size=4>f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;[0 &lt;= t &lt;= 1]</font></p>
<p><font size=2>就可以插值这断曲线了</font></p>
<p><font size=2>当然，事情还没有完，通常情况下，我们得到的数据只有各个采样点的位置，没有速度。这个时候，速度怎么办？我的解决办法是，在有3个采样点的时候(p0,p1,p2)，计算出p1采样点的速度，另外，再假设采样时间间隔是均匀的，因此：</font></p>
<p><font size=3>v1 = (p2 - p0) * 0.5</font></p>
<p><font size=2>在有N个采样的时候，特殊处理起始点和结束点的速度</font></p>
<p><font size=3>v0 = p1 - p0;</font></p>
<p><font size=3>vn = pn - p(n-1)</font></p>
<p><font size=2>这样得到的曲线完全满足平滑的要求，缺点是，曲线开始插值的时候要延迟一个采样点的时间，有的时候，v0 速度很快，因此，会出现一条有缝隙刀光。针对当前项目，我在第一次采样的时候，将时间稍微往后加了0.001秒，按照当前的运动趋势多采样了一次，从而消 除了这个缝隙。因为预测的运动时间很短，即使预测错误，也不影响刀光的外观。</font></p>
</div>
<img src ="http://www.cppblog.com/CrazyDev/aggbug/113736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CrazyDev/" target="_blank">CrazyDev</a> 2010-04-27 20:45 <a href="http://www.cppblog.com/CrazyDev/articles/113736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Alpha混合物体的深度排序[译]</title><link>http://www.cppblog.com/CrazyDev/articles/113735.html</link><dc:creator>CrazyDev</dc:creator><author>CrazyDev</author><pubDate>Tue, 27 Apr 2010 12:43:00 GMT</pubDate><guid>http://www.cppblog.com/CrazyDev/articles/113735.html</guid><wfw:comment>http://www.cppblog.com/CrazyDev/comments/113735.html</wfw:comment><comments>http://www.cppblog.com/CrazyDev/articles/113735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CrazyDev/comments/commentRss/113735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CrazyDev/services/trackbacks/113735.html</trackback:ping><description><![CDATA[<div id=ctl00_MainContent_Contents>
<p>先说个题外话, 本来我想解答一下最近Creators Club论坛上经常出现的一个问题, 意外的是在网上竟然找不到什么全面的答案..</p>
<p>这是个有着复杂答案的简单问题:</p>
<h2>&#8220;为什么我的透明物体的绘制顺序不对, 或者有些不见了?&#8221;</h2>
<p>当绘制一个3D场景时, 对图形进行深度排序是非常重要的, 这样离镜头近才画在远处物体的前面. 我们不会希望看到远处的山把近在眼前的建筑给挡住了!</p>
<p>如今有三种深度排序方法得到了广泛的应用:</p>
<ul>
    <li>深度缓冲 (也叫做 z-buffering)
    <li>油画家算法
    <li>背面剔除 </li>
</ul>
<p>不幸的是, 每种都有其局限性. 为了达到好的结果, 大多数游戏是把三种方法结合起来使用的.</p>
<p>&nbsp;</p>
<h2>深度缓冲</h2>
<p>深度缓冲简单而有效, 结果也很完美. 但是对于透明的物体它就无能为力了!</p>
<p>这是因为深度缓冲只记录了当前已经绘制的最近像素. 对于不透明的物体, 这已经能够满足我们的需要了. 看一下这个绘制两个三角形的例子, A和B:<br><img onmouseover="if(this.title) {this.style.cursor='hand';}" onclick="if(this.title) {window.open('http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_abbccc38-6d1f-4233-ba41-820bb5c5bbb6.png');}" border=0 alt="" src="http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_abbccc38-6d1f-4233-ba41-820bb5c5bbb6.png" onload="if(this.width>screen.width-333) {this.width=screen.width-333;this.title='open new window';}"></p>
<p><br>如果我们先画B再画A, 深度缓冲会看到新的像素(A的)比之前的(B的)要近, 那么它就画在了前面. 如果我们用相反的顺序画(先A后B), 深度缓冲会看到B的像素比之前A已经画的要远, 所以就把它们给丢弃掉了. 无论哪种情况我们都会得到正确的结果: A在前面, B隐藏在后面.</p>
<p>但是当这些几何图形是透明的, 即B透过A是部分可见的时会怎样呢? 如果我们先画B再画A的话是没有问题的, 但反过来就不行了. 在这种情况下, 深度缓冲会从B取一个像素, 同时注意到已经绘制了一个更近的像素(A的), 然后它就没辙了! 唯一的选择是绘制B(这会得到一个错误的结果, B会画在A前面, 但A的alpha 混合却没有起作用), 或者完全抛弃B. 不爽!</p>
<h3>结论</h3>
<p>深度缓冲对于不透明的物体是很完美的, 但对于透明的物体却不实用.</p>
<p>&nbsp;</p>
<h2>油画家算法</h2>
<p>深度缓冲没法应付以错误的顺序来绘制透明物体的情况, 这很好解决, 对吧? 保证它们按正确的顺序绘制就可以了! 如果对场景中的所有物体进行排序, 那我们就可以先画远处的, 再画近处的, 这样就可以确保前面例子中的B可以在A之前绘制.</p>
<p>不幸的是, 这说起来容易做起来难. 对物体进行排序在很多情况下并不适用, 如A和B相交的情况该怎么办?<br><img onmouseover="if(this.title) {this.style.cursor='hand';}" onclick="if(this.title) {window.open('http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_3a2b07f6-54fe-4310-9c2c-672d35598fa5.png');}" border=0 alt="" src="http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_3a2b07f6-54fe-4310-9c2c-672d35598fa5.png" onload="if(this.width>screen.width-333) {this.width=screen.width-333;this.title='open new window';}"></p>
<p><br>如果A是个玻璃杯而B是它里面的一个玻璃球时就是这样. 现在我们就没法对它们进行排序了, 因为A的一部分比B近, 而另一部分又比B远.</p>
<p>甚至我们不需要两个不同的物体来复现这个问题. 组成玻璃杯的那些三角形会怎样? 要让它们显示正确, 需要在前面的绘制之前先绘制后面的. 所以, 只对物体进行排序是不够的: 我们要对每一个三角形进行排序.</p>
<p>问题是, 对每个三角形进行排序的代价太大! 就算我们能够承受, 这也不是在所有的场合下都能得到正确的结果的. 比如说两个透明的三角形相交时会怎样呢? <br><img onmouseover="if(this.title) {this.style.cursor='hand';}" onclick="if(this.title) {window.open('http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_77b4cb6b-2081-460a-99c0-7a1fcd6cde37.png');}" border=0 alt="" src="http://blogs.msdn.com/blogfiles/shawnhar/WindowsLiveWriter/Alphablendinganddepthsorting_9747/Untitled_77b4cb6b-2081-460a-99c0-7a1fcd6cde37.png" onload="if(this.width>screen.width-333) {this.width=screen.width-333;this.title='open new window';}"></p>
<p><br>没有方法对这样的三角形进行排序, 因为我们需要把B的上半部分画在A的前面, A的下半部分画在B的前面. 唯一的解决方案就是把三角形从相交处分割开来, 但是这样的消耗是不可承受的.</p>
<h3>结论</h3>
<p>油画家算法需要你在选择排序的粒度好好权衡一下. 如果你仅仅对一些大的的物体进行排序, 速度很快但不是很精确; 如果你对一些小物体进行排序(包括三角形个体的极限情况), 速度会慢一些, 但更加精确.</p>
<p>&nbsp;</p>
<h2>背面剔除</h2>
<p>一般不把背面剔除当成是一种排序技术, 但它确实是一种重要的方法. 它的局限性就是只适用于凸面体.</p>
<p>考虑一下一个简单的凸面体, 如一个球体或立方体. 无论你从哪个角度看, 每个屏幕上的像素都会被覆盖两遍: 一次是物体的前面, 一次是后面. 如果你用背面剔除丢弃了背面的三角形, 那就只剩前面了. 哈哈, 如果每个屏幕上的像素只进行一次判断, 那你就自动得到了一个完美的混合结果, 没有必要排序任何东西.</p>
<p>当然, 大多数的游戏不会只画球体或立方体J 所以只是背面剔除的话不是一个妥善的解决方案.</p>
<h3>结论</h3>
<p>背面剔除对于凸面体是完美的, 但是对于其它的就无能为力了.</p>
<p>&nbsp;</p>
<h2>我该怎样让我的游戏看起来更好一些?</h2>
<p>最常用的方法:</p>
<ul>
    <li>设置DepthBufferEnable 和DepthBufferWriteEnable 为true
    <li>绘制所有的不透明物体
    <li>保持DepthBufferEnable 为true, 但是设置DepthBufferWriteEnable为false
    <li>对alpha混合的物体按照与摄像机的距离进行排序, 然后从后到前画出来 </li>
</ul>
<p>这依赖于三种排序技术的结合</p>
<h3>不透明的物体按深度缓冲排序 </h3>
<p>透明物体和不透明物体仍然会被深度缓冲处理(所以你永远不会通过一个不透明物体看到一个透明的) <br>油画家算法对透明的物体排序(两个透明物体相交时仍然会有排序错误) <br>依赖背面剔除来对单个透明物体上的三角形排序(如果物体不是凸面体也会产生错误) <br>结果并不是非常完美, 但是非常高效, 易于实现, 对于大多数游戏来说也够用了.</p>
<p>当然还可以采取一些措施来改进排序的精确度:</p>
<p>避免alpha混合! 你的不透明物体越多, 排序就越容易, 也越精确. 仔细思考一下, 真得每个地方都需要alpha混合吗? 如果关卡设计师要在玻璃窗上再加一层, 那你应该考虑把设计改成更易于实现的方案. 如果你正使用alpha混合来绘制树木之类的图形, 那考虑用alpha测试来代替它, 只分完全透明和完全不透明这两种情况, 这样不透明的地方仍然可以通过深度缓冲来排序.</p>
<p>放松, 不用担心. 可能排序错误并不是很严重呢? 你可以试着调整一下你的图形(让alpha通道更加柔和, 更加透明一些) 来让这个错误看起来没有那么显眼. 这个方法用在了我们的 Particle 3D sample中, 它并不会对单独一个烟雾中的粒子进行排序, 而是选择了一个合适的粒子纹理让它看起来是好的. 如果你把烟雾的纹理换成更加不透明的, 那排序错误可能就比较容易觉察了.</p>
<p>如果你有透明物体不是凸面体, 或许你可以尝试让它们更加&#8221;凸&#8221;一些? 就算它们不是完全地凸面体, 那它们越&#8221;凸&#8221;, 排序错误就越少. 还有就是考虑把复杂的模型分成多块, 这样它们就可以分开进行排序. 一个人体看起来一点也不像凸面体, 但你把它分成头, 胳膊, 驱干等几部分后, 每一块都接近凸面体了.</p>
<p>如果你有部分区域透明的纹理(如树叶), 并且图案边缘包含了一些半透明的像素用于反走样, 那你可以使用双pass渲染技术:</p>
<p>Pass 1: 绘制不透明部分: alpha混合关闭, alpha测试只接受100%不透明的区域, 深度缓冲开启 <br>Pass 2: 绘制边缘: alpha混合开启, alpha测试设置只接受alpha&lt;1的, 深度缓冲开启, 深度写入关闭 <br>以 每个物体渲染两次的代价, 为纹理中间完全不透明的部分提供了100%正确的深度缓冲排序, 和相对精确的半透明边缘排序. 这个方法为纹理裁剪的边缘进行了一些反走样, 同时也保证了不用对每一棵树或者草叶进行额外的排序. 在我们的 Billboard sample 中使用了这个技巧: 请阅读一下Billboard.fx中的pass和注释.</p>
<p>使用 z prepass. 当你需要淡出一个原来不透明的物体又不想透过它看到的是它自己的另一部分时, 这是一个好方法. 例如从右边看一个人类的身体. 如果它是玻璃做的, 你应该会希望透过右手臂看到躯干和左手臂. 但如果它是实心的(不透明)你会希望透过右手臂看到后面的背景, 而不应该是躯干和左手臂. 要达到这个目标需要这样做:</p>
<p>设置 ColorWriteChannels=None, 开启深度缓冲 <br>绘制物体到深度缓冲(不影响颜色缓冲) <br>设置ColorWriteChannels=All, DepthBufferFunction=Equal, 开启alpha混合 <br>再次绘制这个物体, 这样就只有最近的这一面与颜色缓冲进行混合了 <br>Published Wednesday, February 18, 2009 1:47 PM by ShawnHargreaves</p>
</div>
<img src ="http://www.cppblog.com/CrazyDev/aggbug/113735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CrazyDev/" target="_blank">CrazyDev</a> 2010-04-27 20:43 <a href="http://www.cppblog.com/CrazyDev/articles/113735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>