??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区二区久久精品,久久成人国产精品二三区,国产精品免费看久久久香蕉http://www.shnenglu.com/Leaf/category/13352.html~~zh-cnFri, 14 Jun 2013 21:23:59 GMTFri, 14 Jun 2013 21:23:59 GMT60镜面反射矩阵推导http://www.shnenglu.com/Leaf/archive/2013/06/15/201017.htmlRender DonkeyRender DonkeyFri, 14 Jun 2013 16:48:00 GMThttp://www.shnenglu.com/Leaf/archive/2013/06/15/201017.htmlhttp://www.shnenglu.com/Leaf/comments/201017.htmlhttp://www.shnenglu.com/Leaf/archive/2013/06/15/201017.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/201017.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/201017.html最q公司游戏正在准备上U,所以FlasCC也就没有研究了,偶尔有闲功夫Q也是玩?DMAX和UNITY3D?感觉不会3DMAXQ是一U局限?/p>

回到主题Q记录一下镜面反矩늚推导?/p>

在用Irrlicht和RTT做镜面效果的时候,用到了反矩c?是需要把摄相机镜像,渲染一个RTQ脓(chung)到镜面模型上。这个其实还U结了许久,因ؓ之前做水面渲染的时候,水面是^的,很好计算摄相机在水面以下的位|?但是换成镜面Q就不一样了Q因为镜面可能是L面?于是需要一个通用的反矩c?/p>

反射矩阵的计是Zq面的,因ؓQQ何反,都需要一个反面?/p>

所以,我们先给出^面表C?Plane(nx,ny,nz,d); 其中(nx,ny,nz)已经单位化?/p>

然后Q我们假讄间中有Q意一点P(x,y,z,1)

设这个点P以Plane为反面的镜像点为P1(x1,y1,z1,w)?/p>

 

Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/p>

Ҏ(gu)定理Q我们知道, 若两个点以某一点ؓ镜像Q则两个点的坐标之和除以2Q就刚好是中炏V?

q个理论我们用到q里的话Q?那这个中点就刚好是^面上的一个点?q面上的q个点就?P(x,y,z,1) - (nx,ny,nz,0)*D .  其中D是点P到^面的距离

而D=Plane dot P = (x*nx+y*ny+z*nz+d);

׃面的描述Q我们马上想刎ͼ那么要求点P1的话Q就是这?nbsp;

(P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D

=> P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D

=>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)

 

换成矩阵形式则ؓ

                            ?-2*nx*nx   -2*nx*ny         -2*nx*nz         0  |

                             | -2*ny*nx     1 - 2*ny*ny     -2*ny*nz         0  |

P1 = {x,y,z,1}   x   | -2*nz*nx     -2*nz*ny         1-2*nz*nz        0  |

                             | -2*d*nx      -2*d*ny           -2*d*nz           1  |

 

大功告成

btw:q是行主矩阵表示?/p>

Render Donkey 2013-06-15 00:48 发表评论
]]>
Deferred Shadinghttp://www.shnenglu.com/Leaf/archive/2011/03/13/141705.htmlRender DonkeyRender DonkeySun, 13 Mar 2011 03:56:00 GMThttp://www.shnenglu.com/Leaf/archive/2011/03/13/141705.htmlhttp://www.shnenglu.com/Leaf/comments/141705.htmlhttp://www.shnenglu.com/Leaf/archive/2011/03/13/141705.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/141705.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/141705.html一直在xq个东西Q最q忙里偷Ԍ深入C解了一下?首先Q我们说说gq渲染的好处。毕竟一个东西的产生Q是Z解决当前已有的东西不能解决的问题?/p>

image

Deferred Shading Tutorial下蝲

 

上面的文章很好地讨论了采用传l着色方案所需要面对的问题。主要是下面两种情况?/p>

image

image

 

而对于gq着色的W一个好处,是可以光照处理对物体渲染的开销?M*N 变ؓ M+N Q其中M为物体数目,N为光源数目)

image

 

延迟着色的一般框架图如下Q?/p>

image

 

image

image

 

image

image

image

 

延迟着色的好处

image

 

而gq着色面临的最大问题就是透明处理

image

 

另外Qgq着色主要得益于MRTQMulti Render Target).因ؓQMRT的限制即是gq着色本w的限制QDX SDK DOC中有提到?/p>

MSDNQ?a title="http://msdn.microsoft.com/en-us/library/bb147221(v=vs.85).aspx" >http://msdn.microsoft.com/en-us/library/bb147221(v=vs.85).aspx

 

RenderMonkey中也有gq着色例子。 我也用RenderMonkey重写了一个自q例子?/p>

image 

OK, 完事儿!Q!Q?/p>

Render Donkey 2011-03-13 11:56 发表评论
]]>
2D Skinned MeshQ?D的完全翻?带旋转)http://www.shnenglu.com/Leaf/archive/2011/01/14/138493.htmlRender DonkeyRender DonkeyThu, 13 Jan 2011 16:24:00 GMThttp://www.shnenglu.com/Leaf/archive/2011/01/14/138493.htmlhttp://www.shnenglu.com/Leaf/comments/138493.htmlhttp://www.shnenglu.com/Leaf/archive/2011/01/14/138493.html#Feedback2http://www.shnenglu.com/Leaf/comments/commentRss/138493.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/138493.html


一讲q骨骼动L学运的文章

http://www.cnblogs.com/neoragex2002/archive/2007/09/13/891945.html



两篇讲述骨骼动画原理和实现的文章 一也是用?DQ老外的那用的是DX 

http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html



I明{用C#写的一个,当然也可以下载源码。只是在他的BLOG中,他未解释M东西。ƈ且我也未曾下载Q何源码,不知是否源码中有文

http://www.shnenglu.com/lingjingqiu/archive/2008/06/07/52463.aspx



很不爽的是,许多例子或原理讲的时候没有带旋{。 其实那才是重头戏。 I明{的貌似有旋{Q可  阅读全文

Render Donkey 2011-01-14 00:24 发表评论
]]>
Reflect & Refract (以水渲染Z)http://www.shnenglu.com/Leaf/archive/2011/01/08/138172.htmlRender DonkeyRender DonkeySat, 08 Jan 2011 14:35:00 GMThttp://www.shnenglu.com/Leaf/archive/2011/01/08/138172.htmlhttp://www.shnenglu.com/Leaf/comments/138172.htmlhttp://www.shnenglu.com/Leaf/archive/2011/01/08/138172.html#Feedback1http://www.shnenglu.com/Leaf/comments/commentRss/138172.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/138172.html
我不是Shader帝,虽然知道Shader怎么写,但一直没仔细研究q。最q蛋D极,研究了下RenderMonkeyQ于是抽着几个看着比较有趣的效果做了一下?



先前的模型脓(chung)花http://www.shnenglu.com/Leaf/archive/2011/01/07/138093.html

和CUBE MAP http://www.shnenglu.com/Leaf/archive/2011/01/07/138106.html

是此次蛋疼期的产物之一?



q是先围观,上图再说
  阅读全文

Render Donkey 2011-01-08 22:35 发表评论
]]>
CubeMap视线反射方向计算详解http://www.shnenglu.com/Leaf/archive/2011/01/07/138106.htmlRender DonkeyRender DonkeyFri, 07 Jan 2011 05:32:00 GMThttp://www.shnenglu.com/Leaf/archive/2011/01/07/138106.htmlhttp://www.shnenglu.com/Leaf/comments/138106.htmlhttp://www.shnenglu.com/Leaf/archive/2011/01/07/138106.html#Feedback2http://www.shnenglu.com/Leaf/comments/commentRss/138106.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/138106.html
http://developer.nvidia.com/object/cube_map_ogl_tutorial.html NVIDIA官网上的 Opengl Cube texture mapping
http://www.zwqxin.com/archives/shaderglsl/review-cube-mapping-shader.html 某位兄弟的个人BLOG?
以上两位都适合OPENGL控?
本文l出一个DX HLSL例子。ƈ解释了反方向计的数学模型。希望能l大家一定的帮助?

