<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="http://catalinzima.spaces.live.com/mmm2008-11-07_18.20/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fcatalinzima.spaces.live.com%2ffeed.rss" version="1.0"?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Catalin 's Blog</title><description>Rule 1: I never write HLSL without a reason. Rule 2: You can always find a reason to write HLSL  </description><link>http://catalinzima.spaces.live.com/</link><language>en-US</language><pubDate>Wed, 07 Jan 2009 05:36:36 GMT</pubDate><lastBuildDate>Wed, 07 Jan 2009 05:36:36 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>4440209354424866543</live:id><live:alias>catalinzima</live:alias></live:identity><image><title>Catalin 's Blog</title><url>http://byfiles.storage.live.com/y1puZyM9zVZiuYZVh8RQTJneQ_9CwrA4HDfzNlS2mz1CsZ4nVpp7cYjxYONf8z8lc29</url><link>http://catalinzima.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>New Site Online!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!325.entry</link><description>&lt;p&gt;  &lt;p&gt;I am moving my blog / site to a new location: &lt;a href="http://www.catalinzima.com"&gt;www.catalinzima.com&lt;/a&gt; &lt;p&gt;There you will find all my samples and tutorials, and all new stuff will be hosted there.  &lt;p&gt;The site has different sections containing tutorials, samples and other miscellaneous downloads. Also, it begins its existence with a new goal: &lt;strong&gt;&lt;em&gt;12 months, 12 samples&lt;/em&gt;&lt;/strong&gt;. You can read about what this means, in my welcome post, &lt;a href="http://www.catalinzima.com/?p=123"&gt;here&lt;/a&gt;. I hope you enjoy the site. &lt;p&gt;Thank you,&lt;br&gt;Catalin Zima &lt;p&gt;P.S. This blog will remain alive, for announcements and whatever else it will be needed for.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+New+Site+Online!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!325.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!325.entry</guid><pubDate>Sat, 09 Feb 2008 01:05:30 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!325/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!325.entry#comment</wfw:comment><dcterms:modified>2008-02-09T01:07:03Z</dcterms:modified></item><item><title>HLSL Learning Resources</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!316.entry</link><description>&lt;p&gt;In response to some people asking me how to start learning shader programming, I made a list of some resources that could prove helpful when learning HLSL: &lt;p&gt;The Shader Series, found on &lt;a href="http://creators.xna.com/"&gt;creators.xna.com&lt;/a&gt; are a &lt;u&gt;very good&lt;/u&gt; set of articles and samples, that explain the basic knowledge needed to understand and write shaders in HLSL. &lt;ul&gt; &lt;ul&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/whitepapers/archive/2007/04/26/Shader-Series-Introduction-article.aspx"&gt;&lt;strong&gt;Shader Series - Introduction&lt;/strong&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/whitepapers/archive/2007/04/26/Shader-Series-supplemental-article-_1320_-FFP-to-programmable.aspx"&gt;&lt;strong&gt;Shader Series - Fixed Function to Programmable Pipeline&lt;/strong&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/whitepapers/archive/2007/04/26/Shader-Series-supplemental-article-_1320_-Coordinate-systems.aspx"&gt;&lt;strong&gt;Shader Series - Coordinate Systems&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Shader-Series-1_3A00_-Vertex-Lighting-Sample.aspx"&gt;&lt;strong&gt;Shader Series 1 - Vertex Lighting&lt;/strong&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Shader-Series-2_3A00_-Textures-and-Colors-Sample.aspx"&gt;&lt;strong&gt;Shader Series 2 - Textures and Colors&lt;/strong&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Shader-Series-3_3A00_--Per_2D00_Pixel-Lighting.aspx"&gt;&lt;strong&gt;Shader Series 3 - Per-Pixel Lighting Sample&lt;/strong&gt;&lt;/a&gt; &lt;li&gt;&lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Shader-Series-4_3A00_-Materials-and-Multiple-Light-Sources.aspx"&gt;&lt;strong&gt;Shader Series 4 - Materials and Multiple Light Sources&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Riemer Grootjans&lt;/strong&gt; also has a series of tutorials on HLSL, which can be found on &lt;a href="http://www.riemers.net/eng/Tutorials/XNA/Csharp/series3.php"&gt;&lt;strong&gt;his site&lt;/strong&gt;&lt;/a&gt;. &lt;p&gt;A very good book on shaders (in my opinion, the best book on shaders I've read) is &lt;a href="http://www.amazon.com/Microsoft-DirectX-Programmable-Graphics-Pipeline/dp/0735616531/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1200952318&amp;amp;sr=8-1"&gt;&lt;strong&gt;The Microsoft DirectX 9 Programmable Graphics Pipeline by Kris Gray&lt;/strong&gt;&lt;/a&gt;. I found this book extremely useful, with very good explanations, and nicely structured. The code samples, however, are in C/C++, but for most people that shouldn't be a problem. &lt;p&gt;After mastering the basics, you can explore other samples and articles, which can be found on &lt;a href="http://www.ziggyware.com"&gt;www.ziggyware.com&lt;/a&gt; and &lt;a href="http://creators.xna.com/Education/Samples.aspx"&gt;creators.xna.com&lt;/a&gt;. &lt;p&gt;Another good place to find information on shaders are the web pages of the two big GPU manufacturers, &lt;a href="http://developer.nvidia.com/page/home.html"&gt;&lt;strong&gt;NVIDIA&lt;/strong&gt;&lt;/a&gt; and &lt;a href="http://ati.amd.com/developer/"&gt;&lt;strong&gt;ATI&lt;/strong&gt;&lt;/a&gt;. Each site has a section devoted to developers, which are great places for everyone, beginners are advanced users alike. Both sites provide code samples, documentation, tools and SDK's. Out of these, my favorites are &lt;a href="http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html"&gt;NVIDIA Shader Library&lt;/a&gt;, &lt;a href="http://developer.nvidia.com/object/sdk-9.html"&gt;NVIDIA SDK&lt;/a&gt; and &lt;a href="http://ati.amd.com/developer/radeonSDK.html"&gt;ATI SDK&lt;/a&gt;. Most important, these site contains lots of articles and presentations from various conferences, which explain a wide range of effects and techniques, and how they are achieved on the GPU. Admittedly, most of them do not provide HLSL code, but the idea and algorithm is almost always more important than the code itself. &lt;p&gt;For advanced effects and usages of the GPU, I recommend the &lt;a href="http://developer.nvidia.com/object/gpu-gems-3.html"&gt;&lt;strong&gt;GPU Gems&lt;/strong&gt;&lt;/a&gt; series and the &lt;a href="http://www.shaderx5.com/"&gt;&lt;strong&gt;ShaderX&lt;/strong&gt;&lt;/a&gt; series. &lt;p&gt;Finally, as a recommendations for those who want to learn HLSL, try to examine as many samples as possible, and play with the HLSL code to see what happens when changing values, until you understand why things happen the way they do. Don't start by doing HDR Lighting, or Relief Mapping. Start with the small tutorials, and understand what happens and why before going on to the more spectacular samples. Last, but not least, don't be afraid to look at C/C++ samples. The &lt;a href="http://msdn2.microsoft.com/en-us/directx/aa937788.aspx"&gt;DirectX SDK&lt;/a&gt; contains some very good samples of HLSL. I know, they're written in C/C++, but the shader code stays the same when going from C++ to XNA.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+HLSL+Learning+Resources&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>HLSL</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!316.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!316.entry</guid><pubDate>Mon, 21 Jan 2008 22:59:26 GMT</pubDate><slash:comments>29</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!316/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!316.entry#comment</wfw:comment><dcterms:modified>2008-01-21T22:59:26Z</dcterms:modified></item><item><title>XNA 2D Pie Sample</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!312.entry</link><description>&lt;p&gt;  &lt;p&gt;After I've seen some people asking how to do this on the forums, I decided to make a small class that allows us to draw Pies in 2D in XNA. &lt;p&gt;To use it, just create a new Pie2D object. The constructor receives parameters for the radius, angle and tessellation. These can also be modified at runtime, and the shape will be altered appropriately. &lt;p&gt;I made a sample that shows how to use this class. You can download it here: &lt;a href="http://www.kyleschouviller.com/catalinzima/Pie2DSample.zip"&gt;Pie2DSample.zip&lt;/a&gt; &lt;p&gt;&lt;a href="http://00e1qa.bay.livefilestore.com/y1pSVsXSbfpO8yxPN91XahgJScnzmijQXCqkJvldba3pvZrBsjf46Vll_y4kZdo7dDytACUIz2W4UFODBsQO8Auxg?PARTNER=WRITER" target="_blank"&gt;&lt;img height=180 alt="Pie2DSample 2008-01-19 02-50-16-17" src="http://by1.storage.msn.com/y1pt6-V36MAGBp6lQggQCnmh27BWzFn8dm1A_wRccSSBNwRf4fnj6XBaurDOGxwy_5GAugJ6DEIF1pJ_B3FEWG8Xv2eje5BJqpV?PARTNER=WRITER" width=240&gt;&lt;/a&gt;  &lt;p&gt;A pie could be useful in 2D games for various effects, like enemy visibility area, flashlights, shields, etc.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+XNA+2D+Pie+Sample&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!312.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!312.entry</guid><pubDate>Sat, 19 Jan 2008 01:04:47 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!312/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!312.entry#comment</wfw:comment><dcterms:modified>2008-01-19T01:04:47Z</dcterms:modified></item><item><title>Model Manipulation using the Mouse</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!309.entry</link><description>&lt;p&gt;  &lt;p&gt;    A friend of mine asked me about a small XNA sample where he could manipulate a model using the mouse. I made something up quick. It is not much, but I though I'd share it with the community, maybe someone will find it useful. &lt;p&gt;Controls: &lt;ul&gt; &lt;li&gt;Left Mouse Button + Drag to rotate the model around the Y axis &lt;li&gt;Right Mouse Button + Drag to scale the model&lt;/ul&gt; &lt;p&gt;You can download it here: &lt;a href="http://www.kyleschouviller.com/catalinzima/MouseManipulator.zip"&gt;MouseManipulator.zip&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Model+Manipulation+using+the+Mouse&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!309.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!309.entry</guid><pubDate>Wed, 16 Jan 2008 22:18:09 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!309/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!309.entry#comment</wfw:comment><dcterms:modified>2008-01-16T22:18:09Z</dcterms:modified></item><item><title>Ziggyware XNA Holiday Contest winners announced!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!308.entry</link><description>&lt;p&gt;  &lt;p&gt;I happily announce that I have again won &lt;a href="http://www.ziggyware.com/news.php?readmore=493"&gt;Ziggyware's XNA Holiday Contest&lt;/a&gt; &lt;p&gt;The three winning articles are: &lt;p&gt;1. &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=155"&gt;Deferred Shading in XNA&lt;/a&gt; - Catalin Zima &lt;p&gt;2. &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=157"&gt;Depth of Field&lt;/a&gt; - Kyle Schouviller &lt;p&gt;3. &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=161"&gt;Shadow Mapping&lt;/a&gt; - Andrew Joll &lt;p&gt;I'd like to congratulate all who entered, and thank Ziggyware for organizing the contest.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Ziggyware+XNA+Holiday+Contest+winners+announced!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!308.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!308.entry</guid><pubDate>Mon, 14 Jan 2008 13:42:32 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!308/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!308.entry#comment</wfw:comment><dcterms:modified>2008-01-14T13:42:32Z</dcterms:modified></item><item><title>Deferred Rendering tutorial online</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!301.entry</link><description>&lt;p&gt;  &lt;p&gt;My article just went online on &lt;a href="http://www.ziggyware.com"&gt;www.ziggyware.com&lt;/a&gt;. You can read it &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=155"&gt;here&lt;/a&gt;. &lt;p&gt;I hope everyone enjoys it!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Deferred+Rendering+tutorial+online&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!301.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!301.entry</guid><pubDate>Mon, 31 Dec 2007 16:20:15 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!301/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!301.entry#comment</wfw:comment><dcterms:modified>2007-12-31T16:20:15Z</dcterms:modified></item><item><title>New tutorial Coming Soon...</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!299.entry</link><description>&lt;p&gt;  &lt;p&gt;Sorry for the lack of posts recently, but I've been very busy with school and other stuff. Anyway, since XNA 2.0 came out, and Ziggyware has a new contest, I've decided to put some more time into XNA, and try something new. &lt;p&gt;One of the new things in XNA 2.0 is the support for Multiple Render Targets on the Xbox. Now that this became available I had the opportunity to try one of my older desires: implementing a deferred renderer. So, my next tutorial will cover implementing a deferred renderer in XNA 2.0. &lt;p&gt;Here are some screenshots from what will come soon: &lt;p&gt;&lt;a title="DefferedRendering 2007-11-29 08-17-37-76 by CatalinZima, on Flickr" href="http://www.flickr.com/photos/21041963@N06/2073320772/"&gt;&lt;img height=300 alt="DefferedRendering 2007-11-29 08-17-37-76" src="http://farm3.static.flickr.com/2142/2073320772_2aff043095.jpg" width=500&gt;&lt;/a&gt;  &lt;p&gt; &lt;a title="DefferedRendering 2007-11-29 08-18-13-19 by CatalinZima, on Flickr" href="http://www.flickr.com/photos/21041963@N06/2072528019/"&gt;&lt;img height=300 alt="DefferedRendering 2007-11-29 08-18-13-19" src="http://farm3.static.flickr.com/2379/2072528019_6a74e67a18.jpg" width=500&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Lizard drawn with normal mapping, and about 16 moving point lights.&lt;/strong&gt; &lt;p&gt;  &lt;a title="pointlight by CatalinZima, on Flickr" href="http://www.flickr.com/photos/21041963@N06/2131350229/"&gt;&lt;img height=375 alt=pointlight src="http://farm3.static.flickr.com/2201/2131350229_9dca33f4b2.jpg" width=500&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;One point light moving around a ship&lt;/strong&gt; &lt;p&gt;  &lt;a title="manylights by CatalinZima, on Flickr" href="http://www.flickr.com/photos/21041963@N06/2132126826/"&gt;&lt;img height=375 alt=manylights src="http://farm3.static.flickr.com/2296/2132126826_f9ae868fae.jpg" width=500&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Over 20 lights lighting the ship&lt;/strong&gt; &lt;p&gt; Stay tuned for more...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+New+tutorial+Coming+Soon...&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!299.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!299.entry</guid><pubDate>Sun, 23 Dec 2007 23:33:37 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!299/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!299.entry#comment</wfw:comment><dcterms:modified>2007-12-23T23:40:10Z</dcterms:modified></item><item><title>XNA Game Studio 2.0 beta released!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!295.entry</link><description>&lt;p&gt;  &lt;p&gt;Ok, so I know lots of other sites will have this announced, and if you frequent creators.xna.com you already know this, but I can't not announce this too:  &lt;p&gt;The beta version of XNA Game Studio 2.0 has been released. &lt;p&gt;It's been told that the final version will come pretty soon also, but until then you can experiment with new features included in the beta: multiplayer, virtualised device, project management, etc. &lt;p&gt;Go get it &lt;a href="http://creators.xna.com/beta/betahome.aspx"&gt;HERE&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+XNA+Game+Studio+2.0+beta+released!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!295.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!295.entry</guid><pubDate>Tue, 20 Nov 2007 07:06:14 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!295/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!295.entry#comment</wfw:comment><dcterms:modified>2007-11-20T07:06:14Z</dcterms:modified></item><item><title>XNA Achievements (sort of)</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!292.entry</link><description>&lt;p&gt;&lt;a href="http://www.codeplex.com/johnnylightbulb"&gt;John Wells&lt;/a&gt; released a nice little component, which allows us to display messages similar to the Achievement notices on the Xbox 360. Of course, it will not alter your gamerscore, but it adds a very cool touch to a game. &lt;p&gt;Here's how it looks in action: &lt;p&gt;&lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=johnnylightbulb&amp;amp;ReleaseId=8160"&gt;&lt;img height=119 alt=acheivementtoast-001 src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UAy3HxC5LBh_5d1ZaFl6GMUcWDyKhmon1Dsl7SmJknwv1E4duOgJZie2j06T7Es0aE" width=470&gt;&lt;/a&gt; &lt;br&gt;It is nicely packed as a .dll file, together with a couple of content files. You can download it &lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=johnnylightbulb&amp;amp;ReleaseId=8160"&gt;here&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+XNA+Achievements+(sort+of)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!292.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!292.entry</guid><pubDate>Sun, 04 Nov 2007 20:29:24 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!292/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!292.entry#comment</wfw:comment><dcterms:modified>2007-11-09T00:07:18Z</dcterms:modified></item><item><title>PieMenu Component</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!283.entry</link><description>&lt;p&gt;  &lt;p&gt;For the people who want some UI stuff in XNA, here's a small sample that contains a Pie Menu Component, attached to a cursor. If you don't know what a pie menu is, read about it &lt;a href="http://en.wikipedia.org/wiki/Pie_menu"&gt;on wikipedia&lt;/a&gt;. &lt;p&gt;Now, about the sample. &lt;p&gt;My PieMenu supports deep menus, as seen in the sample. Currently it is just a quick version, made in two days. Because of this, the graphics are not spectacular, and some things may not be extremely flexible right now (the parameters passed to delegates). &lt;p&gt;But as it is, each menu entry has associated with it an image, a text description, and a delegate, for the action that should be performed. The PieMenu also supports submenus, as seen in this sample. &lt;p&gt;The cursor can operate in two modes: mouse-friendly and gamepad friendly. In the mouse friendly mode, the menu options are selected with the cursor, while in gamepad friendly mode, they are selected with the left thumbstick. &lt;p&gt;The current sample contains the following menus: &lt;ul&gt; &lt;li&gt;Change Gamerpic: allows navigation through a series of submenus, to select a gamerpic that will be displayed in the window &lt;li&gt;Change Background Color: randomly chooses a new background color &lt;li&gt;Toggle Input Mode: toggles between the mouse and gamepad friendly input modes. Default is mouse, so if you don't have a gamepad, don't worry. &lt;li&gt;Exit : exits the sample.&lt;/ul&gt; &lt;p&gt;This is just as an example. The menu can be easily customized. Also, the Cursor.ShowPieMenu() function has an overload that allows you to specify the menu that will be shown. This allows for different menus, depending on the selected object (this is NOT illustrated in this sample) &lt;p&gt;Controls: &lt;ul&gt; &lt;li&gt;Gamepad A or Mouse Click : open menu, or selected submenu &lt;li&gt;Gamepad B, or Mouse Click when no submenu selected: return to upper menu / exit menu&lt;/ul&gt; &lt;p&gt;You can find the sample &lt;a href="http://www.kyleschouviller.com/catalinzima/PieMenuSample.zip"&gt;here&lt;/a&gt;. You can use the code as you see fit, with one exception. If you're working on an entry for the Imagine Cup 2008 competition, and you plan to use it, please give me credit :) &lt;p&gt;Comments? Suggestions? (Besides &amp;quot;the graphics suck, make them better&amp;quot;)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+PieMenu+Component&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!283.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!283.entry</guid><pubDate>Fri, 26 Oct 2007 22:56:54 GMT</pubDate><slash:comments>25</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!283/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!283.entry#comment</wfw:comment><dcterms:modified>2007-10-26T22:56:54Z</dcterms:modified></item><item><title>Mass Effect review in GameInformer</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!281.entry</link><description>&lt;div&gt;&lt;a href="http://www.xbox360fanboy.com/2007/10/16/game-informer-gives-mass-effect-9-75/"&gt;www.xbox360fanboy.com&lt;/a&gt; informs us that GameInformer made a review of Mass Effect, and it received an amazin &lt;strong&gt;9.75&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.n4g.com/M/8/Images//74000/74437.jpg"&gt;Here&lt;/a&gt;'s the review for those interested.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I'm proud to be a fan of this game ;)&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Mass+Effect+review+in+GameInformer&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>Games</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!281.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!281.entry</guid><pubDate>Tue, 16 Oct 2007 20:21:49 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!281/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!281.entry#comment</wfw:comment><dcterms:modified>2007-10-16T20:21:49Z</dcterms:modified></item><item><title>Tutorial Contest Winner!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!280.entry</link><description>&lt;p&gt;Ziggyware just announced the &lt;a href="http://www.ziggyware.com/news.php?readmore=475"&gt;winners of the XNA Tutorial Contest&lt;/a&gt;, and the first place goes to.... &lt;p&gt;&lt;strong&gt;ME!&lt;/strong&gt; Hurraaaay! Party!!!! &lt;p&gt;I'm extremely happy about this, and I want to thank everyone who supported me, who voted for me, and who somehow contributed to this. Also, I want to congratulate all other contestants for their good tutorials! &lt;p&gt;Special thanks go to: &lt;p&gt;Michael Morton, for organizing the contest! &lt;p&gt;Lidia, for every little thing she does, and for her support, understanding, caring and love. &lt;p&gt;Nick Gravelyn, for helping Michael with putting my article online &lt;p&gt;All my voters :) &lt;p&gt;All of the XNA Community &lt;p&gt;The XNA Team &lt;p&gt;Thank you! I'll do my best to continue providing tutorials and help to the community.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Tutorial+Contest+Winner!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!280.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!280.entry</guid><pubDate>Sat, 13 Oct 2007 23:09:42 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!280/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!280.entry#comment</wfw:comment><dcterms:modified>2007-10-13T23:11:56Z</dcterms:modified></item><item><title>Gamefest 2007 slides available</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!278.entry</link><description>&lt;p&gt;  &lt;p&gt;&lt;a href="http://letskilldave.com/archive/2007/10/13/gamefest-2007-slides-and-audio-recordings-well-most-of-them.aspx"&gt;Let's Kill Dave&lt;/a&gt; has posted the list of Gamefest presentations what will have slides and recordings available for them. Since most of the links were not posted right, Leaf made the needed corrections. You can now find all the links &lt;a href="http://xna-uk.net/blogs/news/archive/2007/10/13/gamefest-2007-slides-and-audio.aspx"&gt;here&lt;/a&gt;. &lt;p&gt;The titles sound extremely interesting, and I can't wait to devour them. &lt;p&gt;I wish you all Happy Reading / Listening :)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Gamefest+2007+slides+available&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!278.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!278.entry</guid><pubDate>Sat, 13 Oct 2007 21:22:43 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!278/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!278.entry#comment</wfw:comment><dcterms:modified>2007-10-13T21:22:43Z</dcterms:modified></item><item><title>Running the VTF Tutorial samples on ATI or SM 2.0 cards</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!272.entry</link><description>&lt;p&gt;   &lt;p&gt;        I was talking to Michael Morton (Ziggyware owner) about the possibility of making my code run on ATI cards, and I told him that &lt;a href="http://www.artificial-studios.co.uk/"&gt;someone else&lt;/a&gt; tried using R2VB in XNA and failed. In that moment, an idea came to me: &amp;quot;Let's simulate R2VB on the CPU&amp;quot;. Yes, I know, this sound crazy, but let's analyze a little.  &lt;p&gt;        In my tutorials, because I wanted to use vertex textures, I had to store lots of data in textures and do simulations in textures. Examples of these are: the particle systems, the deformation map creation, applying the deformation map to the displacement map, etc. These were, in a way, secondary effects of using VTF, which actually proved to increase the performance. So, rather than doing everything on the CPU, we will still do these texture manipulations on the GPU.  &lt;p&gt;        First, let me explain how R2VB works. For the most part, the operations I did in the tutorials are exactly the same: use some pixel shader for simulations and deformations. The difference between VTF and R2VB comes on play when you finally have a texture, and you want to use the information from this texture to alter the vertices. As we saw in the tutorial, VTF reads from this texture inside the vertex shader. On the other hand, R2VB takes that information and draws it in a &amp;quot;texture&amp;quot;. That &amp;quot;texture&amp;quot; is at the same GPU memory address as a Vertex Buffer, so, when writing to the texture, the information is actually written to the vertex buffer. Hence, the name Render To Vertex Buffer.  &lt;p&gt;        We will emulate this behavior in software, on the CPU. So all the performance gained by doing the simulations using pixel shaders and render-to-texture remains.  &lt;p&gt;        We take the second tutorial, the one with morphing terrain. Let's see what needs to be done. Open Grid.cs, and add the following function. &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;Single[] textureData;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; DrawCPUSingle(Texture2D displacementTexture)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;{ &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;            &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        displacementTexture.GetData&amp;lt;Single&amp;gt;(textureData);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; displacementTexture.Height; i++)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;                &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; j = 0; j &amp;lt; displacementTexture.Width; j++)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                        vertices[i * displacementTexture.Width + j].Position.Y = textureData[j * displacementTexture.Height + i];&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        IGraphicsDeviceService igs = (IGraphicsDeviceService)game.Services.GetService(&lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(IGraphicsDeviceService));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        device = igs.GraphicsDevice;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        device.VertexDeclaration = vertexDecl;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        device.Indices = ib;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        device.DrawUserIndexedPrimitives&amp;lt;VertexPositionNormalTexture&amp;gt;(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, 2 * dimension * dimension);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; LoadGraphicsContent()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        textureData = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Single[(dimension + 1) * (dimension + 1)];&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        [...]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As you can see, we take as input the texture that would be used as a displacement texture, then we use GetData() on it, and we write that data to our vertex array. The index array is the same as before. After this, instead of using a dynamic vertex buffer, we use the DrawUserIndexedPrimitives. 
&lt;p&gt;        Now, we need to modify the &lt;strong&gt;VTFDisplacement.fx&lt;/strong&gt; effect file. The modifications appear in the vertex shader:
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;VS_OUTPUT TransformCPU(VS_INPUT In)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        VS_OUTPUT Out = (VS_OUTPUT)0;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        float4x4 viewProj = mul(view, proj);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        float4x4 worldViewProj= mul(world, viewProj);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        &lt;span style="color:#008000"&gt;// we don't read from the texture anymore&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; height = In.position.y;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        In.position.y = height * maxHeight;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        Out.worldPos = mul(In.position, world);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        Out.position = mul( In.position , worldViewProj);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        Out.uv = In.uv;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        float4 TexWeights = 0;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        TexWeights.x = saturate( 1.0f - abs(height - 0) / 0.2f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        TexWeights.y = saturate( 1.0f - abs(height - 0.3) / 0.25f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        TexWeights.z = saturate( 1.0f - abs(height - 0.6) / 0.25f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        TexWeights.w = saturate( 1.0f - abs(height - 0.9) / 0.25f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; totalWeight = TexWeights.x + TexWeights.y + TexWeights.z + TexWeights.w;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        TexWeights /=totalWeight;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;         Out.textureWeights = TexWeights;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; Out;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;[...] &lt;span style="color:#008000"&gt;//pixe shader remains the same&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;technique GridDrawCPU&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    pass P0&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#008000"&gt;//we can use SM 2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        vertexShader = compile vs_2_0 TransformCPU();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        pixelShader  = compile ps_2_0 PixelShader();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The final modifications are done in the Draw function in Game1.cs
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (EffectPass pass &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; gridEffect.CurrentTechnique.Passes)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                pass.Begin();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;                grid.DrawCPUSingle(morphRenderTarget.GetTexture());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                pass.End();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;     }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That's all. The Steps in Snow sample is converted in exactly the same way. 
&lt;p&gt;For the particle system sample, we have the following modifications. In the vertex shader of the file &lt;strong&gt;Particle.fx&lt;/strong&gt;, change the line 
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;float4 realPosition = tex2Dlod ( positionSampler, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;                          float4(In.vertexData.x, In.vertexData.y,0,0));&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;into 
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;float4 realPosition = In.vertexData;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In Game1.cs, modify the following code: 
&lt;p&gt; 
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;Vector4[] textureData;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; LoadGraphicsContent(&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; loadAllContent)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (loadAllContent)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;                textureData = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Vector4[particleCount * particleCount];&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                [...]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        [...]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        graphics.GraphicsDevice.Clear(Color.Black);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        Render2TextureMorph((&lt;span style="color:#0000ff"&gt;float&lt;/span&gt;)Math.Sin(gameTime.TotalGameTime.TotalSeconds) * 0.5f + 0.5f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        Render2TextureNormalCompute();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        SimulateParticles(gameTime);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        [...]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        graphics.GraphicsDevice.RenderState.DestinationBlend = Blend.One;           &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        Texture2D positionTexture = positionRT.GetTexture();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        positionTexture.GetData&amp;lt;Vector4&amp;gt;(textureData);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; positionTexture.Height; i++)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; j = 0; j &amp;lt; positionTexture.Width; j++)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;               {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                        vertices[i * positionTexture.Width + j].Position.X = textureData[j * positionTexture.Height + i].X;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;                        vertices[i * positionTexture.Width + j].Position.Y = textureData[j * positionTexture.Height + i].Y;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                        vertices[i * positionTexture.Width + j].Position.Z = textureData[j * positionTexture.Height + i].Z;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;               }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (VertexDeclaration decl = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; VertexDeclaration(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;                   graphics.GraphicsDevice, VertexPositionColor.VertexElements))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        graphics.GraphicsDevice.VertexDeclaration = decl;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        renderParticleEffect.Begin();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        renderParticleEffect.CurrentTechnique.Passes[0].Begin();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        graphics.GraphicsDevice.DrawUserPrimitives&amp;lt;VertexPositionColor&amp;gt;(PrimitiveType.PointList, vertices, 0, particleCount * particleCount);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        renderParticleEffect.CurrentTechnique.Passes[0].End();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        renderParticleEffect.End();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;        [...]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;        Same technique used here: process the data on the GPU, in the textures, and then just GetData from the texture, and use it in to draw the particles. 
&lt;p&gt;        The problem of performance: here are some experiments I did: 
&lt;p&gt;  
&lt;table cellspacing=0 cellpadding=3 width="100%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sample&lt;/strong&gt;
&lt;td&gt;&lt;strong&gt;Framerate with vertex textures&lt;/strong&gt;
&lt;td&gt;&lt;strong&gt;framerate with GetData()&lt;/strong&gt;
&lt;tr&gt;
&lt;td&gt;Morphing Terrain, with Bilinear Filtering in VTF
&lt;td&gt;100 FPS
&lt;td&gt;65 FPS
&lt;tr&gt;
&lt;td&gt;Morphing Terrain, without Biliner Filtering
&lt;td&gt;155 FPS
&lt;td&gt;69 FPS
&lt;tr&gt;
&lt;td&gt;Particle System (65536 particles) Terrain Collision, no terrain rendered
&lt;td&gt;130 FPS
&lt;td&gt;65 FPS
&lt;tr&gt;
&lt;td&gt;Steps in Snow
&lt;td&gt;260 FPS
&lt;td&gt;80 FPS&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;        The system this was ran on is Intel Core2 6300 (1.87Ghz), 1 GB RAM, GeForce 7600 GS 256MB 
&lt;p&gt;        Some care still has to be taken. Grid.Dimension has to be of size power-of-two-minus-one (255,511, etc). This is just because of my code. By doing this on the CPU, we loose the billinear filtering done in the vertex shader, so the Dimension of the grid has to be the same as the dimension of the displacement texture. (actually, that size minus one, as explained earlier). So, for a heightmap of 256*256, the grid's dimension has to be 255. The bilinear filtering can of course be done on the CPU also, but you'll have to see if it is worth it. These are the only restrictions I can think of. 
&lt;p&gt;        I hope this made some of you (ATI owners) more happy about my tutorial :)  
&lt;p&gt;        The source code for the modified chapters is found here: &lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter2CPU.zip"&gt;Chapter2CPU.zip&lt;/a&gt;, &lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter3CPU.zip"&gt;Chapter3CPU.zip&lt;/a&gt; and &lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter4CPU.zip"&gt;Chapter4CPU.zip&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Running+the+VTF+Tutorial+samples+on+ATI+or+SM+2.0+cards&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!272.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!272.entry</guid><pubDate>Sat, 22 Sep 2007 19:58:44 GMT</pubDate><slash:comments>28</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!272/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!272.entry#comment</wfw:comment><dcterms:modified>2007-09-24T16:04:45Z</dcterms:modified></item><item><title>Vertex Textures tutorial online!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!268.entry</link><description>&lt;p&gt;My article was just posted online on &lt;a href="http://www.ziggyware.com"&gt;www.ziggyware.com&lt;/a&gt; . You can read it &lt;a href="http://www.ziggyware.com/readarticle.php?article_id=127"&gt;HERE&lt;/a&gt;. &lt;p&gt;Lots of thanks go to Michael Morton and &lt;a href="http://nick.gravelyn.com/"&gt;Nick Gravelyn&lt;/a&gt; who formatted the article and put it &lt;a href="http://www.ziggyware.com/news.php?readmore=446"&gt;online&lt;/a&gt;. Thank you guys very much! &lt;p&gt;Please post any comments either on the article's site, or here.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Vertex+Textures+tutorial+online!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!268.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!268.entry</guid><pubDate>Sat, 22 Sep 2007 12:08:00 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!268/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!268.entry#comment</wfw:comment><dcterms:modified>2007-09-22T12:08:18Z</dcterms:modified></item><item><title>Four uses of Vertex Textures</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!267.entry</link><description>&lt;p&gt;        I have finished writing my tutorial on vertex textures, and I have submitted it to &lt;a href="http://www.ziggyware.com/"&gt;Ziggyware&lt;/a&gt;'s &lt;a href="http://www.ziggyware.com/news.php?readmore=400"&gt;XNA Tutorial Contest&lt;/a&gt;. It's now in the process of being formatted and arranged, and it will soon be put online. &lt;p&gt;        The tutorial will cover four ways in which you can use Vertex Textures. The four effects covered will begin with basic operations, and will gradually increase in difficulty, touching different techniques that can be used together with vertex textures. Some chapters may contain a &lt;b&gt;Bonus&lt;/b&gt;  section, in which I will shortly explain how to apply certain additional techniques to the effects. &lt;p&gt; Here's screenshots from the four chapters, and the downloadable code for them: &lt;p&gt;&lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter1.zip"&gt;Chapter I: Terrain Rendering Using Heightmaps&lt;/a&gt; &lt;p&gt; &lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBpvHM1aMUvh7Gctce7DPMvGi7inYEcALYm-6CRazg45zadM6_9uWBIiRO8LCdwExWtycAkBvmfSRoB_1So7cyZa"&gt;&lt;img height=180 alt=simpleTerrain src="http://by1.storage.msn.com/y1pt6-V36MAGBpSJkxeLFLR9qejA84axe0rZDiizp2oBPUB9mRECfPFd-ZGGjx3hQmVU-ZyIaZwJfrMHt9GwuyEToSe7kih04mb" width=240&gt;&lt;/a&gt; &lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBogGr1X9xjCZ3vaHaw4fsjeEGFgp-HUM40XHV4B1oyrHHkowqIuUppFkWPBB6DfL_6OXQk_F6UodpD7Pcp03SLr"&gt;&lt;img height=180 alt=largeTerrain src="http://by1.storage.msn.com/y1pt6-V36MAGBqDIa09gpcYYqtg0jGE0HDvHKGSdt_KiV8oZlPu3H3AIhBSvF-kmMvP47S-43SCX5sP3HZgZMgzZZRcHPBOD2Rv" width=240&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBrs-pPZ_x0Ajj3vsu1W2svkZbVLcpRScd3Wdu4LFAgoUs0WaynsNOIym9lUQmoPihKklWvfGPXDoEl0IltNOvVA"&gt;&lt;img height=180 alt=bilinear src="http://by1.storage.msn.com/y1pt6-V36MAGBo_jlldBUZ7a56UCHM27zJ9jA0gfeTNjy6GJscDn8394F_l4c0syvGiL1tZV9BmM0IN1iJRzwcgxWTKh5eTJ0GI" width=240&gt;&lt;/a&gt; &lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBqo6WBjuGcL1YRASNdf4Y_QUqlXi6OHfin0pj4uOKj68ksHcbc2fH7bm7CdZycP5NWo72jSkiMg5kMbTyxFJj8w"&gt;&lt;img height=180 alt=textured src="http://by1.storage.msn.com/y1pt6-V36MAGBpOi-F29r427CIWpFvIyio5VY1uu7x_T1QkjIJF1WTv1WTCImt6w4_OTa2alR_f1eQE3D343mkGA1TbG5UzEk78" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter2.zip"&gt;Chapter II: Terrain Morphing&lt;/a&gt; &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBooB4p4AmAFbDg0KfkvYAjZpU_FVm6Z_98CRZz-UMUFrpfIme_69NjKdzEXD1oWUpGyrGdvJp9uqwwZkPo7cHCu"&gt;&lt;img height=180 alt=morph src="http://by1.storage.msn.com/y1pt6-V36MAGBo7PY-lxo132ybSvDcrNO21ApNBR3UkZ5EGLe1pKhy-cTAJYa1GHwDgti09nMz9Rhx37JI5ouRTzpvbJlexUj7V" width=240&gt;&lt;/a&gt; &lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBqnZW048NgznKL9CF3pBTiv9E3z_qaHlY8NU6ZlciBeUc4dIjAzJca_1hX-79KSy20n0Ii0VsqFvzguM7jIYEPI"&gt;&lt;img height=180 alt=normals src="http://by1.storage.msn.com/y1pt6-V36MAGBoJjPdmt06x50Ma2Pd02zq7dQxbtNoSRmAgVr49cBci2gvdxFBIE36sywP9tKnFzT64hnZx33vce32ds2siwcjV" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter3.zip"&gt;Chapter III: Particle System on the GPU&lt;/a&gt; &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBHOo7tpWfM_l-mYLYUXr5GZl9fEPPv11kAXc7V0KLBkGaLRfZ5Kn800smxQjSte2I"&gt;&lt;img height=180 alt=particles src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBlU8LgLMgSVhXs5s-45V2CM1SLtFop93bZ8KWUBoJwMkAb3e8zHOF67ddnzIfC58A" width=240&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UC2TDYG9_60JEsJz4-2--W9MjfG_brst2ES1374RtKJalLYU5Whsxgia3K3myTOi3o"&gt;&lt;img height=180 alt=particlesCollision src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBL7-X9XxhNUNFxGKPpT7tacsFLGKyZRgqIjvpH3ZNgKVCDMtVFoqbskrP7EZiOK7Y" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.kyleschouviller.com/catalinzima/VTF/Chapter4.zip"&gt;Chapter IV: Steps In Snow&lt;/a&gt; &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UAXR8ee9wj07Nw6MGPYnIWMTyfwoPxT905__8SqTDE7e56IAS1ta6VoWO9W6dMKmvU"&gt;&lt;img height=180 alt=tough3 src="http://by1.storage.msn.com/y1pt6-V36MAGBp7hKYwO7lHh2sPP7Y39DU7UrABo1wlmXKCeby3mf55dI0QkJVus8oCFmzLfaAjK8x95e0vdbo5O4Zh9WVTglJQ" width=240&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UDhYpIIWKvhmEe9GGXo_HsJ850JohsY-oOxdKu4eKgUDv_1b0YThfxc0TNs8S-iw-E"&gt;&lt;img height=180 alt=trail src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UA7nA427awLbVDnJ_xpi3JG9zmUVu-nu37F3NMJRn7iuwc1cP63FMSV6bDqzjpacQs" width=240&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Four+uses+of+Vertex+Textures&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!267.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!267.entry</guid><pubDate>Fri, 21 Sep 2007 15:27:05 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!267/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!267.entry#comment</wfw:comment><dcterms:modified>2007-09-21T15:31:43Z</dcterms:modified></item><item><title>Fog of War Sample</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!238.entry</link><description>&lt;p&gt;By semi-popular request (I heard one person asking for it, and thought it was an interesting idea :) ), I've put together a quick sample that shows a way to implement Fog Of War in XNA, for a 3D game. As a word of warning, this is put together in a couple of hours, so it may be hacky in some parts. &lt;p&gt;The idea is to have the Fog Of War in a texture. The texture represents a view from above, covering all terrain. Using render to texture, I draw a white gradient disk in this texture for each friendly unit of the player, using additive blending. &lt;p&gt;After this, I draw the scene normally, and when drawing the enemies, the pixel shader gets, based on its position, the corresponding pixel from the Fog of War Texture. Using this information, it sets the alpha value of the output. This way, when the enemy unit is close to the friendly unit, you can see it, at the borders it fades away, and when out of range, it is invisible. &lt;p&gt;The controls are similar to the ones in SkinnedModel Sample. &lt;p&gt;If you use this for any project, please send me a screenshot. The sample can be found &lt;a href="http://www.kyleschouviller.com/catalinzima/WarFog.zip"&gt;here&lt;/a&gt;. (Thanks again Kyle, for hosting my files) &lt;p&gt;And some pictures: &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBogrZwo3KggbGCSXDOT0Xr7jRda7SvGMwmssqFdMKREh0P7UiNINHJXF8wi1dNy44"&gt;&lt;img height=180 alt=1 src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBP3SWS-BayZ40EkZ3av1kPYmIrbB5ZuR1nUJxQvhFJ5_NKd-vHp45GTvpm1ViwFjc" width=240&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UCbJ_cECGXv64kqWlj1iMDJnsGZEMMbuXFYq0PqkBjxkXuDDVdgz-3TG87_oST1lyc"&gt;&lt;img height=180 alt=4 src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UD61rBoitQzfkOdT2xOcSO61PIV_s4uPaGWXBI___neA32pvk4_G7tEXWIKt7CtPOA" width=240&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Fog+of+War+Sample&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>XNA</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!238.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!238.entry</guid><pubDate>Wed, 12 Sep 2007 09:49:19 GMT</pubDate><slash:comments>17</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!238/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!238.entry#comment</wfw:comment><dcterms:modified>2007-09-12T09:49:19Z</dcterms:modified></item><item><title>Bloxorz</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!231.entry</link><description>&lt;p&gt;I found this absolutely great game. It's a game with blocks. Fortunately, it only has 33 stages, and I already reached stage 25. I say &lt;em&gt;fortunately&lt;/em&gt; because it's so addictive that I can't let it out of my hands. Hopefully, the last 8 levels won't be too difficult, so I can get back to coding soon. &lt;p&gt;Oh, almost forgot: the game can be found &lt;a href="http://www.albinoblacksheep.com/games/bloxorz"&gt;here&lt;/a&gt;. &lt;p&gt;Now back to block rotations!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Bloxorz&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>Games</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!231.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!231.entry</guid><pubDate>Tue, 11 Sep 2007 14:03:37 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!231/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!231.entry#comment</wfw:comment><dcterms:modified>2007-09-11T14:03:37Z</dcterms:modified></item><item><title>Converting Displacement Maps into Normal Maps in HLSL</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!223.entry</link><description>&lt;p&gt;Working on my VTF tutorial, I came across the need to apply lighting to a terrain. For lighting, we need normals, of course, but I only had heightmaps available. &lt;p&gt;When the terrain is static, this poses no problems at all. All we have to de is generate a normal map from the heightmaps with whatever tools we want. For example, NVIDIA has a Photoshop plugin for this &lt;a href="http://developer.nvidia.com/object/photoshop_dds_plugins.html"&gt;here&lt;/a&gt;. &lt;p&gt;However, when we have dynamic terrain, with real time deformation, this is no longer an option. This is especially the case when we make the deformations on the displacement map. After lots of reading and searching, I've come across the &lt;a href="http://en.wikipedia.org/wiki/Sobel"&gt;Sobel Filter&lt;/a&gt;, and a sample from ATI that uses it to compute normal maps. &lt;p&gt;As a result, I made a pixel shader that takes as input the displacement map and outputs the normal map. I believe this could be used for static terrain, and computed in a Content Processor, but I'm not very experienced with Content Processors, so I didn't try it. &lt;p&gt;At runtime, after modifying the displacement map, I apply this shader and put the result into a render target. This result is then used when drawing the terrain, when computing lighting in the pixel shader. &lt;p&gt;So here's the HLSL code: &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;float&lt;/span&gt; textureSize = 256.0f;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;float&lt;/span&gt; texelSize =  1.0f / textureSize ; &lt;span style="color:#008000"&gt;//size of one texel;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#0000ff"&gt;float&lt;/span&gt; normalStrength = 8;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;float4 ComputeNormalsPS(&lt;span style="color:#0000ff"&gt;in&lt;/span&gt; float2 uv:TEXCOORD0) : COLOR&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; tl = abs(tex2D (displacementSampler, uv + texelSize * float2(-1, -1)).x);   &lt;span style="color:#008000"&gt;// top left&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt;  l = abs(tex2D (displacementSampler, uv + texelSize * float2(-1,  0)).x);   &lt;span style="color:#008000"&gt;// left&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; bl = abs(tex2D (displacementSampler, uv + texelSize * float2(-1,  1)).x);   &lt;span style="color:#008000"&gt;// bottom left&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt;  t = abs(tex2D (displacementSampler, uv + texelSize * float2( 0, -1)).x);   &lt;span style="color:#008000"&gt;// top&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt;  b = abs(tex2D (displacementSampler, uv + texelSize * float2( 0,  1)).x);   &lt;span style="color:#008000"&gt;// bottom&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; tr = abs(tex2D (displacementSampler, uv + texelSize * float2( 1, -1)).x);   &lt;span style="color:#008000"&gt;// top right&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt;  r = abs(tex2D (displacementSampler, uv + texelSize * float2( 1,  0)).x);   &lt;span style="color:#008000"&gt;// right&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; br = abs(tex2D (displacementSampler, uv + texelSize * float2( 1,  1)).x);   &lt;span style="color:#008000"&gt;// bottom right&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;// Compute dx using Sobel:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//           -1 0 1 &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//           -2 0 2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//           -1 0 1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; dX = tr + 2*r + br -tl - 2*l - bl;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;// Compute dy using Sobel:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//           -1 -2 -1 &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//            0  0  0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//            1  2  1&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;float&lt;/span&gt; dY = bl + 2*b + br -tl - 2*t - tr;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;// Build the normalized normal&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    float4 N = float4(normalize(float3(dX, 1.0f / normalStrength, dY)), 1.0f);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;    &lt;span style="color:#008000"&gt;//convert (-1.0 , 1.0) to (0.0 , 1.0), if needed&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; N * 0.5f + 0.5f;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You should tweak normalStrength until the result you get is satisfactory.
&lt;p&gt;And here is the result of applying that code to two heightmaps, and some terrain lit using a normal map generated by this shader.
&lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBpUaSRi9ISM6bBr7_hWfpuLk0_im_oSwFhYmRF55QVlGL0mwHOQGB5RCfd3-FwHIQaSRqcBSLlJPPDfA37FPhCO"&gt;&lt;img height=240 alt=displacement src="http://by1.storage.msn.com/y1pt6-V36MAGBrPB-rmx2GNzW8_gyG9XvyVmutLD6epj4OWqV9w5GMcoldPp0VFNVLFXdvb5c3bTLmAQBFCzct69pmPqwCJ37xT" width=240&gt;&lt;/a&gt; &lt;a href="http://by1.storage.msn.com/y1pt6-V36MAGBpinAwm-t-Kx1Ji60z2C2QxVUNKliIgYMUXdDGMKD-1sdEb7GzdENt7lk22U9trTybNmLop94cKFfFW45Mo-S11"&gt;&lt;img height=180 alt=normals src="http://by1.storage.msn.com/y1pt6-V36MAGBqyD8iai_2JskvPpsI5y1ZWe8jX71y-7iWyPtUdL0X9RigZsVOcchnBJaO8ZPq1sLyju9kTtJFRFfVrjvKoxx0L" width=240&gt;&lt;/a&gt; 
&lt;p&gt;Until next time, Happy Coding!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Converting+Displacement+Maps+into+Normal+Maps+in+HLSL&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><category>HLSL</category><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!223.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!223.entry</guid><pubDate>Tue, 11 Sep 2007 10:09:36 GMT</pubDate><slash:comments>12</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!223/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!223.entry#comment</wfw:comment><dcterms:modified>2007-09-11T10:26:59Z</dcterms:modified></item><item><title>Vertex Texture Fetch Tutorial Teaser!</title><link>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!210.entry</link><description>&lt;p&gt;  &lt;p&gt;Here's some screenshots from the upcoming VTF tutorial.  &lt;p&gt;The code is mostly done, and now I'm writing the tutorial itself. &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UC2GqNDDvabu3Uk3RTbjXDd0FtuswewND6pJ7NsYnoNW8J5eTKb6qA7Auo1wIa2ON8"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=180 alt=textured src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UAbUPYVOahcL9sM6c1Vtb_ZBE5hdppO4TcZxv97Kv7bn2xI6Mo1qLqb8__qyyvEi5w" width=240 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UAWbesGF1GrPnCckMeJC5QNkY2iCFskUMuoTSMKceJLM1ghYB4GEoO6anlVZMtK00E"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=180 alt=morph src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UBN6syKuwfOs4WqEoZVPZvz1m1kV6C05zHUTMD9-ndYzZ5Q6y4mqGRPdNxuHSI6AQg" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UCtuoCVEEkWiosNo0OROxWOmln1oC-tSj_f65xacRRGa-D5ko_DHGopz7z3bAu9Xp4"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=180 alt=particles src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UC7Aydz-7thzpr7WsEHqeJKW-X5L1lMXDB7qmbGqhtkFqacTkFarlkdXhcCpECGm5s" width=240 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pXvA9I-pT_UCCmnmNB2-bX0HMARpUJQiD-Bunc-uuJx-ZZuZt7JDYopBaJVH5HXjOzT6gaGU6fac"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=180 alt="snow steps" src="http://byfiles.storage.msn.com/y1pXvA9I-pT_UDUXP0uPvDmNhp_I5RQd05pFYUKXy1wqWl7v17mvClnZ754AOCtJ5bs90otqNDihqg" width=240 border=0&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4440209354424866543&amp;page=RSS%3a+Vertex+Texture+Fetch+Tutorial+Teaser!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=catalinzima.spaces.live.com&amp;amp;GT1=catalinzima"&gt;</description><comments>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!210.entry#comment</comments><guid isPermaLink="true">http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!210.entry</guid><pubDate>Tue, 04 Sep 2007 14:11:32 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://catalinzima.spaces.live.com/blog/cns!3D9ECAE1F2DC56EF!210/comments/feed.rss</wfw:commentRss><wfw:comment>http://catalinzima.spaces.live.com/Blog/cns!3D9ECAE1F2DC56EF!210.entry#comment</wfw:comment><dcterms:modified>2007-09-04T14:11:32Z</dcterms:modified></item><item><title>Book List: Book List</title><link>http://catalinzima.spaces.live.com/Lists/cns!3D9ECAE1F2DC56EF!149</link><description>&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;Game-Thrones-Song-Fire-Book&amp;#47;dp&amp;#47;0553588486&amp;#47;ref&amp;#61;pd_bbs_sr_1&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;s&amp;#61;books&amp;#38;qid&amp;#61;1187862996&amp;#38;sr&amp;#61;1-1"&gt;George R. R. Martin: A Song of Ice And Fire 1 &amp;#58; A Game of Thrones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;Clash-Kings-Song-Fire-Book&amp;#47;dp&amp;#47;0553381695&amp;#47;ref&amp;#61;pd_bbs_2&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;s&amp;#61;books&amp;#38;qid&amp;#61;1187862996&amp;#38;sr&amp;#61;1-2"&gt;George R. R. Martin: A Song of Ice And Fire 2 &amp;#58; A Clash of Kings&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;Storm-Swords-Song-Fire-Book&amp;#47;dp&amp;#47;055357342X&amp;#47;ref&amp;#61;pd_sim_b_img&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;qid&amp;#61;1187862996&amp;#38;sr&amp;#61;1-1"&gt;George R.R. Martin: A Song of Ice And Fire 3 &amp;#58; A Storm of Swords&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;Feast-Crows-Song-Ice-Fire&amp;#47;dp&amp;#47;055358202X&amp;#47;ref&amp;#61;pd_bbs_sr_2&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;s&amp;#61;books&amp;#38;qid&amp;#61;1187862318&amp;#38;sr&amp;#61;1-2"&gt;George R. R. Martin: A Song of Ice and Fire 4 &amp;#58; A Feast For Crows&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;GPU-Gems-Programming-High-Performance-General-Purpose&amp;#47;dp&amp;#47;0321335597&amp;#47;ref&amp;#61;pd_bbs_sr_2&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;s&amp;#61;books&amp;#38;qid&amp;#61;1187862240&amp;#38;sr&amp;#61;8-2"&gt;Matt Pharr and Randima Fernando: GPU Gems 2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;dp&amp;#47;0321515269&amp;#47;ref&amp;#61;s9_asin_image_0&amp;#47;105-0578434-5617259&amp;#63;pf_rd_m&amp;#61;ATVPDKIKX0DER&amp;#38;pf_rd_s&amp;#61;right-1&amp;#38;pf_rd_r&amp;#61;0T2MQNQN53QWXSKR5Z1F&amp;#38;pf_rd_t&amp;#61;101&amp;#38;pf_rd_p&amp;#61;280761701&amp;#38;pf_rd_i&amp;#61;507846"&gt;Hubert Nguyen: GPU Gems 3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com&amp;#47;Harry-Potter-Deathly-Hallows-Book&amp;#47;dp&amp;#47;0545010225&amp;#47;ref&amp;#61;pd_bbs_sr_1&amp;#47;105-0578434-5617259&amp;#63;ie&amp;#61;UTF8&amp;#38;s&amp;#61;books&amp;#38;qid&amp;#61;118