{"id":1558,"date":"2010-07-11T10:54:59","date_gmt":"2010-07-11T16:54:59","guid":{"rendered":"http:\/\/www.realtimerendering.com\/blog\/?p=1558"},"modified":"2010-07-11T10:54:59","modified_gmt":"2010-07-11T16:54:59","slug":"update-on-splinter-cell-conviction-rendering","status":"publish","type":"post","link":"https:\/\/www.realtimerendering.com\/blog\/update-on-splinter-cell-conviction-rendering\/","title":{"rendered":"Update on Splinter Cell: Conviction Rendering"},"content":{"rendered":"<p>In my <a href=\"http:\/\/www.realtimerendering.com\/blog\/gamefest-2010-presentations\/\">recent post<\/a> about <a href=\"http:\/\/www.microsoftgamefest.com\/seattle.htm\">Gamefest 2010<\/a>, I discussed Stephen Hill&#8217;s great <a href=\"http:\/\/www.selfshadow.com\/talks\/rwc_gdc2010_v1.pdf\">presentation<\/a> on the rendering techniques used in <em><a href=\"http:\/\/splintercell.us.ubi.com\/conviction\/\">Splinter Cell: Conviction<\/a><\/em>.<\/p>\n<p>Since then, Stephen contacted me &#8211; it turns out I got some details wrong, and he also provided me with some additional details about the techniques in his talk. I will give the corrections and additional details here.<\/p>\n<ol>\n<li>What I described in the post as a &#8220;software hierarchical Z-Buffer occlusion system&#8221; actually runs completely on the GPU. It was directly inspired by the GPU occlusion system used in ATI&#8217;s &#8220;March of the Froblins&#8221; demo (described here), and indirectly by the <a href=\"http:\/\/www.cs.princeton.edu\/courses\/archive\/fall02\/cs526\/papers\/greene93.pdf\">original (1993) hierarchical z-buffer paper<\/a>. Stephen describes his original contribution as &#8220;mostly scaling it up to lots of objects on DX9 hardware, piggy-backing other work and the 2-pass shadow culling&#8221;. Stephen promises more details on this &#8220;in a book chapter and possibly&#8230; a blog post or two&#8221; &#8211; I look forward to it.<\/li>\n<li>The rigid body AO volumes were initially inspired by the <a href=\"http:\/\/www.tml.tkk.fi\/~janne\/aofields\/\"><em>Ambient Occlusion Fields<\/em> paper<\/a>, but the closest research is <a href=\"http:\/\/hal.inria.fr\/inria-00070242_v1\/\">an INRIA tech report<\/a> that was developed in parallel with Stephen&#8217;s work (though he did borrow some ideas from it afterwards).<\/li>\n<li>The character occlusion was not performed using capsules, but via nonuniformly-scaled spheres. I&#8217;ll let Stephen speak to the details: &#8220;we transform the receiver point into \u2018ellipsoid\u2019-local space, scale the axes and lookup into a 1D texture (using distance to centre) to get the zonal harmonics for a unit sphere, which are then used to scale the direction vector. This works very well in practice due to the softness of the occlusion. It\u2019s also pretty similar to <em><a href=\"http:\/\/sites.google.com\/site\/perumaal\/\">Hardware Accelerated Ambient Occlusion Techniques on GPUs<\/a><\/em> although they work purely with spheres, which may simplify some things. I checked the P4 history, and our implementation was before their publication, so I\u2019m not sure if there was any direct inspiration. I\u2019m pretty sure our initial version also predated <a href=\"http:\/\/www.ppsloan.org\/publications\/SHExp.pdf\"><em>Real-time Soft Shadows in Dynamic Scenes using Spherical Harmonic Exponentiation<\/em><\/a> since I remember attending SIGGRAPH that year and teasing a friend about the fact that we had something really simple.&#8221;<\/li>\n<li>My statement that the downsampled AO buffer is applied to the frame using cross-bilateral upsampling was incorrect. Stephen just takes the most representative sample by comparing the full-resolution depth and object IDs against the surrounding down-sampled values. This is a kind of &#8220;bilateral point-sampling&#8221; which apparently works surprisingly well in practice, and is significantly cheaper than a full bilateral upsample. Interestingly, Stephen did try a more complex filter at one point: &#8220;Near the end I did try performing a bilinearly-interpolated lookup for pixels with a matching ID and nearby depth but there were failure cases, so I dropped it due to lack of time. I will certainly be looking at performing more sophisticated upsampling or simply increasing the resolution (as some optimisations near the end paid off) next time around.&#8221;<\/li>\n<\/ol>\n<p>A <a href=\"http:\/\/www.jshopf.com\/blog\/?p=235\">recent blog post<\/a> on Jeremy Shopf&#8217;s excellent <a href=\"http:\/\/www.jshopf.com\/blog\/\">Level of Detail blog<\/a> mentions similarities between the sphere technique and one used for AMD&#8217;s ping-pong demo (the technique is described in the article <em>Deferred Occlusion from Analytic Surfaces<\/em> in <a href=\"http:\/\/www.amazon.com\/ShaderX7-Rendering-Techniques-Wolfgang-Engel\/dp\/1584505982?tag=realtimerenderin\">ShaderX7<\/a>). To me, the basic technique is reminiscent of <a href=\"http:\/\/www.iquilezles.org\/www\/\">Inigo Quilez<\/a>&#8216; article <a href=\"http:\/\/www.iquilezles.org\/www\/articles\/sphereao\/sphereao.htm\">on analytical sphere ambient occlusion<\/a>; an <a href=\"http:\/\/graphics.cs.williams.edu\/papers\/AOVHPG10\/\">HPG 2010 paper<\/a> by <a href=\"http:\/\/www.cs.williams.edu\/~morgan\/\">Morgan McGuire<\/a> does something similar with triangles instead of spheres.<\/p>\n<p>Although the technique builds upon previous ones, it does add several new elements, and works well in the game. The technique does suffer from multiple-occlusion; I wonder if a technique similar to the 1D &#8220;compensation map&#8217; used by Morgan McGuire might help.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my recent post about Gamefest 2010, I discussed Stephen Hill&#8217;s great presentation on the rendering techniques used in Splinter Cell: Conviction. Since then, Stephen contacted me &#8211; it turns out I got some details wrong, and he also provided me with some additional details about the techniques in his talk. I will give the [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[43,399],"class_list":["post-1558","post","type-post","status-publish","format-standard","hentry","category-reports","tag-gamefest","tag-gamefest-2010"],"_links":{"self":[{"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/posts\/1558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/comments?post=1558"}],"version-history":[{"count":14,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/posts\/1558\/revisions"}],"predecessor-version":[{"id":1572,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/posts\/1558\/revisions\/1572"}],"wp:attachment":[{"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/media?parent=1558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/categories?post=1558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.realtimerendering.com\/blog\/wp-json\/wp\/v2\/tags?post=1558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}