CUBE映射主要分ؓ两步Q?
一、在VS中根据法U和观察位置计算反射方向Qƈ且得到观察空间中的反方向?
反射方向有两U计方法?
1、在世界坐标pȝ间中计算Q然后再计到的反方向{换到观察I间?q要求我们{入观察位|?
2、在观察I间中进行计,此时观察位置已经?,0,0,于是不需要传入观察位|,q且得到的向量即为所求。本文的代码采用?nbsp; 阅读全文

Render Donkey 2011-01-07 13:32 发表评论
]]>
使用投媄U理q行模型贴花(Mesh Decals)http://www.shnenglu.com/Leaf/archive/2011/01/07/138093.htmlRender DonkeyRender DonkeyThu, 06 Jan 2011 16:37:00 GMThttp://www.shnenglu.com/Leaf/archive/2011/01/07/138093.htmlhttp://www.shnenglu.com/Leaf/comments/138093.htmlhttp://www.shnenglu.com/Leaf/archive/2011/01/07/138093.html#Feedback3http://www.shnenglu.com/Leaf/comments/commentRss/138093.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/138093.html
二、在贴花PASS中,需要将全局混合开启,q设|相应的SRCBLEND(SRC_ALPHA)和DESTBLEND(DEST_ALPHA)倹{括号内为我用的倹{?

当然Q如果你不想让脓(chung)׃场景Q模型)混合Q则可以不开启。 

三、请注意U理的寻址方式以及U理边缘的ALPHA情况。 若纹理边~ALPHA不ؓ0Q则可以手工q行裁剪?

四、本文仅是采用了固定的投影方向和SHADER内部定义变量的方式来q行贴花渲染。 q且Qƈ未进行模型三角面剔除。所以若要用,则需要注意第一个问题?

五、本文灵感来源于此脓(chung)Qhttp://forums.create.msdn.com/forums/p/34339/198791.aspx

六、支持邮件交?BoYueGame#Gmail#com
  阅读全文

Render Donkey 2011-01-07 00:37 发表评论
]]>
两篇讲述Skinned Mesh原理的文?/title><link>http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Fri, 31 Dec 2010 15:04:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/137818.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/137818.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/137818.html</trackback:ping><description><![CDATA[<p>个h觉得Q对于一个东西,理解其根本才是王道?/p> <p>拿骨骼动画来说吧,DX的例子虽然可以让人清楚地知道骨骼动画是怎么动作的,q且知道了有.Xq种骨骼动画文g。 但着手时Q依然会被DX那神奇的各种框架弄得晕头转向。 q且M$向来是想人变?13Q而非学者。 </p> <p> </p> <p>在网上一搜Skinned Mesh, 会出来一大堆围绕着DX例子的解释,译Q或者什么什么的。 而下面这些文章,则充分讲qC其基本原理。 你可以离开DXQ离开OPENGL而全惯注地集中思考骨骼动d底是什么。 </p> <p> </p> <p><a href="http://www.shnenglu.com/images/cppblog_com/Leaf/WindowsLiveWriter/SkinnedMesh_14379/image_2.png"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://www.shnenglu.com/images/cppblog_com/Leaf/WindowsLiveWriter/SkinnedMesh_14379/image_thumb.png" width=439 height=283></a> </p> <p>Skinned Mesh原理解析和一个最单的实现CZ <a title=http://blog.csdn.net/n5/archive/2008/10/19/3105872.aspx >http://blog.csdn.net/n5/archive/2008/10/19/3105872.aspx</a></p> <p>q是一中文,虽然是前两年发表的了Q但依然适用。文中作者以?代码的方式@序渐q,q在最后详解了其DEMO的实C码。 可以说是真枪实弹的演?fn),而非I?/p> <p> </p> <p><a href="http://www.shnenglu.com/images/cppblog_com/Leaf/WindowsLiveWriter/SkinnedMesh_14379/image_4.png"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://www.shnenglu.com/images/cppblog_com/Leaf/WindowsLiveWriter/SkinnedMesh_14379/image_thumb_1.png" width=444 height=202></a> </p> <p>Skined Mesh With DX9.pdf  <a >www.google.com</a>    <a >www.baidu.com</a><br>也可以点?a style="COLOR: red" >q里下蝲</a><br></p> <p>q是一老外的,也是׃一文章中提到的。 搜烦引擎上随便一搜就能下到。 挺厚的,36늚PDF。 够你消耗一D|间的光阴了?/p> <img src ="http://www.shnenglu.com/Leaf/aggbug/137818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-12-31 23:04 <a href="http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HLSL中的MUL指o深层剖析http://www.shnenglu.com/Leaf/archive/2010/12/28/137588.htmlRender DonkeyRender DonkeyMon, 27 Dec 2010 16:05:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/12/28/137588.htmlhttp://www.shnenglu.com/Leaf/comments/137588.htmlhttp://www.shnenglu.com/Leaf/archive/2010/12/28/137588.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/137588.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/137588.html
一、部分背景内?

二、HLSL中的row-major matrix picking and column-major matrix picking

三、MUL规则

四、观察矩늚另类解释和TBNI间的类?

五、HLSL中矩늚构造(Z么WorldToTargentSpaceMatrix要左乘LightDirQ?



  阅读全文

Render Donkey 2010-12-28 00:05 发表评论
]]>
E序中的四元数表C法http://www.shnenglu.com/Leaf/archive/2010/12/20/137079.htmlRender DonkeyRender DonkeyMon, 20 Dec 2010 15:22:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/12/20/137079.htmlhttp://www.shnenglu.com/Leaf/comments/137079.htmlhttp://www.shnenglu.com/Leaf/archive/2010/12/20/137079.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/137079.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/137079.html
癑ֺ癄 http://baike.baidu.com/view/319754.htm

某位的博?http://caterpillar.onlyfun.net/Gossip/ComputerGraphics/QuaternionsRotate.htm

但当你看完这些后。再看着下面q样的代码,你能快速回q神来么Q?

  阅读全文

Render Donkey 2010-12-20 23:22 发表评论
]]>
Computing Tangent Space Basis Vectors for an Arbitrary Meshhttp://www.shnenglu.com/Leaf/archive/2010/12/20/137078.htmlRender DonkeyRender DonkeyMon, 20 Dec 2010 15:17:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/12/20/137078.htmlhttp://www.shnenglu.com/Leaf/comments/137078.htmlhttp://www.shnenglu.com/Leaf/archive/2010/12/20/137078.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/137078.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/137078.html
Z个Q意网格模型计其切线I间的基本向量(卛_U空间的T B N三个向量Q?

Modern bump mapping (also known as normal mapping) requires that tangent plane basis vectors be calculated for each vertex in a mesh. This article presents the theory behind the computation of per-vertex tangent spaces for an arbitrary triangle mesh and provides source code that implements the proper mathematics.

现在的bump mapping(或者normal mapping)需要每个顶点的切面的基本向量。这文章描qC逐顶点计Q意三角模型的切线I间?nbsp; 阅读全文

Render Donkey 2010-12-20 23:17 发表评论
]]>
四元CƧ拉角互?/title><link>http://www.shnenglu.com/Leaf/archive/2010/12/18/136861.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Sat, 18 Dec 2010 14:15:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/12/18/136861.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/136861.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/12/18/136861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/136861.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/136861.html</trackback:ping><description><![CDATA[     摘要: 本文乃{载,但原文地址不知。若作者有q看刎ͼ请及时认领?<br> <br> ?D囑Ş学中Q最常用的旋转表C方法便是四元数和欧拉角Q比L(fng)阉|h节省存储I间和方便插值的优点。本文主要归U了两种表达方式的{换,计算公式采用3DW卡?dng)坐标系Q? <br> <br>  <a href='http://www.shnenglu.com/Leaf/archive/2010/12/18/136861.html'>阅读全文</a><img src ="http://www.shnenglu.com/Leaf/aggbug/136861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-12-18 22:15 <a href="http://www.shnenglu.com/Leaf/archive/2010/12/18/136861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HDR效果?/title><link>http://www.shnenglu.com/Leaf/archive/2010/05/27/116431.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Wed, 26 May 2010 16:53:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/05/27/116431.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/116431.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/05/27/116431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/116431.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/116431.html</trackback:ping><description><![CDATA[     摘要: 首先我们先来看看HDR是什么意思?<br>HDR ?high dynamic rangQ高动态范_ 的简U?<br>OKQ现在我们知道了什么叫高动态范围?<br>q是q把隐,先看看截图。?nbsp; <a href='http://www.shnenglu.com/Leaf/archive/2010/05/27/116431.html'>阅读全文</a><img src ="http://www.shnenglu.com/Leaf/aggbug/116431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-05-27 00:53 <a href="http://www.shnenglu.com/Leaf/archive/2010/05/27/116431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CPU GPU设计工作原理《{?/title><link>http://www.shnenglu.com/Leaf/archive/2010/05/18/115646.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Tue, 18 May 2010 01:51:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/05/18/115646.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/115646.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/05/18/115646.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/115646.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/115646.html</trackback:ping><description><![CDATA[     摘要: 我知道这很长,但是,我坚持看完了.希望有幸看到q文章ƈ对图形方面有兴趣的朋?也能坚持看完.一定大有收?毕竟知道它们到底是怎么"U下勾搭"?会有利于我们用程序来指挥它们....(q是我加上去? <br> <br>原文从这里开? <br> <br>要说到设计的复杂E度Q那q是CPU了!q个不用讨论Q很单的道理你看看显卡芯片的更新速度和CPU的更新速度可见一斑了。还是简单说说他们的设计原理吧?<br>  <a href='http://www.shnenglu.com/Leaf/archive/2010/05/18/115646.html'>阅读全文</a><img src ="http://www.shnenglu.com/Leaf/aggbug/115646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-05-18 09:51 <a href="http://www.shnenglu.com/Leaf/archive/2010/05/18/115646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]Irrlicht(鬼火引擎Q中多设备的支持http://www.shnenglu.com/Leaf/archive/2010/04/26/113558.htmlRender DonkeyRender DonkeyMon, 26 Apr 2010 01:10:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/04/26/113558.htmlhttp://www.shnenglu.com/Leaf/comments/113558.htmlhttp://www.shnenglu.com/Leaf/archive/2010/04/26/113558.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/113558.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/113558.html阅读全文

Render Donkey 2010-04-26 09:10 发表评论
]]>
关于?D线D》这本书http://www.shnenglu.com/Leaf/archive/2010/04/26/113552.htmlRender DonkeyRender DonkeySun, 25 Apr 2010 16:03:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/04/26/113552.htmlhttp://www.shnenglu.com/Leaf/comments/113552.htmlhttp://www.shnenglu.com/Leaf/archive/2010/04/26/113552.html#Feedback4http://www.shnenglu.com/Leaf/comments/commentRss/113552.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/113552.html阅读全文

Render Donkey 2010-04-26 00:03 发表评论
]]>
切线I间Q纹理空_的计?/title><link>http://www.shnenglu.com/Leaf/archive/2010/03/23/110327.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Mon, 22 Mar 2010 16:03:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/03/23/110327.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/110327.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/03/23/110327.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/110327.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/110327.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Ҏ(gu)姚体; COLOR: #000080; FONT-SIZE: 18pt">l于扑ֈ了两让人易懂的文章Q这两篇l合着看,很容易看清计过E,没有惌中的那么复杂<br><br>q是一老外的:<a >http://www.terathon.com/code/tangent.html</a><br><br><br><br>q是另一个大哥的Q?a >http://jingli83.blog.sohu.com/94746672.html</a><br><br>两篇l合看,Ҏ(gu)其效Q?br><br>有了q两的理解后,再去看其它的关于切线I间的文章,׃会再怸着东南西北了!<br><br></p> <img src ="http://www.shnenglu.com/Leaf/aggbug/110327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-03-23 00:03 <a href="http://www.shnenglu.com/Leaf/archive/2010/03/23/110327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSAOhttp://www.shnenglu.com/Leaf/archive/2010/03/22/110271.htmlRender DonkeyRender DonkeyMon, 22 Mar 2010 02:19:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/03/22/110271.htmlhttp://www.shnenglu.com/Leaf/comments/110271.htmlhttp://www.shnenglu.com/Leaf/archive/2010/03/22/110271.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/110271.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/110271.htmlSSAO全称“Screen-Space Ambient Occlusion” (屏幕I间环境光遮?。其最先运用于 CrysisQ孤岛危机) 游戏中,通过GPU?shader实现

  SSAO通过采样象素周围的信息,q进行简单的深度值对比来计算物体w上环境光照无法到达的范_从而可以近似地表现出物体n上在环境光照下生的轮廓阴媄。可以利?#8220;逐象素场景深度计?#8221;技术计得出的深度值直接参与运?

  现在的效果确实错误还比较大,应该先进行简单的I间划分Q或cM处理Q然后计?

  不过个h认ؓq种Ҏ(gu)只是q似地模拟,效果q不正确Q但实能增强场景的层次感,让画面更l腻Q让场景l节更加明显?

  不同于显卡驱动中普通的AO选项Qburnout的SSAO是全动态的Q无需预处理,无loading旉Q无需消耗内存,不用CPUQ全由GPU处理Q对GPU有较大的消?

  SSAO默认是关闭的Q可以在游戏视频选项中打开

  评测

  ?950GT下跑Q加了ssao后,下降?5%。而且Q显卡性能低Q下降的厉実뀂效率消耗主要是在于要多渲染一遍场景到深度以及之后q行的ssao处理。这遍可以进行优化,如果物体的纹理不带alpha,则可以把他们都合在一Ҏ(gu)几批渲染。至于深度图的尺?Q我采用了与H口一L(fng)寸Q这L(fng)度高。也可以采用低分辨率Q但效果会有锯Q还需要进行模p处理才比较自然。当Ӟ如果本来q了gq渲染技术,本来有深度图了Q那可以直接拿来用了?

  与PRTҎ(gu)

  PRT用于静态场景确实是个比较好的方案,毕竟可以预计。但是对于动态的场景Q还需要动态更新。另外,PRT的质量依赖于|格的细分程度,要是模型太简Q则效果也糟p?

  因此 QPRT对于虚拟现实目里的高楼大厦{场景(q些模型都是很精的)来说Q就昑־不合适了

  目前已发行的游戏中,q用SSAO的游戏有

  CrysisQ孤岛危机)

  Burnout(TM) Paradise The Ultimate BoxQ火爆狂?天堂Q?

  帝国Q全面战?

  另外Q星际争?的开发也q用CSSAO

什么是SSAOQ?/h3>

  从HL2开始,众多游戏公司开始对于如何表?#8220;间接光照”q行研究Q这些昙׃现的技术有Q?

  q用于HL2的radiosity Normal Maps技术,效果比较垃圾

  q用于Stalker的GIQ?Q技术,法不好Q开销巨大?

  初期Crytek准备q用在Crysis上的Photon MappingQ光子映)技术,开销同样比较垃圾Q被抛弃?

  随后Crytek又准备运用在Crysis上的Real-Time Ambient MapQ实时环境光照脓(chung)图,URAMQ,q个是与之前Stalker使用的技术比较类似的Q也是最接近SSAO的一个技术?

  不过Crytek不愧?#8220;间接光照”研究上的先锋Q其技术员对于RAMq行了改q,新的法成ؓ了如今的SSAO

  SSAO开与关的区别所?

  SSAOQScreen-Space Ambient OcclusionQ是一个纯_的渲染技术,或者说Q是一个算法。虽然从上文知道是ؓ了实?#8220;间接光照”的效果,不过从技术上Ԍ是一个对于AOQAmbient Occlusion环境光吸Ӟ也就是NV 185.20驱动加入的那个,一个渲染技术,我们可以在Maya{?D软g中可以见刎ͼ的一个D函数Qƈ且以此ؓ据进行实时渲染?

  SSAO比v185.20驱动中AO的优点:

  与场景复杂性无?

  无数据预处理Q无loading旉Q无pȝ内存分配

  动态渲?

  每个像素工作方式始终一?

  无CPU占用Q完全通过GPU执行

  与流行显卡的线整合相当Ҏ(gu)

  ~点也是有的Q?

  ׃采样全部在可见点上进行的Q对于不可见点的遮挡影响会有错误的估?

  颗粒感比较重Q需要与动态模p紧密配合才能取得较好效果?

SSAO屏幕I间环境光遮蔽的q作方式

  其实了解了AO环境光遮蔽的原理QSSAOQ屏q空间环境光遮蔽Q已l可以融会诏通,SSAO通过采样像素周围的信息,q进行简单的深度值对比来计算物体w上环境光照无法到达的范_从而可以近似地表现出物体n上在环境光照下生的轮廓阴媄?

  具体的运作方式上QSSAO会利用GPU计算出指定像素的I间坐标Q然后以此坐标ؓ基点Q在周围选择C采样点进行采P然后采L(fng)的空间坐标投影回屏幕坐标Q对深度~冲q行采样Q最后得到采L(fng)的深度|再进行后l计,最l得C个遮挡倹{?

  

SSAO?wbr>?wbr>?wbr>?wbr>?wbr>?wbr>?wbr>局?wbr>?wbr>?wbr>?wbr>

SSAO屏幕I间环境光遮蔽实C较好的全局光照效果

  因ؓ是基于指定空间的全局计算模式Q因此SSAO实现效果的优劣取决于法Q包括空间的指定范围和采L(fng)的选取{等。需要指明的是,不同游戏Q引擎)在SSAO的细节算法方面可能不相同,另外SSAOq会l合其它光照技术共同达成游戏画面的渲染Q所以SSAO在很多游戏中不会有专门的开关选项Q其最l的表现l果可能是与其它技术共同作用的l果?/p>

Render Donkey 2010-03-22 10:19 发表评论
]]>
渲染状态管?/title><link>http://www.shnenglu.com/Leaf/archive/2010/01/29/106723.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Fri, 29 Jan 2010 06:40:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/01/29/106723.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/106723.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/01/29/106723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/106723.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/106723.html</trackback:ping><description><![CDATA[转自Q?a >http://www.abc188.com/info/html/wangzhanyunying/jianzhanjingyan/20080417/71683.html</a><br> <div id="444i6we" class=intro>文档介: 提高3D囑փE式的性能是个很大的课题。图像程式的优化大致能够分成两大dQ一是要有好的场景管理程式,能快速剔除不可见多边形,q根据对象距相机q近选择合适的l节QLODQ;二是要有好的渲染E式Q能快速渲染送入渲染线的可见多边Ş?我们知道Q?/div> <div id="w2uw2o4" class=content>   <span id="2ci44io" class=articlebody>文介: <br>  提高3D囑փE式的性能是个很大的课题。图像程式的优化大致能够分成两大dQ一是要有好的场景管理程式,能快速剔除不可见多边形,q根据对象距相机q近选择合适的l节QLODQ;二是要有好的渲染E式Q能快速渲染送入渲染线的可见多边Ş?<br>  我们知道Q用OpenGL或Direct3D渲染囑փӞ首先要配|渲染状态,渲染状态用于控制渲染器的渲染行为。应用程式能够通过改变渲染状态来控制OpenGL或Direct3D的渲染行为。比如配|Vertex/Fragment Program、绑定纹理、打开深度试、配|雾效等?<br>  改变渲染状态对于显卡而言是比较耗时的操作,而假如能合理理渲染状态,避免多余的状态{换,明显提升图像程式性能。这文章将讨论渲染状态的理?<br><br>文档目录Q?<br>  基本思想 <br>  实际问题 <br>  渲染脚本 <br><br>文内容Q?<br><br>基本思想 <br>  我们考虑一个典型的游戏场景Q包含h、动物、植物、徏{、交通工兗武器等。稍微分析一下就会发玎ͼ实际上场景里很多对象的渲染状态是相同的,比如M的h和动物的渲染状态一般都相同QQ何的植物渲染状态也相同Q同样徏{、交通工兗武器也是如此。我们能够把具备相同的渲染状态的对象归ؓ一l,然后分组渲染Q对每组对象只需要在渲染前配|一ơ渲染状态,q且q能够保存当前的渲染状态,配置渲染状态时只需改变和当前状态不相同的状态。这栯够大大减多余的状态{换。下面的代码D|CZq种Ҏ(gu)Q?<br><br>// 渲染状态组链表Q由场景理E式填充 <br>RenderStateGroupList groupList; <br>// 当前渲染状?<br>RenderState curState; <br><br>…… <br><br>// 遍历链表中的每个l?<br>RenderStateGroup *group = groupList.GetFirst(); <br>while ( group != NULL ) <br>{ <br>// 配置该组的渲染状?<br>RenderState *state = group->GetRenderState(); <br>state->ApplyRenderState( curState ); <br><br>// 该渲染状态组的对象链?<br>RenderableObjectList *objList = group->GetRenderableObjectList(); <br>// 遍历对象链表的每个对?<br>RenderableObject *obj = objList->GetFirst(); <br>while ( obj != NULL ) <br>{ <br>// 渲染对象 <br>obj->Render(); <br><br>obj = objList->GetNext(); <br>} <br><br>group = groupList.GetNext(); <br>} <br><br>其中RenderStatecȝApplyRenderStateҎ(gu)形如Q?<br>void RenderState::ApplyRenderState( RenderState &curState ) <br>{ <br>// 深度试 <br>if ( depthTest != curState.depthTest ) <br>{ <br>SetDepthTest( depthTest ); <br>curState.depthTest = depthTest; <br>} <br><br>// Alpha试 <br>if ( alphaTest != curState.alphaTest ) <br>{ <br>SetAlphaTest( alphaTest ); <br>curState.alphaTest = alphaTest; <br>} <br><br>// 其他渲染状?<br>…… <br>} <br><br>  q些分组的渲染状态一般被UCؓMaterial或Shader。这里Material不同于OpenGL和Direct3D里面用于光照的材质,Shader也不同于OpenGL里面的Vertex/Fragment Program和Direct3D里面的Vertex/Pixel Shader。而是指封装了的显卡渲染图像需要的状态(也包括了OpenGL和Direct3D原来的Material和ShaderQ?<br><br>  从字面上看,MaterialQ材质)更侧重于对象表面外观属性的描述Q而ShaderQ这个词实在不好用中文表C)则有用程式控制对象表面外观的含义。由于显卡可~程线的引入,渲染状态中包含了Vertex/Fragment ProgramQ这些小E式能够控制物体的渲染,所以我觉得封装的渲染状态称为Shader更合适。这文章也称之ؓShader?<br><br>  上面的代码段只是单的演示了渲染状态管理的基本思\Q实际上渲染状态的理需要考虑很多问题?<br>渲染状态管理的问题 <br>  <br><br> 消耗时间问?<br>  改变渲染状态时Q不同的状态消耗的旉q不相同Q甚臛_不同条g下改变渲染状态消耗的旉也不相同。比如绑定纹理是个很耗时的操作,而当U理已在昑֍的纹理缓存中Ӟ速度׃很快。而且随着g和Y件的发展Q一些很耗时的渲染状态的消耗时间可能会有减。因此ƈ没有一个准的消耗时间的数据?<br><br>  虽然消耗时间无法量化,情况不同消耗的旉也不相同Q但一般来说下面这些状态{换是比较消耗时间的Q?<br><br>Vertex/Fragment Program模式和固定管U模式的转换QFFQFixed Function PipelineQ?<br><br>Vertex/Fragment Program本nE式的{?<br><br>改变Vertex/Fragment Program帔R <br><br>U理转换 <br><br>点和烦引缓存(Vertex & Index BuffersQ{?<br><br>  有时需要根据消耗时间的多少来做折衷Q下面将会碰到这U情c?<br><br><br><br> 渲染状态分c?<br>  实际场景中,往往会出现这L(fng)情况Q一cd象其他渲染状态都相同Q只是纹理和点、烦引数据不同。比如场景中的hQ只是n材、长相、服装等不同Q也是说只有纹理、顶炏V烦引数据不同,而其他如Vertex/Fragment Program、深度测试等渲染状态都相同。相反,一般不会存在纹理和点、烦引数据相同,而其他渲染状态不同的情况。我们能够把U理、顶炏V烦引数据不归入到Shader中,q样场景中Q何的人都能够用一个Shader来渲染,然后在这个Shader下对U理q行分组排序Q相同纹理的人放在一h染?<br> 多道渲染QMultipass RenderingQ?<br>  有些比较复杂的图像效果,在低显卡上需要渲染多ơ,每次渲染一U效果,然后用GL_BLEND合成为最l效果。这U方法叫多道渲染Multipass RenderingQ渲染一ơ就是个pass。比如做逐像素凹凸光照,需要计环境光、O光凹凸效果、高光凹凸效果,在NV20昑֍上只需?个passQ而在NV10昑֍上则需?个pass。Shader应该支持多道渲染Q即一个Shader应该分别包含每个pass的渲染状态?</div> <br>不同的pass往往渲染状态和U理都不同,而顶炏V烦引数据是相同的。这带来一个问题:是以对象为单位渲染,一ơ渲染一个对象的MpassQ然后渲染下一个对象;q是以pass为单位渲染,W一ơ渲染Q何对象的W一个passQ第二次渲染M对象的第二个pass。下面的E式D|CZq两U方式: <br><br>以对象ؓ单位渲染 <br><br>// 渲染状态组链表Q由场景理E式填充 <br>ShaderGroupList groupList; <br><br>…… <br><br>// 遍历链表中的每个l?<br>ShaderGroup *group = groupList.GetFirst(); <br>while ( group != NULL ) <br>{ <br>Shader *shader = group->GetShader(); <br><br>RenderableObjectList *objList = group->GetRenderableObjectList(); <br><br>// 遍历相同Shader的每个对?<br>RenderableObject *obj = objList->GetFirst(); <br>while ( obj != NULL ) <br>{ <br>// 获取shader的pass?<br>int iNumPasses = shader->GetPassNum(); <br>for ( int i = 0; i < iNumPasses; i ) <br>{ <br>// 配置shaderWi个pass的渲染状?<br>shader->ApplyPass( i ); <br>// 渲染对象 <br>obj->Render(); <br>} <br><br>obj = objList->GetNext(); <br>} <br><br>group = groupList->GetNext(); <br>} <br><br><br>以pass为单位渲?<br><br>// 渲染状态组链表Q由场景理E式填充 <br>ShaderGroupList groupList; <br><br>…… <br><br>for ( int i = 0; i < MAX_PASSES_NUM; i ) <br>{ <br>// 遍历链表中的每个l?<br>ShaderGroup *group = groupList.GetFirst(); <br>while ( group != NULL ) <br>{ <br>Shader *shader = group->GetShader(); <br>int iNumPasses = shader->GetPassNum(); <br>// 假如shader的pass数小于@环次敎ͼ跌此shader <br>if( i >= iNumPasses ) <br>{ <br>group = groupList->GetNext(); <br>continue; <br>} <br><br>// 配置shaderWi个pass的渲染状?<br>shader->ApplyPass( i ); <br><br>RenderableObjectList *objList = <br>group->GetRenderableObjectList(); <br><br>// 遍历相同Shader的每个对?<br>RenderableObject *obj = objList->GetFirst(); <br>while ( obj != NULL ) <br>{ <br>obj->Render(); <br><br>obj = objList->GetNext(); <br>} <br><br>group = groupList->GetNext(); <br>} <br>} <br><br><br><br>  q两U方式各有什么优~点呢? <br><br>  以对象ؓ单位渲染Q渲染一个对象的W一个pass后,马上紧接着渲染q个对象的第二个passQ而每个pass的顶点和索引数据是相同的Q因此第一个pass顶点和索引数据送入昑֍后,昑֍Cache中已有了q个对象点和烦引数据,后箋pass不必重新顶点和索引数据拷到昑֍Q因此速度会很快。而问题是每个pass的渲染状态都不同Q这使得实际上每ơ渲染都要配|新的渲染状态,会生大量的多余渲染状态{换?<br><br>  以pass为单位渲染则正好相反Q以Shader分组Q相同Shader的对象一h染,能够只在q组开始时配置一ơ渲染状态,相比以对象ؓ单位Q大大减了渲染状态{换。可是每ơ渲染的对象不同Q因此每ơ都要将对象的顶点和索引数据拯到显卡,会消耗不时间?<br>  可见惛_渲染状态{换就要频J拷贝顶点烦引数据,而想减少拯点索引数据又不得不增加渲染状态{换。鱼和熊掌不可兼?:-( <br>  ׃g条g和场景数据的情况比较复杂Q具体哪U方法效率较高ƈ没有定式Q两U方法都有h使用Q具体选用那种Ҏ(gu)需要在实际环境试后才能知道?<br><br><br> 多光源问?<br>待箋…… <br><br><br><br> 阴媄问题 <br>待箋…… <br><br><br>  <br><br>渲染脚本 <br>  现在很多囑փE式都会自己定义一U脚本文档来描述Shader?<br><br>  比如较早的OGREQObject-oriented Graphics Rendering EngineQ面向对象图像渲染引擎)的Material脚本QQuake3的Shader脚本Q连同刚问世不久的Direct3D的Effect FileQnVIDIA的CgFX脚本Q文格式和Direct3D Effect File兼容Q,ATI RenderMonkey使用的xml格式的脚本。OGRE Material和Quake3 Shaderq两U脚本比较有历史了,不支持可~程渲染线。而后面三U比较新的脚本都支持可编E渲染管Uѝ?<br><br><br><br>脚本 Ҏ(gu)?范例 <br>OGRE Material 装各种渲染状态,不支持可~程渲染线 >>>> <br>Quake3 Shader 装渲染状态,支持一些特效,不支持可~程渲染线 >>>> <br>Direct3D Effect File 装渲染状态,支持multipassQ支持可~程渲染线 >>>> <br>nVIDIA CgFX脚本 装渲染状态,支持multipassQ支持可~程渲染线 >>>> <br>ATI RenderMonkey脚本 装渲染状态,支持multipassQ支持可~程渲染线 >>>> <br><br><br><br>  使用脚本来控制渲染有很多好处Q?<br><br>能够很方便的修改一个物体的外观而不需重新~写或编译程?<br><br>能够用外围工具以所见即所得的方式来创建、修改脚本文(cMATI RenderMonkey的工作方式)Q便于美工、关卡设计h员设定对象外观,建立外围工具和图像引擎的联系 <br><br>能够在渲染时相同外观属性及渲染状态的对象Q也是Shader相同的对象)归ؓ一l,然后分组渲染Q对每组对象只需要在渲染前配|一ơ渲染状态,大大减少了多余的状态{?</span> <img src ="http://www.shnenglu.com/Leaf/aggbug/106723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-01-29 14:40 <a href="http://www.shnenglu.com/Leaf/archive/2010/01/29/106723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化3D囑Ş水U?/title><link>http://www.shnenglu.com/Leaf/archive/2010/01/29/106721.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Fri, 29 Jan 2010 05:48:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2010/01/29/106721.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/106721.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2010/01/29/106721.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/106721.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/106721.html</trackback:ping><description><![CDATA[<p>转自Q?a >http://hi.baidu.com/freedomknightduzhi/blog/item/7e401a9b2521eeb3c9eaf4f1.html</a><br>在用NVIDIA PerfHUD 5 Launcher的时候,明显发现现在的CPU旉和GPU旉不均衡,于是考虑优化?br>下面是参考NVIDIA的OGP开始ȝ?br>优化代码通常是找出瓶颈,对瓶颈进行优化,q里暂不考虑CPU内部的优化方法,主要记录CPU->GPU?D渲染水U的瓉查出Ҏ(gu)以及优化手段?br>若仅希望q行CPU斚w的优化,可用一些辅助工P如Inter的Intel(R) VTune(TM) Performance AnalyzerQIntel(R) Thread Profiler 3.1QAMD的CodeAnalyst{?br>q行优化的步骤如上面所_1Q找出瓶颈,2Q对其优化?br>最通用也最有效的找出瓶颈的Ҏ(gu)当然是找到核心函敎ͼ降低它的旉周期和负P看是否对E序性能有大的媄响。优化的手段多是拆东补西而已Q即Q将影响性能的瓶颈中的Q务分配给其他较空闲的部分q行处理Q来q整体所消耗的旉?br>那么来看一下图形渲染流水线大致q程?br>1Q系lCPU从内存中d几何点 -> 输送到GPU昑֭ -> 输送到GPU高速顶点缓冲区 -> GPU点着?-> GPU建立三角?-> GPU矩阵变换 -> GPU光栅?-> 3<br>2Q系lCPU从内存中dU理信息 -> 输送到GPU昑֭ -> 输送到GPU高速纹理缓冲区( DX10.0以后可与点~冲共同Q不再强制区?) -> 3<br>3Q片D늝色光栅化 -> 输出GPU后台~冲q行渲染?br>那么Q很单的有几大模块在其中可能存在着瓉的限制?/p> <p>1QCPU本n逻辑计算能力的限制?br><br>2QCPU到GPU昑֭AGP传输能力的限?br>Q?Q顶?br>Q?Q纹?br>3QGPU昑֭到高速缓冲区的传输带宽限?br>Q?Q纹理传输带宽限?nbsp;    Q显?>高速缓冲区Q?br>Q?Q光栅化完毕后的传输带宽限?Q高速缓冲区->昑֭Q?br>注:q里不考虑 点 传输的带宽限Ӟ因ؓq个限制极小<br>4QGPU高速缓冲区内部处理能力的限制?br>Q?Q顶点变换着色处理能力限制?br>Q?Q顶Ҏ(gu)大数量支持限制?br>Q?Q三角型建立限制?br>Q?Q光栅化限制?br>Q?Q象素着色限制?br>5Q内存过限制?br>6Q显卡显存过,以及其他gCaps限制?/p> <p>上述是常见3D囑Ş渲染水U中的瓶颈限Ӟ那么我们下一步去一一定Q可能是哪方面的瓉。简单的Ҏ(gu)是检FPS?br>注意1Q许多瓶颈可能由于硬件更变而更变?br>注意2QDebug模式和Release模式的瓶颈表现未必相同?br>注意3Q查看FPS时候一定关闭垂直同步?br>1Q改变色深,16bit,32bitQ这个是直接影响 渲染缓?的大的Q若修改了此之后,FPS有较大变化,则是׃3.2 传输带宽限制?br>注:q里需要改变所有渲染对象的色深?br>2Q改变纹理大尺寸,改变U理qo方式Q若修改了此之后,FPS有较大变化,则是׃3.1 U理传输带宽的限??2.2 U理AGP传输能力限制?br>注:U理qo方式中,点过滤速度 > U性过滤速度 > 三角面过滤速度 > 各向异性过滤速度 若改变纹理过滤方式就FPS提高了,则是3.1 U理传输带宽的限制。这步是纹理数据从昑֭q输到GPU高速纹理缓冲区的过E?br>3Q改变桌面分辨率Q若修改了此之后,FPS有较大变化,则是׃ 4.4 光栅化限?或是 4.5 象素着色Shader限制?br>此时减少 PixelShader指o数量Q若修改了此之后,FPS有较大变化,则是׃ 4.5 象素着色Shader限制Q若没有较大变化Q则是由?4.4 光栅化限制?br>4Q减?VertexShader 指o数量Q若修改了此之后,FPS有较大变化,则是׃ 4.1 点变换着色处理能力限制?br>5Q减顶Ҏ(gu)量和AGP传输速率Q若修改了此之后,FPS有较大变化,则是׃ 4.2 点最大数量支持限??2.1 点AGP传输能力限制?br>6Q若以上都不是,则是 1.0 CPU逻辑计算能力限制?br>注:该项也可Ҏ(gu)NVIDIA PerfHUD来检CPU和GPU的空闲时间来判定Q若GPUI闲旉q多Q则说明是由于CPU计算能力或AGP传输能力D?br>该项也可用简单的更换CPUQ而不更换GPU的方式来判定?br>7Q看资源理器,CPU占用率,内存占用率,可以知道是否是由?.0 CPU本n逻辑计算能力的限?或是 5.0内存q小限制?br>8Q看DX SDK自带的CapsViewer可以知道昑֍的支持性,以获得更多更准确的判定?br>9Q在BIOS中更变APGP?X模式Q若修改了此之后,FPS有较大变化,则是׃2.1 ?2.2 AGP传输能力限制?br>10Q降低GPU配置q行判定,此时要注意两,一是降低GPU的运行频率,一是降低GPU昑֭性能和大,可以定GPU斚w的问题大致所在?br>11Q删除一些游戏中涉及?物理QAIQ逻辑 {占用大量CPU效率的代码以获得更强的针Ҏ(gu)?br>12Q对角色Q地形,静态模型,阴媄 {设|渲染开养I以更明确的确定问题所在?/p> <p>优化Ҏ(gu)Q?br>一Q整体优化?br>1Q减小扚w作业<br>Q?Q让一个顶点缓冲中更多点。(1024点以上较适合Q?br>Q?Q少Draw。(量一ơ性多渲染些三角ŞQ减渲染次敎ͼ<br>Q?Q尽量将多个寸的U理文g合ƈZ个尺寸大的纹理文Ӟ减少零碎的小U理文g数量?br>Q?Q用VertexShader一些关pȝ密的几何体打包在一赗(VS2.0已l存?56?D向量常数Q?br>2Q逻辑排序优化<br>Q?Q尽量在逻辑层将点q行一定的排序以减在GPU高速缓冲区中的重新排布?br>Q?Q尽量将渲染对象在逻辑层按照深度由屏幕->内部排序Q减不必要的深度拣选?br>Q?Q尽量用烦引条带或索引列表<br>Q?Q根据渲染状态和渲染对象对纹理进行基本排?br>3Q减不必要的渲染(CPU层的基本二分四叉八叉q里不再Q?br>Q?Q在多Pass渲染Ӟ在第一个渲染Pass上对每个渲染对象加以咨询Q当W一个Pass中该渲染对象渲染象素量达不到指定标准Q则后箋Pass不再对其q行渲染?br>Q?Q对一些重复渲染(如太阳眩光特效)需要进行计敎ͼ辑ֈ指定数量卛_止渲染或q行分布式渲染?br>Q?Q对一些复杂的模型讄基本的包围盒判定其渲染必要性?br>4Q减线E锁定导致的不必要等?br>Q?QCPU Lock了一个资源,{待GPUq行渲染Q此时常见做法有{待GPU渲染Q中间期间CPUl常处于IdleI闲状态,此时lCPU其他的事情做Q如Z一个资源做好基本准备或q行逻辑处理?br>5Q减或q_分布CPU压力Q实际上Q大部分E序是CPU逻辑计算限制的)<br>Q?QCPU压力重点在以下方面可能存在: AIQIOQ网l,复杂逻辑Q这些部分可q行CPU瓉试以确定优化方向?br>Q?Q优化方针:宁可GPU忙碌也要CPU减压?br>Q?Q用文章开始时我提到的一些工具去查找CPU中不必要的汇~空循环以及不必要的CPUI闲?br>二:局部优化?br>6QAGP传输瓉<br>Q?Q当q多数据通过AGP8X从CPU内存传递到GPU昑֭Ӟ我们可以选择以下方式优化?br>   [1]减小点个数<br>   [2]减少动态顶点个敎ͼ使用VertexShader动画替代?br>   [3]正确使用APIQ设|正参敎ͼ避免动态顶点和U理~冲区的创徏理?br>   [4]Ҏ(gu)g配置属性确定适合?缓ԌU理~冲Q静态顶点缓?的大?br>Q?Q避免用无序或不规则数据传输?br>   [1]点数量寸应当?2的整数倍。(可用顶点压~,再在VertexShader中对点数据q行解压~)<br>   [2]保点的有序性。(在CPU逻辑层对其进行排序后传输QNVTriStripq个工具可以帮我们生成优化的高效的有序的Mesh点数据Q?br>Q?Q具体到API层面的几何Mesh传输<br>   [1]对于静态几何体Q创?只写的顶点缓Ԍ且,仅写入一ơ?br>   [2]对于动态几何体Q在E序初始创徏一个动态顶点缓Ԍ之后每桢初始锁定DISCARDQ进行NOOVEWRITE而不要进行DISCARDQDISCARD的耗时不是NOOVEWRITE可比的?br>   [3]基本原则Q少创徏~冲区,多对其进行重复用,减少锁定ơ数?br>7Q顶点变换传输处理瓶颈(׃GPU有强大的点处理能力Q一般在点变换斚w不会有瓶颈出玎ͼ但假若出C。。)<br>Q?Q顶点太?br>   [1]使用l节LodQ一般v?-3ULodp够了?br>Q?Q顶点处理过于复?br>   [1]减少灯光数量Q降低灯光复杂度Q方向^行光效率 > 点光源效?> 聚光灯效?Q?br>   [2]减少点着色器指o数量Q避?28条以上指令,避免大量的分支指?br>   [3]寚w点进行CPU层逻辑排序<br>   [4]能在CPU中进行计的在CPU中进行计,传递常量给GPU<br>   [5]减少和避免CG/HLSL之中?mov 指o。即使用了Q也要重Ҏ(gu)意?br>8Q大部分情况?4.3 三角形徏立限?以及 4.4 光栅化限?是不会成为瓶颈的Q但Q当三角形数量过多或者光栅化时每个三角Ş点数据q于复杂时可能会出现q种瓉Q此时减三角ŞLQ用VS或减Z-cull三角都是有效的方法?br>9Q象素着色器的瓶颈(在DX7之前Q全是固定渲染管道,一般来说传输量和着色器之间的计是均衡的,但是DX8开始可~程水道开始,PixelShader的计量开始增q,数据传输量通常相对来说比较?yu)了。)<br>Q?Q需处理的纹理片D过多过?br>   [1]在CPU层按?屏幕->向内 Z-Buffer的顺序排序传入,q按照这个顺序进行渲染?br>   [2]多Pass渲染Ӟ考虑在第一个渲染Pass中关闭特效ƈ让第一个Pass负责Z-buffer的处理。这L(fng)话,后箋Pass中可以避免渲染不要的U理片段?br>Q?Q每个纹理片D늚处理q于复杂<br>   [1]大段的长着色器指o会很大降低效率Q尝试减着色器指o长度<br>   [2]使用向量操作Qƈ行co-issuing来减指令数量?br>   [3]混合使用配对的简单的texture和combinerl合指o?br>   [4]使用Alpha混合器提高性能?br>   [5]考虑寚w׃q行Lod计算?br>   [6]在DX10开始,考虑顶点缓冲移做象素缓冲进行用?br>Q?Q额外的优化Ҏ(gu)<br>   [1]使用fx_12_ֺ<br>   [2]使用fp16指o<br>   [3]使用Pixel_Shader2.0的时候开启ps_2_a描述开?br>   [4]减少寄存器的临时存取<br>   [5]减少不必要的_ֺ要求<br>   [6]量使用低版本的ShaderQ但避免使用VS1.0Q已l被VS3.0抛弃了)<br>10Q纹理脓(chung)囑֯致的瓉<br>Q?Q优化方法?br>   [1]U理qo旉免?三角面性过??各相异性过滤,Ҏ(gu)需求除外,一般线性过滤已l可以做的很好?br>   [2]即使用各相异性过滤,也要降低相异性比率。用了各相异性过滤的话,则可以尽量减三角面性过滤?br>   [3]降低U理分L率,避免使用不必要的高分辨率U理?br>   [4]降低U理色深Q例如环境纹理,阴媄U理q些Q尽量?6位?br>   [5]q行U理压羃Q例如DXT格式可以有效压~纹理,q且GPU对DXT格式支持很好?br>   [6]避免使用非二ơ方的纹理资源?br>   [7]在进行纹理锐化的时候,避免使用负值的Lodq行锐化Q会Dq处qQ尽量用各相异性过滤进行锐?br>   [8]对于动态纹理,一般徏议用 D3DUSAGE_DYNAMIC D3DPOOL_DEAFAULT q行创徏~冲Q?D3DLOCK_DISCARD q行锁定Q尽量做Cơ锁定多ơ用,不要频繁解锁Q另外,永远不要读这L(fng)U理?br>11Q桢~冲D的瓶?br>Q?Q优化方?br>   [1]量关闭Z-writeQ一般来_在一个渲染Pass中就可以q行完整的Z-buffer处理Q在后箋的Pass中就应当关闭Z-writeQ不用担心,即需要Alpha混合的对象也不再需要开启Z-write了?br>   [2]量开始AlphaTestQ实际上q个操作会提高效率,而非降低?br>   [3]避免使用点缓存?br>   [4]若没有启用模版深度缓冲的话,使用16位的Zbuffer可以了?br>   [5]避免使用RendToTextureQ或者可能的dRend的尺寸?br>对于现在可编E流水管U来_q意味着我们有更大的自由度实现更多的Ҏ(gu)Q但也有了更多的瓉和更多的复杂度,我们遇到问题要正的获取瓉所在,开动脑{进行优化,q各环节间的负载。让各环节不q蝲不空闌Ӏ?br><br>更多信息希望(zhn)查看Nvidia的《GPU_Programming_Guide》,译成中文则是《GPU~程_a》。以上?/p> <img src ="http://www.shnenglu.com/Leaf/aggbug/106721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2010-01-29 13:48 <a href="http://www.shnenglu.com/Leaf/archive/2010/01/29/106721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化3D囑Ş渲染通道负蝲http://www.shnenglu.com/Leaf/archive/2010/01/29/106720.htmlRender DonkeyRender DonkeyFri, 29 Jan 2010 05:43:00 GMThttp://www.shnenglu.com/Leaf/archive/2010/01/29/106720.htmlhttp://www.shnenglu.com/Leaf/comments/106720.htmlhttp://www.shnenglu.com/Leaf/archive/2010/01/29/106720.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/106720.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/106720.html优化3D囑Ş渲染通道负蝲

http://www.itjiaocheng.com/jiaocheng/pingmiansheji/AutoCAD/texiaojiqiao/2009/0520/23435.html

  

一般来_ 定位渲染通道瓉的方法就是改变渲染通道每个步骤的工作量, 如果吞吐量也改变? 那个步骤是瓉.。找C瓉p惛_法消除瓶? 可以减少该步骤的工作? 增加其他步骤的工作量?

   一般在光栅化之前的瓉UC”transform bound”, 三角形设|处理后的瓶颈称?#8221;fill bound”定位瓉的办?

   1.改变帧缓冲或者渲染目?Render Target)的颜色深?16 ?2 ?, 如果帧速改变了, 那么瓉应该在~冲(RenderTarget)的填充率上?

   2.否则试试改变贴图大小和脓(chung)图过滤设|? 如果帧速变?那么瓉应该是在贴图q里?

   3.否则改变分L?如果帧速改变了, 那么改变一下pixel shader的指令数? 如果帧速变? 那么瓉应该是pixel shader. 否则瓉在光栅化过E中?

   4.否则, 改变点格式的大? 如果帧速改变了, 那么瓉应该在显卡带宽上?

   5.如果以上都不? 那么瓉在CPUq一辏V?

   优化Ҏ(gu)36?

   1.量减少无用的顶Ҏ(gu)? 比如贴图坐标, 如果有Object使用2l有的?l? 那么?要将他们攑֜一个vertex buffer? q样可以减少传输的数据量?

   2.使用多个streamsource, 比如SkinMesh渲染, 可以把顶点坐标和法线q些每一帧都要修改的数据攑֜一个动态VB? 其它不需要修改的(如脓(chung)囑֝?攑ֈ一个静态VB? q样减了数据传输量?

   3.量使用16位的索引~冲,避免32位的. 一斚w费带宽, 一斚w也不是所有的昑֍都支?2位的索引~冲?

   4.可以考虑使用vertex shader来计静态VB中的数据.比如SkinMesh的顶点可以放到vectex shader中计? q样可以避免每一帧都从AGP内存中向昑֭传送数? q样也可以用静态VB了?

   5.坚决避免使用Draw**UP一族的函数来绘制多边Ş?

   6.在设计程序之前好好规划一下显卡内存的使用, 保framebuffer, 贴图, 静态VB能够正好攑օ昑֍的本地内存中?

   7.量佉KҎ(gu)式大是32字节的倍数.可以考虑使用压羃q的点格式然后用vertex shader去解. 或者留下冗余的部分, 佉K点大刚好32字节的倍数?br>
   8.点在顶点缓冲中的顺序尽量符合绘制的序, 考虑使用strips来代替list?

   9.如果可能量多的使用static vertex buffer代替dynamic vertex buffer?

   10.动态VB使用DISCARD参数来lock更新, 使用NOOVERWR99vE来添?量不要使用不带参数的lock调用(0)?

   11.量减少lock的次? 有些东西q不一定非要每一帧都更新VB, 比如人物动画一般每U钟更新30ơVB基本上就够了?

   12.如果是因为需要绘制的点数据太多了可以考虑使用LOD, 但是现在的显卡的l制能力都很强劲, 所以需要权衡一下LOD是否能够带来相应的好? 如果q分的强化LOD很可能将瓉转移到CPUq边?

   13.避免q多的顶点计?比如q多的光? q于复杂的光照计?复杂的光照模?, U理自动生成的开启也会增加顶点的计算? 如果贴图坐标变换矩阵不是单位矩阵, 也会造成点计算量的增加, 所以如果纹理变换已l结? 记得要将U理变换矩阵设ؓ单位矩阵同时调整贴图坐标?

   14.避免Vertex shader指o数量太多或者分支过? 量减少vertex shader的长度和复杂E度. 量使用swizzling代替mov?

   15.如果图象质量斚w的计?pixel shader)范围很大, q且很复? 可以考虑试试全屏反走栗说不定更快?

   16.量按照front – back的顺序来l制?

   17.在shader中判断Z值可以避免绘制不可见的象? 但是nvidia单的shader不要q么?(Don't do this in a simple shader)?

   18.如果可能, 量使用vertex shader来代替pixel shader.计从逐象素变成逐顶炏V?

   19.量降低贴图的大?q大的脓(chung)囑֏能造成贴图cacheq蝲, 从而导致脓(chung)图cache命中降低.q大的脓(chung)图会D昑֭q蝲, q时候脓(chung)图是从系l内存中取的?br>
   20.只要可能q16位色的脓(chung)? 如环境脓(chung)图或者shadow map.它们?2位色的脓(chung)囑֮在是费?

   21.考虑使用DXT 贴图压羃?

   22.如果可能,使用单的贴图qo或者mip map, 除非必要否则量不要使用三线qo和各异性过? light map 和环境脓(chung)囑֟本上都不需要用它们?

   23.只有真正需要修改的贴图才用Dynamic, q且使用DISCRAD和W(xu)R99vEONLY来lock?

   24.太多的~冲d可以考虑关闭Z-Writes如有些多pass的渲染中的后lpass或者粒子系l等半透明几何物体Q如果可以)?

   25.可能的话量使用alpha test代替alpha blending?

   26.如果不需要stencil buffer尽量?6位的Z buffer?

   27.减小RenderTarget 贴图的大? 如shadow map 环境贴图. 可能Ҏ(gu)不需要那么大效果很好?

   28.Stencil 和Z buffer 量一起clear. 他们本来是一块缓册Ӏ?

   29.量减少渲染状态的切换, 量一ơ画可能多的多边Ş。(Ҏ(gu)昑֍性能军_最多画多少Q?不过一般再多也不会多到哪里厅R?除非你根本不需要脓(chung)囑֒渲染状态的切换Q?

   30.量使用shader来代替Fixed Pipeline?

   31.量使用shader来实现来取代Multipass渲染效果?

   32.量优先先徏立重要的资源, 如Render target, shaders, 贴图, VB, IB{等.以免昑֭q蝲的时候它们被创徏到系l内存中?

   33.坚决不要在渲染@环中调用创徏资源?

   34.按照shader和脓(chung)囑ֈl后再渲?先按照shaders分组再按贴图?

   35.Color Stencil Z buffer量在一ơClear调用中清除?

   36.一个Vertex buffer 的大在2M-4M之间最好。(中国软gQ?/p>



Render Donkey 2010-01-29 13:43 发表评论
]]>
Shader Model 4.0 全新架构http://www.shnenglu.com/Leaf/archive/2009/10/16/98781.htmlRender DonkeyRender DonkeyFri, 16 Oct 2009 09:47:00 GMThttp://www.shnenglu.com/Leaf/archive/2009/10/16/98781.htmlhttp://www.shnenglu.com/Leaf/comments/98781.htmlhttp://www.shnenglu.com/Leaf/archive/2009/10/16/98781.html#Feedback2http://www.shnenglu.com/Leaf/comments/commentRss/98781.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/98781.htmlShader Model4.0l一渲染架构  
微Y的DirectX 9.0c距今d的诞生已l有2q的光景QDX9.0cl我们带来了全新的Shader Model3.0技术,也?D画面较以往了有了质的突_DirectX 9.0c是截臌今微软历史上寿命最长的一代APIQ而图形技术的发展是不会停下脚步的Q?006q微软发布了全新的DirectX 10.0Q仅从版本上看比9.0c相差一U,但是DirectX 10.0带给我们的又是一个全新的概念?

 

  在微软发布DX10.0后,NVIDIAU极响应Q发布了完全W合DirectX 10.0的通用Shader架构囑Ş处理器G80Q也标志着DX9.0c会逐步被DX10.0替代。相对DirectX 9.0c中的SM3.0Q在Shader Model 4.0中微软引入了l一着色架构,q才是DX10最大的改变。我们都知道Q微软在DirectX 9中引入的?.0/2.X/3.0三个版本的Vertex Shader(点着色引?以及Pixel Shader(像素着色引?。其中支?.0版的着色引擎是DirectX 9的GPU的最低标准,而当前主的昑֍已经都硬件支持加入了拥有更多高处理功能?.0版本着色引擎?/p>

    不过Q即便是DirectX 9.0cQ对于功能相仿Vertex Shader、Pixel Shader来说Q目前图形芯片厂商仍需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图水Uѝ这无疑是一U资源冗余,而且q也加重GPU的设计难度及成本。当DirectX 10把渲染流E更l分为Vertex Shader、Geometry Shader及Pixel ShaderQ这个情况将会更为明显。而DX10.0的诞生就这2U渲染整合在了一P


SM4.0较SM3.0的改q?/font>
 而在DirectX 10中引入了l一渲染Ӟ通过一个整合Vertex Shader?Pixel Shader的可~程整合光媄处理器来完成目前Vertex Shader、Pixel Shader所有的工作。所谓统一渲染架构Q最Ҏ(gu)的理解方式就是Shader单元不再分离Q显C核心不再ؓShadercd不同而配|不同类型的Shader单元Q对于主的昄核心QPixel Shader单元以及vertex Shader单元的概念都应该已经非常熟?zhn)了,而在l一渲染架构中这两种Shader单元?yu)不再分,转而所有的Shader单元都可以ؓ需要处理的数据q行处理Q不和是Pixel Shader数据q是Vertex Shader数据?

     而调配哪几组Shader单元负责处理什么数据或者进行什么样子类型的计算Q则׃个被UCؓsmall sets of instructions(SSI)的部分来控制。这样在g上,设计者就无需Z同的着色引擎设计不同的执行单元Q只要按照所对应的接口以及操作方式全部融Z体,仅设|一U独立的Shader执行单元。这意味着GPU厂家可以用更的核心来实现现在需要用8000万甚x多晶体管才能实现的功能!

  相比原先的Shader Model 3.0QShader Model 4.0最大指令数?12条增加到?4000?临时暂存器数量也从原先的32个增加到惊h?096?允许同时?28个Textureq行操作(Shader Model 3.0只允?6?;材质texture格式变ؓg支持的RGBE格式Q其中的"E"是Exponent的省略,是RGB共同的说明,q在HDR的处理上有很大的作用Q摒弃了以往需要专门decoding处理HDR渲染的流E?另外Q对于纹理的寸Shader Model4.0也有惊h的提升,8192x8192的最高纹理分辩率比原先最?048x2048的分辩率要高?倍。G80囑Ş核心对以上规格都l予了完整的g支持?br>
Shader Model4.0新特?/font>
 Shader Model 4.0另一个重大变化就是在VS和PS之间引入了一个新的可~程囑Ş?---几何着色器(Geometry Shader)。原来的Vertex Shader和Pixel Shader只是寚w个点或像素进行处理,而新的Geometry Shader可以扚wq行几何处理Q快速的把模型类似的点l合hq行q算。虽然其操作不会象Vertex Shader那样完整Q只是处理器单个点的相兛_数操作,但是q种操作却可以确定整个模型的物理形状。这大大加速处理器速度Q因为其它Shader单元?yu)不再去需要判定数据所存在的位|,而只是需要简单的为特定区域进行操作就可以了?/p>

 

  Geometry Shader可以把点、线、三角等多边形联pv来快速处理、同时创造新的多边ŞQ在很短旉内直接分配给其他Shader和显存而无需l过CPUQ烟雾、爆炸等复杂图象不再需要CPU来处理。从而极大的提高了CPU速度和显卡速度。游戏图象中可以出现许多_场景Q如不锈钢茶壶上清楚的反出周围物体、超_的h物皮肤等?/p>

  Z最大程度的发挥Geometry Shader的威力,DX10gq专门设|了一个名为流输出?Stream Output State)的部件来配合它用。这个层的功能是Vertex Shader和Pixel Shader处理完成的数据输出给用户Q由用户q行处理后再反馈l流水线l箋处理。我们可以通过Stream Out把GPU拆成两段Q只利用前面的一D几何运单元。对某些U学研究Q也许可以通过stream out来利用GPU的数学运能力,{于在CPU之外又^白多得了一个数学协处理器。D个例子,Doom3常用的Stencil shadowQ因为CPU负担很重Q广受批评。但是因为GS可以计算轮廓U? q可以动态插入新的多边ŞQ有了Stream out之后QShadow volume的生成就可以攑ֈGPU端进行,实现Stencil shadow的硬件化Q这大大降低CPU占用?br>
l一着色架?/font>
在以前的DirectX版本中,像素着色器因ؓ受到帔R寄存器、可用指令和M程可的限制Lq行在顶点着色器之后Q因此程序员必须学会怎样分别d用好点和像素着色器的权限。Shader model 4.0则带来了与以往不同的统一着色架构,在DirectX 10基础上进行游戏开发,E序员不需要在避免着色冲H限制上p旉Q所有的l一架构着色器都能够用GPU可以用的全部资源?/p>

 

  Shader model 4.0在着色器E序可用资源的提升方面让人激动,在以往的DirectX下,开发者不得不仔细计算可用的寄存器资源Q而在DirectX 10中,q些问题都不复存在,如上表所C,M上DirectX 10提供了超q?0倍的DirectX 9可用资源?/p>

更多的纹理和渲染
Shader Model 4.0支持U理队列集,把开发者从J重的拼接纹理图集的工作中解攑և来,q能够在每个着色器上用更多的Ҏ(gu)U理实现更好的视觉效果?/p>

  在Shader Model 4.0之前Q过高的开销使在一个着色器操作上用多个特D纹理的操作基本无法实现。ؓ了解册个问题,开发把许多的分散的纹理拼接成一个大的纹?在运行层中,着色器也需要进行额外的地址q算以便在拼接纹理图集中扑ֈ特定的纹理。纹理图集方式存在两个明昄~点:首先纹理之间的分界U回Dqo操作错误;然后QDirectX 9?096*4096U理寸限制也是U理N的M规模受到局限。纹理队列集能够解决所有问题,它能够用队列格式存储纹理,每个队列能存?12同尺怸U理Q最大的可用U理寸也提升到8192*8192。ؓ了促q这U应用,每个着色器可以操作的最大纹理数也提高到?28个,8倍于DirectX 9?/p>

  更多的渲染对?br>  多重渲染对象是DirectX 9时代的一个流行特性,它允许每个像素着色周期输?个不同的渲染l果Q从而高效率的在一个周期内渲染一个场景的4遍。在DirectX 10中,渲染对象的数目提高到8Q着极大的提高了着色器能实现的场景复杂E度Qgq渲染和其它一些图像空间优化算法将q泛的从中受益?br>
两种新的HDR格式
 两种新的HDR格式
  HDR(High dynamic range rendering)从支持Q点色彩格式的DirectX 9时代开始流行。不q的是QҎ(gu)式比整数格式占用更多的寄存器I间而限制了其性能的发挥。如典型的FP16格式的每个色彩数据需要占?6bitsQ这两倍于整数格式的空间占用?/p>

 

 

  DirectX 10的新HDR格式能够在和FP16实现同样动态范围的前提下只占用50%的存储空间。第一U格式ؓR11G11B10Q它使用11-bits的红色和l色以及10-bits的蓝色来优化存储I间;W二U格式是使用一?-bits׃n首位存储所有色彩然后每个色彩拥?-bits֝Q这些简化的Ҏ(gu)在HDR品质上和标准的FP16几乎没有差别。在最高别的HDR斚wQDirectX 10支持FP32的HDRQ这可以用于U学计算{对计算_ֺ较高的应用程序?/p>

  很显ӞDirectX 10.0全新的Shader Model4.0对于消费者来说是一场全新的视觉革命Q更逼真?D游戏画面、流畅的高清视频回放是微软、显卡厂商推动技术发展的动力之源Q在不远的将来我们就会体会到全新的DX10、SM4.0l我们带来的饕餮大餐?br>






Render Donkey 2009-10-16 17:47 发表评论
]]>
q期在研ISkeletal AnimationQ骨骼动画)http://www.shnenglu.com/Leaf/archive/2009/10/10/98274.htmlRender DonkeyRender DonkeySat, 10 Oct 2009 13:17:00 GMThttp://www.shnenglu.com/Leaf/archive/2009/10/10/98274.htmlhttp://www.shnenglu.com/Leaf/comments/98274.htmlhttp://www.shnenglu.com/Leaf/archive/2009/10/10/98274.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/98274.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/98274.html 骨骼动画一直是我感兴趣的内?虽然采用现成的CSkinMesh能够使用XFile的骨骼动?但对自己来说L觉缺了点什?于是,q是深入理解理解为好!!!

ZDNet软g频道Q?span>2008-03-24作?/strong>QSkyman | CSDN
本文关键词:骨骼动画Q?/font> Animation Skeletal 游戏 Linux

骨骼动画(Skeletal Animation)又叫Bone AnimationQ它与关键动画(Key-frame Animation)相比Q占用空间小Q因为它不需要象关键帧动画那栯存储每一帧的各个点的数据,而是只需要存储每一帧的骨骼Q骨g点相比Q当然要得多。所以骨骼动L很多优势Q当然其技术难度也很高。我个h觉得动画在计机囑Ş学中是一个十分重要的内容Q不是?a title=游戏 >游戏、电(sh)影动画还是虚拟现实中Q生动逼真的动画(人、动物等Q会使之增色不少。所以我军_今后的研I方向就是计机动画。目前在研究Skeletal AnimationQ这是目前动L术中的主。欢q同好与我交,共同提高Q?

    骨骼动画的实现思\是从我们人的w体的运动方式而来的(所以VR是对现实世界的虚拟?:-)Q。动Mh物的w体Q肉、皮肤)是一个网?Mesh)模型Q网格的内部是一个骨架结构。当人物的骨架运动时Qn体就会跟着骨架一赯动。骨架是׃定数目的骨骼l成的层ơ结构,每一个骨骼的排列和连接关pd整个骨架的运动有很重要的影响。每一个骨骼数据都包含其自w的动画数据。和每个骨架相关联的是一?#8220;蒙皮”(Skin)模型Q它提供动画l制所需要的几何模型(Vertex,Normal,etc)和纹理材质信息。每个顶炚w有相应的权?Weight)Q这些权值定义了骨骼的运动对有关点的媄响因子。当把动Mh物的姿势和全局q动信息作用到骨架上Ӟq个“蒙皮”模型׃跟随骨架一赯动。如下图所C:

    所以关键是寚w架进行动ȝ成,生成的方法也是用关键帧。关键动画是对人物的网?Mesh)模型采用关键帧生成动画;而骨骼动d是对人物的骨枉用关键生成动画Q然后再让网?Mesh)模型跟随骨架q动。关键动画实现?个关键点是:关键帧的选取和中间的插补?/p>

    关键帧的指定?U基本的Ҏ(gu)Q前向动力学(FK)和逆向动力?IK)。前向动力学用一l节点的角度来找到末端受动器的位|;而逆向动力学则是找到将末端受动器置于所要位|所需的一l节点角度。前向动力学的优Ҏ(gu)Q计简单,q算速度快,~点是:需指定每个兌的角度和位置Q而由于骨架的各个节点之间有内在的兌性,直接指定各关节的值很Ҏ(gu)产生不自然协调的动作Q逆向动力学的优点是:只需指定主要兌点的位置Q负担轻Q缺Ҏ(gu)Q计模型比较复杂,开发者需要机械运动和动力学、几何学以及向量数学{方面的相关知识?/p>

    中间帧的插值分2步:(1) Ҏ(gu)当前旉Q通过插D出每个骨骼的旋转、^Uȝ|形成中间帧的骨架。插值算法一般采用四元数(Quternion)的球面线性插?Spherical linear interpolation)SLERPQSLERP特别适合在两个方位之间进行插|不会出现像对Ƨ拉角插值那样出C象锁的现象,而且q种插D产生更^滑和q箋的旋转,表达方式也很z;(2) Ҏ(gu)骨架的变化情况,插D出骨架?#8220;蒙皮”模型的各个顶点的位置变化。对于某个特定骨|“蒙皮”模型的顶点变换矩阵=初始姿势的变换矩늚?#215;姿势变换后的矩阵。另外还要考虑点可能受多个骨D动的影响。这时我们对每个与当前顶点相兌的骨|其q动姿势变换矩阵×当前点相对于该骨骼的偏Ud?#215;该骨骼对当前点的媄响因子(x重WeightQ,Ҏ(gu)有与当前点相关联的骨骼都这么处理,然后相加Q就得到当前点的新位置?/p>

    由此看出Q如何设|各关键帧的骨架的各节点的位|和骨骼的{向(也就是骨架的POSEQ是其中的关键,?U方法:一U是由动d手工攄Q这个对动画师的技术要求就比较高,要求动画师对现实生活中的人和动物{的动作有细心的观察。否则设|的骨架动作׃不自然、不协调Q另外一U是Zq动捕捉(Motion Capture)的方法,是在h的各个关节处安置q动捕捉传感器,当h做各U动作时Q捕捉A器就各节点的位|数据记录下来,q样我们可以根据这些节Ҏ(gu)据进行骨架徏模。由于这是捕捉的真实的h的动作,所以这U方式得到的动画很自然、很真实Q但捕捉仪器造h(hun)昂贵Q国内估计只有很几家有财力?a title=游戏 >游戏公司才购|了q些讑֤吧?/p>

    目前有好?D模型格式支持Skeletal AnimationQ像Microsoft?X格式、MilkShape的MS3D格式、Half Life的MDL格式、ID Software的MD5格式{。我准备首先研究一下MS3D格式Q因为它有公开的格式说明文,阅读h比较Ҏ(gu)Q而且应用很广。当Ӟ首先要深入学?a title=Skeletal >Skeletal Animation的底层技术,打好坚实的基Q呵呵!




Render Donkey 2009-10-10 21:17 发表评论
]]>
GPU中的ps 1.x 寄存?/title><link>http://www.shnenglu.com/Leaf/archive/2009/09/12/95997.html</link><dc:creator>Render Donkey</dc:creator><author>Render Donkey</author><pubDate>Sat, 12 Sep 2009 05:36:00 GMT</pubDate><guid>http://www.shnenglu.com/Leaf/archive/2009/09/12/95997.html</guid><wfw:comment>http://www.shnenglu.com/Leaf/comments/95997.html</wfw:comment><comments>http://www.shnenglu.com/Leaf/archive/2009/09/12/95997.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/Leaf/comments/commentRss/95997.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Leaf/services/trackbacks/95997.html</trackback:ping><description><![CDATA[<p>就看吧Q有些单词我实在不知道怎么译Q只可意会!<br><br>像素着色器需要依靠寄存器来取得顶Ҏ(gu)据,输出像素数据Q取得计时的(f)时结果和兌U理采样通道Qstage)。有几种cd的寄存器Q每一U都有特D的功能和用途?/p> <p>像素着色器需要的用到的数据由寄存器保,下面是寄器存的所有介l?br>寄存器类型:描述了四U可用的寄存器和他们各自的用?br>d端口限制Q单指针使用多个寄存器时的限?br>R/RWQ?描述了哪些寄存器可以用来读,写或是读写?br>范围Q各个分量的范围的详l说?/p> <p>Register Types  <br>                                     Versions    <br>Name  Type                   1_1        1_2        1_3        1_4 <br>c#  Constant register       8             8             8           8 <br>r#  Temporary register    2             2             2           6 <br>t#  Texture register          4             4             4           6 <br>v#  Color register            2             2             2           2 in phase 2 </p> <p>1Q常量寄存器Q常量寄存器容纳了常量数据。数据可以用IDirect3DDevice9::SetPixelShaderConstantF函数一个常量装入常量寄存器中。也可以用def-ps来定义一个常量?帔R寄存器对U理d指o来说是不可用的,唯一例外的是texm3x3spec-ps指oQ这个指令用一个常量寄存器来提供一个视U向量(eye-ray vectorQ?/p> <p>2Q(f)时寄存器Q(f)时寄存器用来存立即结果。r0用来作ؓPS的最l输出。shader的最后时刻r0中存攄是最后的像素颜色?br>如果M的着色器试图从一个没有被写入数据的(f)时寄存器中读取数据时Q着色器ȀIDirect3DDevice9::CreatePixelShader会p|Qshader validation will failQ。假设激z(validationQ是可用状态D3DXAssembleShader函数调用也会因ؓ相同的原因而失败。(不要使用D3DXSHADER_SKIPVALIDATIONQ?/p> <p>U理寄存器:<br>在ps 1_1 ?_3中,U理寄存器容U纹理数据或是纹理坐标。当一个纹理被采样ӞU理数据便被装蝲C个纹理寄存器中?br>当纹理通道状态属性被登记的时候纹理采样用纹理坐标来查询Qlook up)或采?sample)一个纹理坐标(u,v,w,q)标记的颜色倹{纹理坐标数据会Ҏ(gu)点U理坐标数据q行插|q关联到相关的纹理通道。纹理通道号与U理坐标声明序列有一个一一对应关系。默认情况下Q顶Ҏ(gu)式中定义的第一个纹理坐标与U理通道0兌?br> 在这些版本的像素着色器中,当纹理寄存器用来做算术运的时候就和(f)时寄存器的效果一样了?br>在ps_1_4中,U理寄存?t#)容纳的是只读U理坐标信息。这意味着U理坐标集和U理通道~号是独立的。纹理通道~号q的寄存器Qr0 to r5)军_。对于texld指o来说Q纹理坐标集由源寄存器t0 to t5军_。因此纹理坐标集可以映射CQ何的U理通道上。另外,对于texld的源寄存器(指定U理坐标信息Q也可以是(f)时寄存器(r#)。在q样的情况下Q(f)时寄存器记录U理坐标?br>颜色寄存器容U了每个像素的颜色|q个值通过点数据中的漫反和镜面光颜色DP代而来。对于ps_1_4。颜色寄存器只有在phase2中可用。如果着色模式设|ؓD3DSHADE_FLAT,那么点颜色中的颜色q代不可用。如果雾化开启的话,那么渲染线q是会忽略着色模式,寚wq行颜色q代。记住雾化比像素着色器后应用?br>通常我们会从v0加蝲点漫反颜色数据。从v1加蝲点镜面光颜色数据?br>输入颜色数据值将会被规范??Q因是像素着色器中的颜色寄存器的有效范围</p> <p>像素着色器寚w色寄存器q行只读操作。颜色寄存器中存攄是P代|但是q代可能会造成比纹理坐标低很多_ֺ</p> <p> </p> <p> </p> <img src ="http://www.shnenglu.com/Leaf/aggbug/95997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Leaf/" target="_blank">Render Donkey</a> 2009-09-12 13:36 <a href="http://www.shnenglu.com/Leaf/archive/2009/09/12/95997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>per-pixel lighting U理I间坐标基的计算Ҏ(gu) http://www.shnenglu.com/Leaf/archive/2009/04/17/80299.htmlRender DonkeyRender DonkeyFri, 17 Apr 2009 13:45:00 GMThttp://www.shnenglu.com/Leaf/archive/2009/04/17/80299.htmlhttp://www.shnenglu.com/Leaf/comments/80299.htmlhttp://www.shnenglu.com/Leaf/archive/2009/04/17/80299.html#Feedback0http://www.shnenglu.com/Leaf/comments/commentRss/80299.htmlhttp://www.shnenglu.com/Leaf/services/trackbacks/80299.html 

 

文章来源Q?a >http://www.freegames.com.cn/school/383/2007/27685.html
Nemesis2k
per-pixel lighting U理I间坐标基的计算Ҏ(gu)

我知道的几种Ҏ(gu)Q?/p>

1. 对于参数化的表面Q设其方Eؓ P = P (u, v)Q其?P 为向量,
三个分量分别?x, y z。也可以表示为:
Px = Px (u ,v)
Py = Py (u ,v)
Pz = Pz (u ,v)
那在L一个顶?br>T = {dPx/du, dPy/du, dPz/du}
B = {dPx/dv, dPy/dv, dPz/dv}
N = T X B
然后?T, B, N 归一化就行了?br>q里的偏导数可以用差分计?br>q样计算出来的切I间是在每一个顶点的切空间?/p>

2。对于由三角形面片组成的|格Q在 MSDN 上的 Per-pixel lighting
文章里介l了一U方法?br>设三角Ş的三个顶Ҏ(gu) P0, P1, P2Q其中每个顶炚w有位|,法向?br>?2-D U理坐标?br>Pi : {x, y, z}, {nx, ny, nz}, {s, t}
现在我们要计在 P0 点的切空间?br>q里要分辨两个切I间Q?br>1Q顶点上的切I间
2Q三角Ş面片上的切空?br>两个切空间是相同的吗Q我觉得是不同的。方?2 和方?3 计算出来?br>实际上都是三角Ş面片的切I间Q顶点的切空间还要通过q_点所?br>各个三角形面片的切空间基向量来计。(是这L(fng)吗?高手指教一下!Q?/p>

设三角Ş面片所在的切空间的基向量ؓ T, B, NQ坐标原点在 P0?br>那么三角形面片中的Q意向量应该可以表CZؓQ?br>Vec = x*T + y*B
因此Q如果我们找C两个向量 Vec1, Vec2 以及它们?T, B 上的
分量Q那么自然就可以解出 T, B 了?br>令:
Vec1 = P1 - P0
Vec2 = P2 - P0
dS1 = P1.s - P0.s
dS2 = P2.s - P0.s
dT1 = P1.t - P0.t
dT2 = P2.t - p0.t
那么我们?br>Vec1 = dS1*T + dT1*B (1)
Vec2 = dS2*T + dT2*B (2)
联立 (1), (2) 可以解?br>B*(dS2*dT1 - dS1*dT2) = (dS2*Vec1 - dS1*Vec2)
所以:
(dS2*dT1 - dS1*dT2) 是一个常敎ͼ反正我们之后要对 B 归一化,
可以不用它。于是:
B = normalize(dS2*Vec1 - dS1*Vec2) q就?MSDN 里那文章里的方法?br>B 可以通过解方E获得,但是 T ׃行了Q因栯出来?T ?br>B 不一定垂直。怎么处理呢?
MSDN 中的Ҏ(gu)是,利用点?N 来求 TQ?br>T = B X N
然后再求 N
N = T X B
但是q样可以吗?q里?N 是顶?P0 ?NQ而不是三角Ş面片?N?br>是不是这h出来?T, N, B 恰好是顶?P0 的切I间的坐标基Q不需?br>再^均了Q(高手指教Q)
我想的处理方法是q样的:
同样解出 T 来:
T = normalize(dT2*Vec1 - dT1*Vec2)
然后 N = T X B。这?N 是三角Ş面片?N?br>然后 T = B X N。这?T, N, B 构成正交基,而且是三角Ş面片的?br>要计?P0 点的切I间基,q需要^均多个面片?br>q种Ҏ(gu)到是比较复杂?/p>

一个问题是Qؓ什么有
Vec1 = dS1*T + dT1*B (1)
Vec2 = dS2*T + dT2*B (2)
q两个公式!
我想是因为在计算点的纹理坐标时Q因为是从^面映到q面Q所以我们用了
仿射变换Q?br>s = as*x + bs*y + cs
t = as*x + bs*y + cs
反过来我们有
x = ax*s + bx*t + cx (3)
y = ay*s + by*t + cy (4)
z = az*s + bz*t + cz (5)
于是
Vec1.x = P1.x - P0.x = ax*(P1.s - P0.s) + bx*(P1.t - P0.t)
Vec1.y = P1.y - P0.y = ay*(P1.s - P0.s) + by*(P1.t - P0.t)
Vec1.z = P1.z - P0.z = az*(P1.s - P0.s) + bz*(P1.t - P0.t)
于是
Vec1 = {ax, ay, az}*dS1 + {bx, by, bz}*dT1
q和 (1) 已经很象了,那么 {ax, ay, az} 是 T 吗?
{案是是的!事实?(3), (4), (5) 是三角形面片的参数表示Q那?br>T = {dx/ds, dy/ds, dz/ds} = {ax, ay, az}
B = {dx/dt, dy/dt, dz/dt} = {bx, by, bz}
也就是说Q如果我们能直接?ax, ay, az, bx, by, bz 求出来,T ?B 求出来?/p>

Q当然要把他们正交归一化)

3 nVidia |站上的Ҏ(gu)?br>我们可以假设
x = ax*s + bx*t + cx
y = ay*s + by*t + cy
z = az*s + bz*t + cz
如何求解 (3) Q这里有 3 个未知数Q那我们需?3 个方E?br>?3 个顶点的属?{x, y ,z}, {s, t} 带入Q刚好有三个方程Q?br>P0.x = ax*P0.s + bx*P0.t + cx (1)
P1.x = ax*P1.s + bx*P1.t + cx (2)
P2.x = ax*P2.s + bx*P2.t + cx (3)
解出来就得到 ax, bx, cx 了?br>同理可得Q?ay, by, cy, az, bz, cz?br>T = {ax, ay, az}
B = {bx, by, bz}
N = T X B
T = B X N
然后都归一化即可?/p>

nVidia |站上的Ҏ(gu)呢,是徏立三个^面方E?br>Ax*x + Bx*s + Cx*t + Dx = 0 (4)
Ay*y + By*s + Cy*t + Dy = 0 (5)
Az*z + Bz*s + Cz*t + Dz = 0 (6)

q且指出Q三角Ş面片上的所有点?(x, s, t) 都在
方程 (4) 定义的^面中。那?br>dx/ds = -Bx/Ax
dx/dt = -Cx/Ax

同理
dy/ds = -By/Ay
dy/dt = -Cy/Ay

dz/ds = -Bz/Az
dz/dt = -Cz/Az

那么q些 Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz 怎么求呢Q?br>Ҏ(gu)知道Q{Ax, Bx, Cx} 其实是^面的法向量,那么可以
选^面中的三个点Q计出两个向量Q然后叉乘?/p>

{Ax, Bx, Cx} = {P1.x - P0.x, P1.s - P0.s, P1.t - P0.t} X
{P2.x - P0.x, P2.s - P0.s, P2.t - P0.t}

q两U方法是{h(hun)的?



Render Donkey 2009-04-17 21:45 发表评论
]]>
þþƷh| ٸۺϾþĻ| þþþþþƷѿSSS| þ93Ʒ91þۺ| 97þù޾Ʒ| þAëƬѹۿ| ɫþþۺľþav | ˾þþAV츾ɫ| þֻоƷƵ99| ŷƷרþ| ɫ99þþþø߳ۺӰԺ| 2021ھþþƷ| ޾Ʒһþ | ޹þþþƷС˵| þþƵ| þþþ޾Ʒ| Ʒ18þþ⺾| þ91˳ɵӰվ| þֻƷ99| ƷŷƬþùŷ| þһ| պĻþ| þþƷav| þˬˬƬAV| 99þþƷѿ| þþþƷƵѹۿ| þۺƵ| þ97Ʒþþþþþò| ɫۺϾþþþĻ| ٸþþþþþþþ| ھƷ˾þþþӰԺ԰| ޹ƷۺϾþ | ɫۺϾþþþר| 99þþƷž޾Ʒ| þþƷѹۿ | ձձȾþþƷ| þˬˬAV| ƷþĻ| AVþ| ҹƵþþþһ| ձƷþþĻ|