<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-412309657486690750</id><updated>2012-02-17T10:59:36.546-08:00</updated><title type='text'>Timothy Lottes</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default?start-index=101&amp;max-results=100'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>337</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4080756082297120476</id><published>2012-02-11T23:48:00.000-08:00</published><updated>2012-02-11T23:51:06.330-08:00</updated><title type='text'>Old School: Modems</title><content type='html'>This brings back memories, years ago used to manually force modem handshake using my voice...&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/p8XKhCfsTts" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4080756082297120476?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4080756082297120476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/02/old-school-modems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4080756082297120476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4080756082297120476'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/02/old-school-modems.html' title='Old School: Modems'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/p8XKhCfsTts/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3283044128548463947</id><published>2012-02-11T18:12:00.000-08:00</published><updated>2012-02-11T22:45:29.996-08:00</updated><title type='text'>Random Text Mode Demo Tube</title><content type='html'>&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/t76kr2lKC2k" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3283044128548463947?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3283044128548463947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/02/random-text-mode-demo-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3283044128548463947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3283044128548463947'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/02/random-text-mode-demo-tube.html' title='Random Text Mode Demo Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/t76kr2lKC2k/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2795913786065091207</id><published>2012-02-07T00:06:00.000-08:00</published><updated>2012-02-07T00:09:14.822-08:00</updated><title type='text'>Trapcode Gallery</title><content type='html'>&lt;a href="http://www.trapcode.com/gallery"&gt;Trapcode - Gallery&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2795913786065091207?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2795913786065091207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/02/trapcode-gallery.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2795913786065091207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2795913786065091207'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/02/trapcode-gallery.html' title='Trapcode Gallery'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-648152572555344399</id><published>2012-02-06T10:06:00.000-08:00</published><updated>2012-02-06T10:07:04.590-08:00</updated><title type='text'>Another Hawken Tube</title><content type='html'>&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/udEAEARD-Fo" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-648152572555344399?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/648152572555344399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/02/another-hawken-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/648152572555344399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/648152572555344399'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/02/another-hawken-tube.html' title='Another Hawken Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/udEAEARD-Fo/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3934518164955075310</id><published>2012-02-01T18:48:00.000-08:00</published><updated>2012-02-01T18:49:32.927-08:00</updated><title type='text'>A Survey of Non-linear Pre-filtering Methods for Efficient and Accurate Surface Shading</title><content type='html'>&lt;a href="http://hal.inria.fr/inria-00589940/en"&gt;A Survey of Non-linear Pre-filtering Methods for Efficient and Accurate Surface Shading&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3934518164955075310?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3934518164955075310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/02/survey-of-non-linear-pre-filtering.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3934518164955075310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3934518164955075310'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/02/survey-of-non-linear-pre-filtering.html' title='A Survey of Non-linear Pre-filtering Methods for Efficient and Accurate Surface Shading'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1867892507934327215</id><published>2012-01-25T22:52:00.000-08:00</published><updated>2012-01-25T22:53:01.653-08:00</updated><title type='text'>Cyril Crassin's Ph.D thesis on GigaVoxels</title><content type='html'>&lt;a href="http://blog.icare3d.org/2012/01/phd-thesis-gigavoxels.html"&gt;Cyril Crassin's Ph.D thesis on GigaVoxels&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1867892507934327215?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1867892507934327215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/cyril-crassins-phd-thesis-on-gigavoxels.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1867892507934327215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1867892507934327215'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/cyril-crassins-phd-thesis-on-gigavoxels.html' title='Cyril Crassin&apos;s Ph.D thesis on GigaVoxels'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-344053177409786090</id><published>2012-01-23T11:04:00.001-08:00</published><updated>2012-01-23T11:04:53.078-08:00</updated><title type='text'>Rasterized Bounding Volume Hierarchies</title><content type='html'>&lt;a href="http://cg.ibds.kit.edu/publications/2012/RBVH/RBVH.pdf"&gt;Rasterized Bounding Volume Hierarchies&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-344053177409786090?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/344053177409786090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/rasterized-bounding-volume-hierarchies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/344053177409786090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/344053177409786090'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/rasterized-bounding-volume-hierarchies.html' title='Rasterized Bounding Volume Hierarchies'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5690521851264833904</id><published>2012-01-22T11:30:00.000-08:00</published><updated>2012-01-22T11:31:19.096-08:00</updated><title type='text'>p.i.d.</title><content type='html'>&lt;iframe src="http://video.unity3d.com/v.ihtml?token=f8609af8dea0d8af7b59b4c30df85b00&amp;photo%5fid=4261257" width="685" height="386" frameborder="0" border="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5690521851264833904?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5690521851264833904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/pid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5690521851264833904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5690521851264833904'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/pid.html' title='p.i.d.'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1738184853321409329</id><published>2012-01-21T22:17:00.000-08:00</published><updated>2012-01-21T23:59:10.626-08:00</updated><title type='text'>Practical Real-time Micro-Polygons?</title><content type='html'>&lt;b&gt;Is it Possible to do Real-time Micro-Polygons Today?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Answer has been no in the past, but is this still the case today on current GPUs? &lt;br /&gt;&lt;br /&gt;The concept is not new, and has some good things going for it. Shade at vertices only, with a pixel shader which simply interpolates color (possibly better than linear interpolation), with triangles small enough so that this works visually. Decouples shading rate from resolution, could decouple shading rate from refresh rate. Pre-tessellation of mesh can be a form of importance sampling for shading. Easily works with high quality hardware AA. Closer match to film rendering pipelines. Etc.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simplified GPU Primitive Rates&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Lets assume a 1 GHz GPU clock to make things simple and {1, 2, or 4} parallel raster units per GPU, so a maximum of {1, 2, or 4} billion triangles per second. Divide this by 60, provides {16, 33, or 66} million triangles per frame. Compared to around 2 million pixels at 1080p. &lt;br /&gt;&lt;br /&gt;The Fermi GTX480 demos had some amazing triangle rates on dynamic and simulated geometry,&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.maximumpc.com/files/u90693/debris_full.jpg"&gt;&lt;img src="http://www.maximumpc.com/files/u90693/debris_full.jpg" width="600" height="375"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Starting to think this idea is not as crazy as it sounds...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automatic LOD&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The "Automated Level of Detail Generation for HALO: REACH" presentation from the &lt;a href="http://www.gdcvault.com/free/gdc-11"&gt;2011 GDC Vault&lt;/a&gt; shows one method for automatic LOD generation for vertex shaded models. Video,&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/mjm-MwpAJ3I" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1738184853321409329?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1738184853321409329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/practical-real-time-micro-polygons.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1738184853321409329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1738184853321409329'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/practical-real-time-micro-polygons.html' title='Practical Real-time Micro-Polygons?'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/mjm-MwpAJ3I/default.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7777701151739865219</id><published>2012-01-20T14:28:00.000-08:00</published><updated>2012-01-20T16:06:57.313-08:00</updated><title type='text'>Misc Demo Tubes From 2011</title><content type='html'>&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/rg22pbQsAaU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/D8Tkdfl4sBA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/L0j9yAtFxTw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/EzZS7RoJFEE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7777701151739865219?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7777701151739865219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/misc-demo-tubes-from-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7777701151739865219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7777701151739865219'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/misc-demo-tubes-from-2011.html' title='Misc Demo Tubes From 2011'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/rg22pbQsAaU/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1225977489537150372</id><published>2012-01-20T10:10:00.001-08:00</published><updated>2012-01-20T10:10:45.212-08:00</updated><title type='text'>Many View Rasterization</title><content type='html'>&lt;a href="http://perso.telecom-paristech.fr/~hollande/manyview/ManyViewRasterization.pdf"&gt;Many View Rasterization&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1225977489537150372?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1225977489537150372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/many-view-rasterization.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1225977489537150372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1225977489537150372'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/many-view-rasterization.html' title='Many View Rasterization'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3485467201206262892</id><published>2012-01-19T21:12:00.001-08:00</published><updated>2012-01-19T21:12:39.223-08:00</updated><title type='text'>Screen Space Bent Cones</title><content type='html'>&lt;a href="http://www.mpi-inf.mpg.de/~ritschel/Papers/ScreenSpaceBentCones.pdf"&gt;Screen Space Bent Cones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3485467201206262892?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3485467201206262892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/screen-space-bent-cones.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3485467201206262892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3485467201206262892'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/screen-space-bent-cones.html' title='Screen Space Bent Cones'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3439161890214259710</id><published>2012-01-18T22:50:00.000-08:00</published><updated>2012-01-18T22:56:07.220-08:00</updated><title type='text'>Dear Esther</title><content type='html'>&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/D7VJ4lP-05A" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As fellow landscape photographers know, the most interesting light is when the sun is not to be found.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3439161890214259710?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3439161890214259710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/dear-esther.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3439161890214259710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3439161890214259710'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/dear-esther.html' title='Dear Esther'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/D7VJ4lP-05A/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-795358713552123294</id><published>2012-01-12T21:38:00.001-08:00</published><updated>2012-01-24T15:21:24.451-08:00</updated><title type='text'>To Extremes and Back To Reality</title><content type='html'>Entertaining &lt;a href="http://www.neogaf.com/forum/showthread.php?t=458542"&gt;NeoGAF Thread: Developers Discuss Benefits Of Targeting 720p/30fps Next Gen, Using Film Aesthetics&lt;/a&gt; captures a lot of the concerns of the vocal PC and console gamer, responding to comments in the &lt;a href="http://timothylottes.blogspot.com/2012/01/games-vs-film.html"&gt;Games vs Film&lt;/a&gt; post. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ok, Now Back to Reality&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;My prior comment, &lt;i&gt;"IMO a more interesting next-generation metric is can an engine on a ultra-highend PC rendering at 720p look as real as a DVD quality movie?"&lt;/i&gt; is a rhetorical question asking if it is possible for a real-time engine to start to approach the lower bound of a DVD movie in realism.&lt;br /&gt;&lt;br /&gt;To make this clear, I'm not suggesting that games should compromise interactive experience just to get visual quality. If I was going to develop a title for next generation consoles I would output 1080p and run frame locked to 60Hz with no dropped frames period. I still believe developers will be able to start to reach the quality of film for next generation consoles and current generation PCs, and I'm intending to develop or prove out some of the underlining techniques and technology which gets us there.&lt;br /&gt;&lt;br /&gt;At the same time, certainly expectations for next generation consoles should at least be grounded in some rough realistic estimates for performance. Using public information found on the internet, lets nail down a realistic estimate of what next generation console performance will be, by looking at how ATI/AMD has evolved GPU performance after the Xbox 360,&lt;br /&gt;&lt;br /&gt;(1.) Next gen console games will be outputting at 1080p. I can say this with full confidence simply because HDTV typically adds a frame of latency when it needs to convert from 720p to 1080p.&lt;br /&gt;&lt;br /&gt;(2.) Using HD6970 as a proxy for a high end PC version of the Xbox 360, lets compare specs. Going from the typical 720p @ 30Hz on Xbox360 to 1080p @ 60Hz on HD6970 with 2x the geometry would take roughly 4x the performance (2x the pixels and geometry times 2x the frame rate) just to provide a similar experience at the higher resolution and frame rate with similar average pixels/triangle. &lt;br /&gt;&lt;br /&gt;HD6970 has roughly another 2x over the 4x required to maintain same look at the full HD experience,&lt;br /&gt;&lt;pre&gt;Xbox360 =  240 Gflops : 22.4 GB/s :    8 Gtex/s :    4 Gpix/s&lt;br /&gt;HD6970  = 2703 Gflops :  173 GB/s : 84.5 Gtex/s : 28.2 Gpix/s&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;roughly    11x Gflops :   7x GB/s :  10x Gtex/s :   7x Gpix/s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(3.) What about process scaling, lets attempt to get an idea of what future technology might have, lets compare HD6970 to HD7970. Looks like AMD managed around a 1.4x on-paper spec increase except they did not scale Gpix/s.&lt;br /&gt;&lt;pre&gt;HD6970  = 2703 Gflops :  173 GB/s :  84.5 Gtex/s : 28.2 Gpix/s : 250 Watt&lt;br /&gt;HD7970  = 3789 Gflops :  264 GB/s : 118.4 Gtex/s : 29.6 Gpix/s : 250 Watt&lt;br /&gt;-------------------------------------------------------------------------&lt;br /&gt;roughly   1.4x Gflops : 1.5x GB/s : 1.4x Gtex/s :    1x Gpix/s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(4.) What about power scaling? The latest shrink of the Xbox 360 hardware uses a 115 Watt power supply (for the entire system, not just the GPU). So lets assume that next generation consoles won't have huge power supplies like PC GPUs. Taking what I'm wild guessing to be a really liberal estimate for possible GPU power for a 115 Watt system, lets compare a medium power modern proxy for the Xbox 360, the HD6750 (which is a 86 Watt TDP on paper). These numbers suggest if Microsoft launched a Xbox update around last year, that it would not be able to do 1080p at 60 Hz with the same look as current 360 games (because the HD6750 isn't 4x the 360).&lt;br /&gt;&lt;pre&gt;Xbox360 =  240 Gflops : 22.4 GB/s :    8 Gtex/s :    4 Gpix/s&lt;br /&gt;HD6750  = 1008 Gflops : 73.6 GB/s : 25.2 Gtex/s : 11.2 Gpix/s&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;roughly   4.2x Gflops : 3.3x GB/s : 3.2x Gtex/s : 2.8x Gpix/s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(5.) Next generation console performance will be a function of how much power the machine uses and what process technology each vendor adapts. Launch date of the console is going to hint at what process is used. Process scaling is not constant, but for the sake of making this simple, lets just assume each process gets 1.4x the performance. Then lets look at estimated performance scaling from the HD6750 to keep closer to current "console" power levels. This will provide some very rough estimate on what future consoles might have. Lets estimate process technology road maps by looking at &lt;a href="http://www.cdrinfo.com/images/uploaded/TSMC_LogicTech_Roadmap_OCt2011.jpg"&gt;google image search results&lt;/a&gt;,&lt;br /&gt;&lt;pre&gt;2011   : 40nm : HD6750 :  4.2x Gflops :  3.3x GB/s :  3.2x Gtex/s : 2.8x Gpix/s&lt;br /&gt;2012   : 28nm : ?????? :  5.8x Gflops :  4.6x GB/s :  4.4x Gtex/s : 3.9x Gpix/s&lt;br /&gt;2013.5 : 20nm : ?????? :  8.2x Gflops :  6.4x GB/s :  6.2x Gtex/s : 5.5x Gpix/s&lt;br /&gt;2015   : 14nm : ?????? : 11.5x Gflops :  9.0x GB/s :  8.6x Gtex/s : 7.7x Gpix/s&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(6.) EDIT: Given an estimate that process technology will continue to advance during the lifetime of a console, a vendor could adapt higher power for launch, with the expectation of reducing this later in the product cycle. For example the first 360 had a 203 Watt power supply at launch and is now at 115 Watts (according to &lt;a href="http://en.wikipedia.org/wiki/Xbox_360_hardware"&gt;Wikipedia&lt;/a&gt;). This leaves a big window of possibility for performance.&lt;br /&gt;&lt;br /&gt;Given the window of possible launch dates and power targets it would be hard to know exactly what will end up in next generation consoles, however a 2011 high-end single-GPU card seems like a possible proxy for next generation console, and at least a good start to understanding what could be possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The latest &lt;a href="http://uk.ign.com/articles/2012/01/24/xbox-720-will-be-six-times-as-powerful-as-current-gen"&gt;IGN Rumor&lt;/a&gt; is 100% fail, as they say the next Xbox is a HD6670 with 6x the perf of 360. The HD6670 at 40nm is clearly not 6x the performance, and even a 28nm die shrink of HD6670 will likely not be 6x the performance Xbox360.&lt;br /&gt;&lt;pre&gt;Xbox360 =  240 Gflops : 22.4 GB/s :    8 Gtex/s :    4 Gpix/s&lt;br /&gt;HD6670  =  768 Gflops : 64   GB/s : 19.2 Gtex/s :  6.4 Gpix/s&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;roughly   3.2x Gflops : 2.8x GB/s : 2.4x Gtex/s : 1.6x Gpix/s&lt;/pre&gt;&lt;br /&gt;However assuming the 6x number is correct then HD6870 or HD6850 is a possible development proxy,&lt;br /&gt;&lt;pre&gt;Xbox360    =  240 Gflops : 22.4 GB/s :    8 Gtex/s :    4 Gpix/s&lt;br /&gt;Xbox360 x6 = 1440 Gflops :  134 GB/s :   48 Gtex/s :   24 Gpix/s&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;HD6850     = 1488 Gflops :  128 GB/s :   37 Gtex/s :   24 Gpix/s&lt;br /&gt;HD6870     = 2016 Gflops :  134 GB/s :   50 Gtex/s :   28 Gpix/s&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-795358713552123294?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/795358713552123294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/to-extremes-and-back-to-reality.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/795358713552123294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/795358713552123294'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/to-extremes-and-back-to-reality.html' title='To Extremes and Back To Reality'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2447882853776947568</id><published>2012-01-10T21:48:00.000-08:00</published><updated>2012-01-10T22:35:45.363-08:00</updated><title type='text'>Single Pass SRAA</title><content type='html'>Here is a better description of a possible single geometry pass SRAA. I'm using OpenGL in this example because that is what I work in most often,&lt;br /&gt;&lt;br /&gt;Use "layout(early_fragment_tests)". Described in &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_shader_image_load_store.txt"&gt;GL_EXT_shader_image_load_store&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"When early per-fragment operations are enabled, the depth bounds test, stencil test, depth buffer test, and occlusion query sample counting operations are performed prior to fragment shader execution, and the stencil buffer, depth buffer, and occlusion query sample counts will be updated accordingly.  When early per-fragment operations are enabled, these operations will not be performed again after fragment shader execution."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The render pass will be writing Z as standard and writing out the lower 8-bits of &lt;a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_PrimitiveID.xml"&gt;gl_PrimitiveID&lt;/a&gt; into an MSAA render target.&lt;br /&gt;&lt;br /&gt;The render pass will fetch the coverage mask, &lt;a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_SampleMaskIn.xml"&gt;gl_SampleMaskIn[]&lt;/a&gt;, and check if the shaded fragment covers the sample associated with the non-MSAA g-buffer. If the sample is not covered, the shader exits here.&lt;br /&gt;&lt;br /&gt;I do not remember off-hand if the gl_SampleMaskIn[] has pre or post-z test coverage when "early_fragment_tests" is enabled (this is not strictly defined in the GL specs). If coverage is post-z test, then all is good, if it is pre-z test, then there is the possibility that the fragment shader will be executed even if the associated "non-MSAA sample" is occluded. But at least in this state one of the samples in the pixel is non-occluded. Can attempt to correct for this case later by storing the associated lower 8-bits of the gl_PrimitiveID in the g-buffer also.&lt;br /&gt;&lt;br /&gt;If the fragment shader does not early exit, then the fragment shader writes G-buffer output using image stores to a set of non-MSAA images (not using ROP).&lt;br /&gt;&lt;br /&gt;In theory there is a possible ordering problem here, in that there is no ordering on image stores, but in practice this I'm guessing this isn't a problem on current hardware. Would have to test this to be sure. If it is a problem there are multiple work arounds....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2447882853776947568?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2447882853776947568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/single-pass-sraa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2447882853776947568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2447882853776947568'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/single-pass-sraa.html' title='Single Pass SRAA'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2411064263120201287</id><published>2012-01-09T22:05:00.000-08:00</published><updated>2012-01-10T00:22:16.139-08:00</updated><title type='text'>SBAA Paper, SRAA, and Texture-Aligned Deferred Shading (TADS)</title><content type='html'>I'm going to describe a new deferred shading technique, Texture Aligned Deferred Shading (TADS) below, but first some notes on the &lt;a href="http://vidimce.org/publications/sbaa/sbaa_i3d2012.pdf"&gt;SBAA Paper by Marco Salvi and Kiril Vidimce&lt;/a&gt; and SRAA,&lt;br /&gt;&lt;br /&gt;(1.) SBAA has two rendering passes. The paper describes the first drawing pass as similar to a z pre-pass, but leaves out some important details. Z pre-pass can on many GPUs be rendered at 2x the fill rate, and often Z pre-pass can be lower poly conservative proxy geometry, etc. SBAA requires full geometry for both passes. Two full geometry passes is likely a bad idea for tessellated geometry (or really high polygon non-tessellated geometry) and bad for the number of required draw calls. A single pass solution is highly desired. &lt;br /&gt;&lt;br /&gt;(2.) SBAA uses the same primitiveID trick mentioned in the NVIDIA SIGGRAPH presentation on &lt;a href="http://research.nvidia.com/publication/subpixel-reconstruction-antialiasing"&gt;SRAA&lt;/a&gt;. Matthaus and I came up with the primitiveID option for SRAA as an optimization, but didn't have time to fully explore the best solution when mixed with tessellation as primitiveID is per patch instead of per triangle. When used with vector displacement, likely one would want to create a modified hash value in the domain shader for each triangle based on primitiveID and some parametric coordinates. &lt;br /&gt;&lt;br /&gt;Side note on SRAA, should be able to do Matthaus's SRAA in one pass with DX11 and surface writes. In the MSAA pass which generates primitiveID (or something better for tessellation) also write the G-buffer, except early exit in the pixel shader when the coverage for the pixel doesn't intersect the "center sample" used for SRAA. For pixels which intersect the center sample, write out the G-buffer using surface writes.&lt;br /&gt;&lt;br /&gt;(3.) SBAA has the same problem MSAA has, screen-aligned shading, or pre-shading filtering, is the wrong way to shade for moving pictures.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Texture Aligned Deferred Shading (TADS)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I'm describing this here, because right now I don't have time to actually try this...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ideally for visual quality per number of shaded samples, shading would be aligned to the texels used to texture shaded surfaces. Filtering, to re-sample shading results to the screen grid, would ideally happen after shading for temporal stability. TADS is a method to do exactly this.&lt;br /&gt;&lt;br /&gt;TADS requires "software" virtual texturing (like mega-texture), or some other method where all surface texture data can be index from one position in a set of textures (or texture layers) referred to as the "physical texture" below. This position will be referred to as "physical position" below. For a 8K by 8K sized set of textures, a 32-bit physical position provides only 3-bits of sub-pixel precision (which might not be enough, so might need to use more bits).&lt;br /&gt;&lt;br /&gt;TADS pipeline works as follows,&lt;br /&gt;&lt;br /&gt;(1.) Only one rendering pass, a modified G-buffer generation pass. Write out {normal, binormal, and physical position}. &lt;br /&gt;&lt;br /&gt;(2.) Find unique samples pass. This is a full screen pass which reads the G-buffer's physical position, and computes the number of texture aligned samples which need to be shaded, and writes this information to Z. The number of unique samples to be shaded is packed in the high bits, and a 4-bit bitmask of the samples to shade in the 2x2 texel footprint in the physical texture is packed in the low bits. Each physical position can require between one to four shaded texels, and in most cases neighboring pixels have physical positions which share parts of the shaded texel footprint. To insure samples are not shaded multiple times, each pixel fetches the physical position of the North, North West, and West pixels. Then removes any texels shared by those 3 neighbors from this pixels list of samples to shade.&lt;br /&gt;&lt;br /&gt;(3.) Deferred shading passes. Each pixel has a variable number of samples to shade (much like mixing MSAA and deferred shading). To optimize for this case, use depth bounds test to take the Z value generated in (2.) and split the shading up into 4 passes. First pass for pixels which have one sample, second pass for pixels which have two samples, etc. Shaders for each of the 4 passes are optimized to shade {1,2,3,4} samples at the same time respectively. This pass shades texels in physical texture, and uses surface stores to write the results into a "shade results physical texture". AMD hardware doesn't support depth bounds test, so use an alternative method.&lt;br /&gt;&lt;br /&gt;(4.) Filtering pass. Each pixel fetches the physical position from the G-buffer, and samples the filtered results from the "shade results physical texture".&lt;br /&gt;&lt;br /&gt;Adding in LOD and anisotropy to improve filtering,&lt;br /&gt;&lt;br /&gt;(5.) Modify the G-buffer generation pass (1.) and write out gradient vector to provide a line to filter along, and the thickness of this line (LOD or simulation of mip-mapping).&lt;br /&gt;&lt;br /&gt;(6.) Modify the shading passes (3.) to output the lower bits of a frame counter into the alpha channel.&lt;br /&gt;&lt;br /&gt;(7.) Modify the filtering pass (4.) to fetch the gradient vector and thickness from the G-buffer, and manually sample the anisotropic footprint (simplify to a few samples along the vector) and for LOD a few samples to do a low-pass filter. Compare the filtered alpha value of texture fetches to the frame counter. As the alpha value starts to deviate from the frame counter value, reduce the weight of the associated texture fetch when blending for the final filtered value. The deviation signifies that the filtered result is fetching from a texel which was last shaded in prior frames (temporally stale).&lt;br /&gt;&lt;br /&gt;Reducing the shading rate,&lt;br /&gt;&lt;br /&gt;(8.) One can reduce the frequency of shading by modifying the "find unique sample" pass (2.) and just marking texels as shaded. The engine will automatically use the prior shaded value for the texel. It is better to mark tiles of texels as shaded instead of random texels. There are a lot of possibilities here, which I will leave for a future post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2411064263120201287?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2411064263120201287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/sbaa-paper-sraa-and-texture-aligned.html#comment-form' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2411064263120201287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2411064263120201287'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/sbaa-paper-sraa-and-texture-aligned.html' title='SBAA Paper, SRAA, and Texture-Aligned Deferred Shading (TADS)'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6357307128409147978</id><published>2012-01-07T08:52:00.000-08:00</published><updated>2012-01-07T15:34:04.132-08:00</updated><title type='text'>Games vs Film Part 2</title><content type='html'>Working from the &lt;a href="http://www.renderman.org/RMR/st/PRMan_Filtering/Filtering_In_PRMan.html"&gt;Filtering In PRMan&lt;/a&gt; that Brian Karis posted in the comments of the last post, recommendations for film rendering lower bounds,&lt;br /&gt;&lt;br /&gt;&lt;b&gt;0.25 Shading Rate&lt;/b&gt;: Or on average 4 object space shaded samples per pixel. Seems like this 2x2 super-sample sample rate intuitively makes sense as providing the resolution to transition between 2 texture resolution levels without something similar to mip-mapping. One can see on the first or left shot that lower shading rates start to miss samples on the diagonal,&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.renderman.org/RMR/st/PRMan_Filtering/diner_mitchell_sr1.0.png"&gt;&lt;img src="http://www.renderman.org/RMR/st/PRMan_Filtering/diner_mitchell_sr0.5.png"&gt;&lt;img src="http://www.renderman.org/RMR/st/PRMan_Filtering/diner_mitchell_sr0.25.png"&gt;&lt;br /&gt;&lt;br /&gt;The 4xSS looks great, and the 2xSS (0.5 shading rate) already looks quite good. Would be interesting to see what the minimum bound on shading rate would be if using mipmap filtering on texture space shading results. Could 2.333xSS (2xSS with mipmaping) be good enough for games? Also might be able to do pure 2xSS with some manual filtering to simulate the mip transition.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8 Pixel Samples&lt;/b&gt;: This translates to 8x8 super-sampling on visibility. Without stochastic sampling, this would provide exactly 8 different shades as an edge transitions between exact pixel centers if a poor pixel sized box filter was used during filtering. Or alternatively one could think of this as only 3-bit precision on sub-texel position on GPU filtering (without any magnification). Which in the context of texture space shading would suggest an upper bound of a 8192x8192 source texture with a 32-bit position (13-bits for texel, 3-bits for sub-texel position). Magnification cases clearly would either require more bits of sub-texel position, or trade bits for noise and use stochastic sampling. For comparison with typical GPU real-time rendering, 4xMSAA provides 4 shades as an edge transitions between exact pixel centers, but poor quality on some diagonals.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Smooth Shading Interpolation&lt;/b&gt;: GPU MSAA with the standard resolve filter would represent non-smooth shading, as samples on a triangle edge all have the same value. With PRMan those visibility samples can be a "filtered after shading" sample.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mitchell 4.0 Pixel Filter&lt;/b&gt;: The &lt;a href="http://www.imagemagick.org/Usage/resize/"&gt;Image Magick docs&lt;/a&gt; has some great comparisons (look at the bottom of that page) which show the difference in quality from various filters for down-sampling (copied the images below). Mitchell provides a negative lobe which increases sharpness without having extra lobes like a full sync filter which would add ringing. A cubic filter in contrast has no negative lobes and thus looses some sharpness.&lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.imagemagick.org/Usage/resize/montage_shrink.png"&gt;&lt;br /&gt;&lt;img src="http://www.imagemagick.org/Usage/resize/montage_smaller.png"&gt;&lt;br /&gt;&lt;br /&gt;The 4.0 in "Mitchell 4.0" means that the filter kernel width is +/-2 output pixels in size. With 8x8 pixel samples this kernel is 32x32 samples in size. Mitchell 4.0's center positive lobe is around 2 pixels in size. Again this is completely intuitive in that pixel size details will show aliasing in sub-pixel motion. This large filter kernel is a core component of why CG has no aliasing (and looks less sharp) compared to games.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6357307128409147978?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6357307128409147978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/games-vs-film-part-2.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6357307128409147978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6357307128409147978'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/games-vs-film-part-2.html' title='Games vs Film Part 2'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7270590622866589988</id><published>2012-01-01T15:22:00.000-08:00</published><updated>2012-01-01T15:59:14.352-08:00</updated><title type='text'>Crazy Thought for Reducing Shader Aliasing</title><content type='html'>&lt;i&gt;Just a thought, not sure if this concept or a variation of this concept would work in practice, but seems possible...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In line with the prior post, this is maybe applicable if one was rendering and shading say at a higher frequency than could be observed in the final resolved image. The idea is to attempt to fix some of the problems with standard screen aligned deferred shading by using texture aligned shading (or effectively object space shading). &lt;br /&gt;&lt;br /&gt;In the G-buffer creation pass, one would sample textures using point filtering with nearest (biased towards sharper) mipmap, but also write out a screen projected offset of where the actual filtered texel center for the sample would be on the screen under the assumption that all screen neighbors are also point filtered. Likely also have to store out the projected texel radius to aid in correct filtering.&lt;br /&gt;&lt;br /&gt;Shading would be computed as standard with deferred shading. After shading there would be a reconstruction pass which would use the current and prior frame's shaded samples and above mentioned offsets to re-construct the proper filtered sample.&lt;br /&gt;&lt;br /&gt;One could extend this technique by storing a screen projected edge gradient for each sample during g-buffer creation pass, so that the reconstruction kernel would have an even better idea of texture gradient. This would be of great benefit for things like hair or thin objects for example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7270590622866589988?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7270590622866589988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/crazy-thought-for-reducing-shader.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7270590622866589988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7270590622866589988'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/crazy-thought-for-reducing-shader.html' title='Crazy Thought for Reducing Shader Aliasing'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-49956814139129933</id><published>2012-01-01T01:10:00.000-08:00</published><updated>2012-01-01T11:34:37.678-08:00</updated><title type='text'>Games vs Film</title><content type='html'>2012 through 2014 could be a very interesting time for real-time graphics if game developers realize that even at native 1920x1080 without MSAA they are already effectively super-sampling when compared to movies. In case this is not obvious, go and look at some direct screen grabs from BluRays. For example, here is a crop then the full direct 1080p screen grab from Ironman (click images in this post for full size),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-dU_6Q9S4x3I/TwAlI7_uCmI/AAAAAAAAAjY/cAyrPF6dchg/w0/ironman-crop.png"&gt;&lt;br /&gt;&lt;br /&gt;Won't find any pixel width detail in a film, and anything anywhere near a pixel in width looses contrast. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://media.cinemasquid.com/blu-ray/titles/iron-man/841/screenshot-lrg-30.png"&gt;&lt;img src="http://media.cinemasquid.com/blu-ray/titles/iron-man/841/screenshot-lrg-30.png" width="480" height="270"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Where are the forum flame fests about how the director "added blur" by not getting the in-focus circle of confusion smaller than a pixel or where the textures used in the Ironman CG shots lack detail?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://media.cinemasquid.com/blu-ray/titles/iron-man/841/screenshot-lrg-16.png"&gt;&lt;img src="http://media.cinemasquid.com/blu-ray/titles/iron-man/841/screenshot-lrg-16.png" width="480" height="270"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Compare to a possibly doctored "perfect" driver SSAA override screen grab from Skyrim posted on Neogaf (again click images for full size), &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.abload.de/img/tesv2011-12-3121-33-4984uw.jpg"&gt;&lt;img src="http://www.abload.de/img/tesv2011-12-3121-33-4984uw.jpg" width="480" height="270"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The industry status quo is to push ultra high display resolution, ultra high texture resolution, and ultra sharpness. &lt;br /&gt;&lt;br /&gt;IMO a more interesting next-generation metric is can an engine on a ultra-highend PC rendering at 720p look as real as a DVD quality movie? Note, high end PC at 720p can have upwards of a few 1000's of texture fetches and upwards of 100,000 flops per pixel per frame at 720p at 30Hz.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT,&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Another interesting comparison which provides a numerical answer, is to down-sample with un-filtered decimation shots from BR movies, and see at what point edge gradients start to match high quality MSAA or CSAA shots from games. For instance with the same Ironman shot, one can use nearest neighbor down-sample at 33% of the original size and get something which has visually similar edge gradients to high quality AA on games,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-0GEP_X3HZ_A/TwCtxYgdoQI/AAAAAAAAAjg/1Lbd6OUsdYI/w0/ironman1at33crop.png"&gt;&lt;br /&gt;&lt;br /&gt;And the full size un-filtered down-sample, &lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-Ps2c0zFSQZo/TwCtzYwHAyI/AAAAAAAAAjo/RtP4wuxWwUQ/w0/ironman1at33.png"&gt;&lt;br /&gt;&lt;br /&gt;In practice, it seems as if somewhere between a 50% and 33% nearest neighbor down-sample would be typically required to make BR movies have the sharpness of the high quality AA found in games. Intuitively this makes sense as "50%" is the natural lower bound: detail under 2 pixels in width will have aliasing under motion. Inversely, it seems as if 1080p BR movies typically have somewhere between only 350p and 540p of effective "game resolution". Or alternatively in game AA terms, BR movies get an extra 2x2 or 3x3 OGSSAA but instead of getting resolved to the 350p to 540p resolution, they get a DOF "blur" applied at 1080p...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-49956814139129933?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/49956814139129933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2012/01/games-vs-film.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/49956814139129933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/49956814139129933'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2012/01/games-vs-film.html' title='Games vs Film'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8649316369848588165</id><published>2011-12-25T01:31:00.000-08:00</published><updated>2011-12-25T02:17:27.716-08:00</updated><title type='text'>FXAA 4.0 with 1.78x SSAA</title><content type='html'>Below is an example of 2xMSAA (so no AA on foliage and HDR/LDR edges) with 1.78x SSAA and prototype FXAA 4.0 spatial-only algorithm doing the down-sample with sharpness turned off to simulate the larger filter typical of CG film. Temporal FXAA 4.0 without 2xMSAA but with 1.78x SS would look a little better than this, as each output pixel gets roughly 3.56 shaded samples.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-hgjEDFoSB5M/TvbsOlBpbLI/AAAAAAAAAi8/Io3Muvdgpc8/w0/ss0.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8649316369848588165?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8649316369848588165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-with-178x-ssaa.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8649316369848588165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8649316369848588165'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-with-178x-ssaa.html' title='FXAA 4.0 with 1.78x SSAA'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3306448785071411322</id><published>2011-12-22T10:16:00.000-08:00</published><updated>2011-12-22T12:01:43.898-08:00</updated><title type='text'>8xMSAA roughly same cost as 2xSSAA</title><content type='html'>&lt;i&gt;Was looking at some random internet sources comparing various AA modes on a few games and apparently 8xMSAA is around the same cost as 2xSSAA. Both trade the lead spot depending on GPU and title. A very rough ballpark being both run maybe 65-85% slower than NO-AA.&lt;br /&gt;&lt;br /&gt;Seems like for games with modern AA solutions, 8xMSAA is not really an important option. For instance 4xMSAA + FXAA 4.0 should easily be much faster and higher quality than 8xMSAA. Or FXAA 4.0 2xSSAA should be similar cost with much better shading quality. Or FXAA 4.0 2xSSAA+2xTSSAA (temporal SS) should be similar cost with much better quality everywhere. Or 4xMSAA + FXAA 4.0 2xTSSAA which will be faster and much higher quality. With all the non-8xMSAA cases taking up less memory too.&lt;br /&gt;&lt;br /&gt;Looking forward even 4xMSAA and 2xMSAA are likely to get marginalized in the step towards CG quality as they have some serious problems. For instance it is impossible to do a high quality post process DOF or motion blur after MSAA resolve as pixels end up with samples merged from various depths and post needs to be done pre tone-mapping while resolve needs to be post tone-mapping. In the race for CG quality, my bet is on 2xTSSAA with scaling in quality via fractional and non-fractional SSAA.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3306448785071411322?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3306448785071411322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/8xmsaa-roughly-same-cost-as-2xssaa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3306448785071411322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3306448785071411322'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/8xmsaa-roughly-same-cost-as-2xssaa.html' title='8xMSAA roughly same cost as 2xSSAA'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4371603831521697417</id><published>2011-12-22T01:49:00.000-08:00</published><updated>2011-12-22T10:13:15.105-08:00</updated><title type='text'>FXAA 4.0 Development Update (Stills)</title><content type='html'>&lt;i&gt;Similar to prior posts, this post talks about R&amp;D on FXAA 4.0: algorithm is subject to change before release, and all shots are work in progress...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Spatial-Only Algorithm&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Most of the heavy R&amp;D is over and the result is a new spatial-only algorithm for FXAA 4.0. Note, the only reason this algorithm exists is because it is also the base for the temporal algorithm. The spatial-only algorithm lives somewhere around FXAA 3.11 PC at a medium quality setting, but at the perf a little above FXAA 3.11 Console. Have not profiled yet, so do not actually know.&lt;br /&gt;&lt;br /&gt;The aim here is performance for huge resolution rendering or super-sampling. The spatial-only FXAA can also resize just like the temporal version (but lower quality), and it will also support in-line super-sample down-sampling, taking 2 or more FXAA filtered results per output pixel to support ultra high quality in one pass. Super-sample stills will need to wait until another post.&lt;br /&gt;&lt;br /&gt;However, !/$ the spatial+temporal solution is the way to go, easily 4x higher quality for nearly same cost. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spatial-Only Algorithm Enlarge + Sharpen&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Similar to the interjection mods, added a built-in classic "halo-ing" sharpen into FXAA 4.0. Below is an example enlarging and sharpening (set at a very subtle 50%) with the spatial-only algorithm. The sharpening can amplify edge noise, &lt;u&gt;EDIT: edge noise and poor quality in the shot below is a result of me using the settings for native resolution instead of the correct settings for enlarging (oops it was 4 am),&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-xV17gb5Xr2w/TvML-0Clr6I/AAAAAAAAAhc/oZafr1htaxw/w0/fx4c.png"&gt;&lt;br /&gt;&lt;br /&gt;Another example this time with a really fail case for bilinear resize, and sharpness turned up,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-0DBhUbN99fw/TvMWl6LqCPI/AAAAAAAAAiY/cF26nTBPzVQ/w0/fx4f.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spatial-Only Algorithm Sharpen Without Resize&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;With the early exit off and edge detection off, setting sharpening to 100% will maintain detail even when the algorithm filters highly detailed textures,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-0K3nMK0HxHA/TvMProgUTzI/AAAAAAAAAhw/6-CLzmgCURU/w0/fx4d.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spatial-Only Algorithm Sharpen Over MSAA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The algorithm plays nice over MSAA even when sharpening is set to 100%,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-UvlABJlo6Eo/TvMSqm-SduI/AAAAAAAAAiE/ZnAZTDxadaI/w0/fx4e.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AA at Different Scales&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As a side effect of the algorithm functioning when non-pixel aligned, apparently the algorithm can sometimes anti-alias in blurred content. For instance, the left below is the source shot, where the red arrow marks aliasing caused by bilinear upsample of downsampled DOF. The right is the FXAA 4.0 spatial-only algorithm with the early exit removed and sharpening turned off (note the notches got removed),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-YHEXOQi3hiE/TvL_AYMiOGI/AAAAAAAAAg8/2nowaF4PaOo/w0/fx4a.png"&gt;&lt;br /&gt;&lt;br /&gt;Here is another example, &lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-pVbw7nfU84Y/TvMEqTWUTZI/AAAAAAAAAhI/acIKL-tKWi0/w0/fx4b.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4371603831521697417?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4371603831521697417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-development-update-stills.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4371603831521697417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4371603831521697417'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-development-update-stills.html' title='FXAA 4.0 Development Update (Stills)'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1593015713806577886</id><published>2011-12-21T17:07:00.000-08:00</published><updated>2011-12-21T17:13:19.121-08:00</updated><title type='text'>GDC 2012: Rendering Technology of Prey 2</title><content type='html'>Brian Karis of Human Head Studios will be covering &lt;a href="http://schedule.gdconf.com/session/6704/Rendering_Technology_of_Prey_2"&gt;Rendering Technology of Prey 2 at GDC 2012&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"This session presents the major graphical challenges and innovations behind the Prey 2 renderer. I will describe novel additions and optimizations to existing algorithms and the gritty details needed to implement them gained from production experience. I will also cover new approaches used to better approximate offline CG quality. Topics will include occlusion culling, virtual texturing, physically-based rendering, deferred shading, global illumination, screen space approximations, and post processing. Finally I will give a detailed look at the architecture of the renderer and how these many complex systems fit together to build the final rendered image."&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1593015713806577886?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1593015713806577886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/gdc-2012-rendering-technology-of-prey-2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1593015713806577886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1593015713806577886'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/gdc-2012-rendering-technology-of-prey-2.html' title='GDC 2012: Rendering Technology of Prey 2'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2289098723805506954</id><published>2011-12-12T02:49:00.000-08:00</published><updated>2011-12-12T10:02:29.052-08:00</updated><title type='text'>FXAA 4.0 Will Have New Spatial-Only Algorithm</title><content type='html'>FXAA 4.0 is still a work in progress. No stills this time, and much of the prior shots would have changed by now. Updates as of this weekend,&lt;br /&gt;&lt;br /&gt;(1.) FXAA 4.0 will have a new spatial only algorithm for those who cannot integrate with the temporal filtering. There will be multiple quality/perf levels. The spatial algorithm is part of the temporal algorithm. It contains no searching, supports dynamic output resolution, and works really well mixed with hardware filtering (like MSAA).&lt;br /&gt;&lt;br /&gt;(2.) I've come up with a new aliasing detection filter, one that completely eliminates filtering from areas that have no aliasing. As prior this only depends on color input, uses same texture fetches as prior, but now it can be set to filter edges only, and avoid texture detail. This will be on sliders for developers to hand tune. Bottom line, no more loss of detail, as was a common complaint with FXAA 3.11, and no need for a depth based edge detection pass.&lt;br /&gt;&lt;br /&gt;(3.) I'm very close to managing to extend both the quality and edge length of the 9-fetch spatial algorithm (same number of texture fetches as FXAA 3.11 Console) to almost match the default medium FXAA 3.11 PC results. Managed this via some very smart limiting of the filter results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2289098723805506954?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2289098723805506954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-will-have-new-spatial-only.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2289098723805506954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2289098723805506954'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-will-have-new-spatial-only.html' title='FXAA 4.0 Will Have New Spatial-Only Algorithm'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5788068800543750219</id><published>2011-12-09T17:52:00.000-08:00</published><updated>2011-12-09T17:57:05.917-08:00</updated><title type='text'>Kotaku: What is FXAA</title><content type='html'>My favorite gaming news site, Kotaku, just posted this &lt;a href="http://kotaku.com/5866780/what-is-fxaa"&gt;post on FXAA&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5788068800543750219?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5788068800543750219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/kotaku-what-is-fxaa.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5788068800543750219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5788068800543750219'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/kotaku-what-is-fxaa.html' title='Kotaku: What is FXAA'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3963952353222073318</id><published>2011-12-09T11:37:00.001-08:00</published><updated>2011-12-09T11:40:01.549-08:00</updated><title type='text'>Keloid Trailer - Short Film by BLR</title><content type='html'>&lt;iframe src="http://player.vimeo.com/video/33030265?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="300" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/33030265"&gt;Keloid Trailer - A Short Film by BLR&lt;/a&gt; from &lt;a href="http://vimeo.com/biglazyrobot"&gt;BLR_VFX&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3963952353222073318?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3963952353222073318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/keloid-trailer-short-film-by-blr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3963952353222073318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3963952353222073318'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/keloid-trailer-short-film-by-blr.html' title='Keloid Trailer - Short Film by BLR'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4336765564749316376</id><published>2011-12-06T18:57:00.000-08:00</published><updated>2011-12-06T20:43:47.951-08:00</updated><title type='text'>FXAA 4.0 Stills and Features Part 2</title><content type='html'>&lt;i&gt;All prior posts showed FXAA 4.0 with the sharpening knob turned off.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sharpening&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA 4.0 has as a sharpness slider. FXAA 4.0 applies a special kind of sharping which can be applied in a single pass in conjunction with super-resolution. Here is a bilinear 2x2 up-sample,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-FpFho6T97uw/Tt7V7H4vA_I/AAAAAAAAAeY/HvnM5OxMwsc/s0/webrage3.png"&gt;&lt;br /&gt;&lt;br /&gt;Now FXAA 4.0 Super-Resolution set to sharp, note the sharpening is different than an un-sharp mask. So extra sharpening with a classic linear filter can be applied over this if desired.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-5gHWgUNVVUE/Tt7fLfV3JAI/AAAAAAAAAe4/Hp3sBXk3W6I/s0/webrage4.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sharpening - Without MSAA Input&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sharpening without MSAA input reduces the AA quality slightly. Here is bilinear 2x,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-Nq3OLPZg2GQ/Tt7lXQ_gwuI/AAAAAAAAAfU/G0Tly_VS0Yc/s0/webskyrim1.png"&gt;&lt;br /&gt;&lt;br /&gt;Here is what this would look like at native resolution,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/--2VdKleq3jo/Tt7ryybYsOI/AAAAAAAAAgU/m6a1tY2vOic/s0/webskyrim1n.png"&gt;&lt;br /&gt;&lt;br /&gt;And FXAA 4.0 2x super-resolution with sharpening, note in this case the render only renders 25% of the pixels/frame as the image above. The sharpness of this image is limited by FXAA 4.0 only one sample from the current frame and one sample from the prior frame per a 2x2 group of output pixels, and needing to do AA also,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-NNtaRdCukG8/Tt7lXTaIBNI/AAAAAAAAAfY/rIx9pijSg0o/s0/webskyrim2.png"&gt;&lt;br /&gt;&lt;br /&gt;Another example, here is a native no-AA without resizing,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-nQssuWNEcIs/Tt7pALZPtYI/AAAAAAAAAf0/Y6-BKkUlZsI/s0/webtrine1.png"&gt;&lt;br /&gt;&lt;br /&gt;And the same with FXAA 4.0 at the sharpest setting,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-fcvHKeFq4us/Tt7pAH0dopI/AAAAAAAAAf4/Datf8-KihYY/s0/webtrine2.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4336765564749316376?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4336765564749316376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-stills-and-features-part-2.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4336765564749316376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4336765564749316376'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-stills-and-features-part-2.html' title='FXAA 4.0 Stills and Features Part 2'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-FpFho6T97uw/Tt7V7H4vA_I/AAAAAAAAAeY/HvnM5OxMwsc/s72-c/webrage3.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6735095053573459788</id><published>2011-12-06T00:42:00.001-08:00</published><updated>2011-12-06T07:04:21.998-08:00</updated><title type='text'>FXAA 4.0 Stills and Features</title><content type='html'>&lt;i&gt;Source images ripped from the PC high resolution screen shots thread on &lt;a href="http://www.neogaf.com"&gt;neogaf&lt;/a&gt;. FXAA 4.0 is in prototyping now, so all output subject to change as development progresses. All FXAA 4.0 processed frames generated with the actual FXAA 4.0 shader which takes just 9 texture samples per output pixel. As FXAA is a temporal algorithm, all input shots were decimated by 2x without filtering as the best option to simulate expected FXAA input, taking the upper left sample of the 2x2 pixel quad as the previous frame, and the lower right sample of the 2x2 pixel quad as the current frame.&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA Goals&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA 4.0 is a combination of a demosaicing/deinterleaving, super-resolution, and anti-aliasing algorithm all in one tiny full screen pass. The goals of FXAA 4.0 are,&lt;br /&gt;&lt;br /&gt;(1.) Aid in the support of film quality visuals for games.&lt;br /&gt;(2.) Ultra high quality/cost anti-aliasing.&lt;br /&gt;(3.) Decouple rendering resolution from display resolution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hyper-Sharpness&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Using the term "hyper-sharpness" to describe the quality of typical GPU renderings where the image is usually box filtered and contains high frequency features which can only be reproduced when the features are perfectly aligned to the pixel grid. Hyper-sharpness is exactly why our font rendering algorithms snap features to pixel centers. Typical hyper-sharpness results in temporal aliasing under motion because the features fade in and out as the image moves.&lt;br /&gt;&lt;br /&gt;Below is an example of a shot which was down-sampled using pure decimation without filtering, leaving a hyper-sharp image. The source was a larger perfect anti-aliased screen-shot of Rage,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-xMTf8dioSfU/Tt3fP4g4B4I/AAAAAAAAAaM/nIcBI914QgU/s776/webrage1.png"&gt;&lt;br /&gt;&lt;br /&gt;Regardless as to how sharp this image looks, no film could ever be played in a theater with this amount of temporal aliasing that this would exhibit. Also a game post process cannot sharpen this image using a simple unsharp-mask without amplifying image aliasing. Notice the increase in "stair-step" or breakup of highlights on the railings towards the lower part of the image (don't confuse with the rope at the top of the image),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-R36hA4Jkycs/Tt3fQ8J4OVI/AAAAAAAAAaU/P4CAhslcphQ/s776/webrage1s.png"&gt;&lt;br /&gt;&lt;br /&gt;Here is the source image decimated without filtering, then running through FXAA 4.0 set to remove all possible temporal aliasing and simulate film,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-3nXUGMUxZe4/Tt3fOXOud4I/AAAAAAAAAaE/F6x0BU_lcsY/s794/webrage2.png"&gt;&lt;br /&gt;&lt;br /&gt;Note the image can be sharpened in post without any addition of aliasing,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-0IVP7vUu-10/Tt3fTD5SDSI/AAAAAAAAAac/vTlcYz4hOos/s794/webrage2s.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Super-Resolution&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Taking the base image after decimation without filtering, then up-sampling 2x in width and height with standard bilinear texture filtering, looks as awful as expected,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-Sb1r1Va1xDQ/Tt3pyuwwNSI/AAAAAAAAAbE/DTbLpBVfhdU/s0/webrage1b.png"&gt;&lt;br /&gt;&lt;br /&gt;FXAA 4.0 has ability to re-target at a larger-than-rendered resolution for free during its single full screen pass. Below is a shot of using FXAA 4.0 to up-sample 2x,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-MoI_uJKJgJg/Tt3pzY3j3bI/AAAAAAAAAbM/2W6zugG7nNg/s0/webrage2b.png"&gt;&lt;br /&gt;&lt;br /&gt;Note FXAA 4.0 uses temporal super-sampling, so every other frame renders at a slightly different sub-pixel offset. FXAA 4.0 reconstructs each frame from the current and prior frame, using the extra sample per pixel for a higher quality up-sampling. In the above shot, only one sample per a 2x2 group of pixels gets rendered per frame.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fractional Super-Resolution Works&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here is standard bilinear with 3/2x in width and height,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-wE8riTdF4nE/Tt4LVBpE0wI/AAAAAAAAAdc/ia0IdUcaO44/s0/webwitcher1.png"&gt;&lt;br /&gt;&lt;br /&gt;Here is FXAA 4.0 with 3/2x in width and height,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-ZnESVJf3_ME/Tt4LUR3CpCI/AAAAAAAAAdU/HNdru2DLOKg/s0/webwitcher2.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Super-Resolution Filtering Quality&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here is a new source image, same style of non-filtered decimation. Notice the aliasing on the grate on the bottom,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-BUWs2DFp9L4/Tt31gPMxJMI/AAAAAAAAAbs/c2H45akK104/s0/weblego1.png"&gt;&lt;br /&gt;&lt;br /&gt;Now the source processed by FXAA 4.0, notice how FXAA 4.0 will correctly reconstruct the grate on the bottom,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-SdWwOe2SRcI/Tt31fAg8FKI/AAAAAAAAAbk/QJWtTh5fokw/s0/weblego2.png"&gt;&lt;br /&gt;&lt;br /&gt;The same reconstruction holds up even when FXAA 4.0 is re-targeting to a much larger resolution. For example 3x in width and height,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-_bs7-voTs4w/Tt31guOKZUI/AAAAAAAAAb0/L9b546EoWtU/s0/weblego2bb.png"&gt;&lt;br /&gt;&lt;br /&gt;Not sure why anyone would want 3x enlargement except maybe shadow filtering (which is still on my todo list). Anywhy, at these levels of enlargement, FXAA 4.0 will add some noise which can be seen on the white dots.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Classic Workloads&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA 4.0 still works on classic game style workloads. No AA,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-9cC7iDGXGBE/Tt4iaBy0GJI/AAAAAAAAAeA/e9KzNAV6B2Y/s0/webduke1.png"&gt;&lt;br /&gt;&lt;br /&gt;FXAA 4.0,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-wYP70VRPVL4/Tt4iZX4E1jI/AAAAAAAAAd4/hbw9Gz85k28/s0/webduke2.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6735095053573459788?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6735095053573459788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-stills-and-features.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6735095053573459788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6735095053573459788'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/fxaa-40-stills-and-features.html' title='FXAA 4.0 Stills and Features'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-xMTf8dioSfU/Tt3fP4g4B4I/AAAAAAAAAaM/nIcBI914QgU/s72-c/webrage1.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4695630207413547659</id><published>2011-12-03T02:48:00.000-08:00</published><updated>2011-12-03T16:59:07.148-08:00</updated><title type='text'>Big FXAA Update Soon</title><content type='html'>&lt;i&gt;Have not had the time to seriously work on FXAA since 3.11 was released, but managed to make an incredible amount of progress today getting one of the temporal algorithms closer to release...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's In the Next Release of FXAA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TEMPORAL ALGORITHM &lt;br /&gt;&lt;br /&gt;The new algorithm makes use of 2x temporal super-sampling for much higher base quality with none of the disadvantages of the prior only spatial FXAA 3.11. Render even frames with a quarter-pixel shift to the upper left and odd frames with a quarter-pixel shift to the lower right.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NEW PIPELINE &lt;br /&gt;&lt;br /&gt;But still a single full screen pass. The "Output Frame" and "Feedback Frame" are native resolution, while "Rendered Frame" and "Motion Vectors" can be a different size from native resolution.                &lt;br /&gt;&lt;pre&gt;     Rendered Frame -&gt; o------o -&gt; Output Frame --&gt; HUD -&gt; Swap&lt;br /&gt;     Motion Vectors -&gt; | FXAA |  &lt;br /&gt; o-&gt; Feedback Frame -&gt; o------o -&gt; Feedback Frame &gt;-o&lt;br /&gt; |                                                  |&lt;br /&gt; o--------------------------------------------------o&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;RUN-TIME VARIABLE RESOLUTION RENDERING &lt;br /&gt;&lt;br /&gt;Rendered input frame can be either larger or smaller than native resolution. FXAA automatically does the re-sampling for free. Supports any fractional resolution (does not have to be a multiple of native size). Supporting up to ultra-high-quality 4x OGSSAA all the way down to 1/4x native area. Game can dynamically adapt rendering resolution to maintain desired frame rate.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MIX MSAA + OGSSAA + FXAA 2xTSSAA &lt;br /&gt;&lt;br /&gt;This version of FXAA is designed to work really well with already filtered input. The new algorithm is based on a pure filtering approach, without any "searching" which would constrain the algorithm to a pixel grid or would cause problems when MSAA "hides edges". Use MSAA or CSAA during normal rendering and just pipe that into the new FXAA. FXAA enables free mixing of variable resolution hardware AA like MSAA, OGSSAA (ordered grid super-sampling), and TSSAA (temporal super-sampling). Game can scale to any quality level.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REALLY DAMN FAST&lt;br /&gt;&lt;br /&gt;The current high quality setting uses only 9 texture fetches per pixel. This is the same number of texture fetches taken by FXAA 3.11 Console on PS3. Have not ported the new FXAA to PS3 or 360 yet, but there will be a direct console port!&lt;br /&gt;&lt;br /&gt;Assuming texture bound on PC, a mid-range 560 Ti is likely able to process a 1080p frame in around 0.36 ms. Still modifying the algorithm, so don't have final numbers yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4695630207413547659?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4695630207413547659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/12/big-fxaa-update-soon.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4695630207413547659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4695630207413547659'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/12/big-fxaa-update-soon.html' title='Big FXAA Update Soon'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-201809252158020472</id><published>2011-11-27T16:49:00.000-08:00</published><updated>2011-11-27T21:02:10.711-08:00</updated><title type='text'>Random Demo Tubes</title><content type='html'>&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/rFa9eImH28U" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/K8cygiOJWKk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/U88ylmYoHcM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/27463592?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/25284552?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/mMHrfrqQ42k" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-201809252158020472?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/201809252158020472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/11/random-demo-tubes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/201809252158020472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/201809252158020472'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/11/random-demo-tubes.html' title='Random Demo Tubes'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/rFa9eImH28U/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1205563588955755046</id><published>2011-11-21T13:57:00.000-08:00</published><updated>2011-11-21T13:58:17.390-08:00</updated><title type='text'>Guerrilla Publications Link</title><content type='html'>&lt;a href="http://www.guerrilla-games.com/publications/"&gt;Guerrilla Publications&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1205563588955755046?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1205563588955755046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/11/guerrilla-publications-link.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1205563588955755046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1205563588955755046'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/11/guerrilla-publications-link.html' title='Guerrilla Publications Link'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2955964377240948760</id><published>2011-11-20T17:30:00.000-08:00</published><updated>2011-11-20T17:31:42.938-08:00</updated><title type='text'>Interactive, Multiresolution Image-Space Rendering for Dynamic Area Lighting</title><content type='html'>&lt;a href="http://www.gregnichols.org/pubs/EGSR10_dynamicAreaLights.pdf"&gt;Interactive, Multiresolution Image-Space Rendering for Dynamic Area Lighting&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2955964377240948760?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2955964377240948760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/11/interactive-multiresolution-image-space.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2955964377240948760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2955964377240948760'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/11/interactive-multiresolution-image-space.html' title='Interactive, Multiresolution Image-Space Rendering for Dynamic Area Lighting'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4345700218764953908</id><published>2011-11-20T14:14:00.000-08:00</published><updated>2011-11-20T16:35:42.903-08:00</updated><title type='text'>Understanding WIN32 GetRawInputBuffer()</title><content type='html'>First, Microsoft's UI update of their online WIN32 docs is awesome, and a lot of the online documentation has gotten much better over the years. However the docs for &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms645595(v=vs.85).aspx"&gt;GetRawInputBuffer()&lt;/a&gt; are fail.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;On XP at least (have not tested Vista/Win7/Win8 yet),&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The entire RawInput system is built on-top of WM_INPUT events in the standard Window's message queue. When processing messages, WM_INPUT messages must not be removed in order to use GetRawInputBuffer() as GetRawInputBuffer() will use then remove those events.&lt;br /&gt;&lt;br /&gt;In my usage case I'm doing this to drain out the message queue without disrupting GetRawInputBuffer(), and relying on the fact that for events like WM_ACTIVATEAPP (ALT+TAB), PeekMessage() automatically calls the WinProc() without returning the message to the application directly,&lt;br /&gt;&lt;pre&gt;while(1) {&lt;br /&gt;  if(PeekMessage(&amp;msg, 0, 0, WM_INPUT-1, PM_NOYIELD | PM_REMOVE) == 0) break;&lt;br /&gt;  DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam); }&lt;br /&gt;while(1) {&lt;br /&gt;  if(PeekMessage(&amp;msg, 0, WM_INPUT+1, 0xFFFFFFFF, PM_NOYIELD | PM_REMOVE) == 0) break;&lt;br /&gt;  DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam); }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GetRawInputBuffer()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Docs on GetRawInputBuffer() are more than confusing, and why do they use malloc() in the samples? Here is a less confusing example,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// Some temp global buffer, 1KB is overkill.&lt;br /&gt;static uint64_t rawBuffer[1024/8];&lt;br /&gt;...&lt;br /&gt;// Then in some function,&lt;br /&gt;const uint32_t bytes = sizeof(rawBuffer);&lt;br /&gt;// Loop through reading raw input until no events are left,&lt;br /&gt;while(1) {&lt;br /&gt;  // Fill up buffer,&lt;br /&gt;  int32_t count = GetRawInputBuffer((PRAWINPUT)rawBuffer, &amp;bytes, sizeof(RAWINPUTHEADER));&lt;br /&gt;  if(count &lt;= 0) return;&lt;br /&gt;  ...&lt;br /&gt;  // Process all the events, &lt;br /&gt;  const RAWINPUT* restrict raw = (const RAWINPUT* restrict) rawBuffer;&lt;br /&gt;  while(1) {&lt;br /&gt;    // Process raw event.&lt;br /&gt;    ...&lt;br /&gt;    // Goto next raw event.&lt;br /&gt;    count--;&lt;br /&gt;    if(count &lt;= 0) break;&lt;br /&gt;    raw = NEXTRAWINPUTBLOCK(raw); } }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4345700218764953908?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4345700218764953908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/11/understanding-win32-getrawinputbuffer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4345700218764953908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4345700218764953908'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/11/understanding-win32-getrawinputbuffer.html' title='Understanding WIN32 GetRawInputBuffer()'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4291213685981904280</id><published>2011-11-03T08:33:00.000-07:00</published><updated>2011-11-03T08:56:16.808-07:00</updated><title type='text'>#AltDevBlogADay: Cold code - the last bastion of code optimization?</title><content type='html'>Awesome post by Andy Thomason: &lt;a href="http://altdevblogaday.com/2011/11/03/cold-code-the-last-bastion-of-code-optimization/"&gt;#AltDevBlogADay: Cold code - the last bastion of code optimization?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4291213685981904280?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4291213685981904280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/11/altdevblogaday-cold-code-last-bastion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4291213685981904280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4291213685981904280'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/11/altdevblogaday-cold-code-last-bastion.html' title='#AltDevBlogADay: Cold code - the last bastion of code optimization?'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-849481443712469211</id><published>2011-10-31T11:40:00.000-07:00</published><updated>2011-10-31T11:43:18.014-07:00</updated><title type='text'>Voxatron Debut</title><content type='html'>&lt;a href="http://www.humblebundle.com/"&gt;The Humble Voxatron Debut&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/cyQaS76k59g" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-849481443712469211?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/849481443712469211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/10/voxatron-debut.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/849481443712469211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/849481443712469211'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/10/voxatron-debut.html' title='Voxatron Debut'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/cyQaS76k59g/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6998972937620311168</id><published>2011-10-31T09:44:00.001-07:00</published><updated>2011-10-31T10:11:51.477-07:00</updated><title type='text'>Exclusive CPU Core Access</title><content type='html'>&lt;i&gt;One of the top items on my OS feature wishlist: Exclusive CPU Core Access.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Concept&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Enables a full screen application like a game to have exclusive access to CPU cores. Removes preemption on those cores. One important step towards the path of solving the latency problem on non-console devices.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to Implement&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The OS reuses it's CPU Hot-Plug functionality to migrate threads off the cores, then grants the application exclusive access. When the app is back-grounded or exits, the CPU cores are reclaimed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why Not?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The modern OS deserves a redesign, the concept of sharing a single processor core is outdated as all devices are going to be many-core from now on. Can certainly have both hard real-time and time-sharing in the same OS on the same hardware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6998972937620311168?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6998972937620311168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/10/exclusive-cpu-core-access.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6998972937620311168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6998972937620311168'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/10/exclusive-cpu-core-access.html' title='Exclusive CPU Core Access'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7462913734031808736</id><published>2011-10-28T15:48:00.000-07:00</published><updated>2011-10-28T16:23:17.781-07:00</updated><title type='text'>64-bit ARM</title><content type='html'>&lt;i&gt;64-bit ARM is going to be awesome. Tiny bit of info starting to get public...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.arm.com/files/downloads/ARMv8_Architecture.pdf"&gt;ARMv8 Technology Preview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Few highlights, &lt;br /&gt;&lt;br /&gt;(1.) 31 general purpose 64-bit integer registers.&lt;br /&gt;(2.) 32 128-bit SIMD registers.&lt;br /&gt;(3.) SIMD adds float min/max, and nice rounding control.&lt;br /&gt;(4.) Conditionals now limited (branches, compares, and selects).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7462913734031808736?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7462913734031808736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/10/64-bit-arm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7462913734031808736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7462913734031808736'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/10/64-bit-arm.html' title='64-bit ARM'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8740945659066162461</id><published>2011-10-27T23:32:00.000-07:00</published><updated>2011-10-28T00:57:44.794-07:00</updated><title type='text'>Random AA Thoughts Continued</title><content type='html'>&lt;b&gt;OGSSAA + FXAA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Some users have been figuring out how to mix OGSSAA with FXAA, and the results are really nice. Here is a crop from Alice showing 2x2 OGSSAA with FXAA. See more images on the &lt;a href="http://www.neogaf.com/forum/showthread.php?t=417495&amp;page=174"&gt;Neogaf thread&lt;/a&gt; where this crop was taken from.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-M57JIn-Olz4/TqpPX3s-DJI/AAAAAAAAAZk/roSUoA0ICwI/s496/alice-crop.png"&gt;&lt;br /&gt;&lt;br /&gt;Would be great if games supported this natively as it is trivial to implement. Just allow the user to render the game larger than display resolution, apply FXAA, then down-sample to the display. Would be useful to provide 2x and 4x OGSSAA+FXAA (Nx = N times the screen area), and for the extreme up to 8x OGSSAA+FXAA.&lt;br /&gt; &lt;br /&gt;Great AA really changes the visual quality of a game.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AMD Recommends FXAA on BF3?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This is entertaining,&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ngohq.com/news/20747-amd-recommends-using-nvidias-fxaa-in-battlefield-3-a.html"&gt;AMD Recommends Using NVIDIA's FXAA in BF3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'd use both MSAA and FXAA for BF3, as MSAA helps with sub-pixel details and temporal aliasing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Texture or Object Space Shading&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Super-sampling is a requirement for good AA when doing screen space shading. The more rough and specular a lit surface is, the more samples are required. As the surface moves even with small sub-pixel offsets, shading drastically changes, and for temporal coherence and to reduce temporal aliasing, many samples are required.&lt;br /&gt;&lt;br /&gt;This is less so with texture or object space shading as the shading is done in a spatially coherent way on the surface of an object. &lt;br /&gt;&lt;br /&gt;One of the primary arguments against object space shading is the feeling that it would require more shaded samples for the same quality as screen space shading. For example, likely some occluded surfaces would get shaded. One could envision shading directly into a virtual texture physical page cache (which is larger than the resolution of the screen). &lt;br /&gt;&lt;br /&gt;However I have a feeling that object space shading would actually require fewer shaded samples because,&lt;br /&gt;&lt;br /&gt;(1.) Shading could be done lower than the refresh rate. More distant surfaces don't change shading that fast, why recompute each frame?&lt;br /&gt;&lt;br /&gt;(2.) Object space shading would be ideal in thread occupancy on GPUs, work in a perfect size tile all the time. Only tiles with visible or part visible texels need to be shaded. &lt;br /&gt;&lt;br /&gt;(3.) As the prior post hinted, to remove temporal aliasing requires a low-pass filter which filters out somewhere between 1 to something smaller than 2 pixel sized features (depending on desired sharpness). This reduces the required number of shaded texels.&lt;br /&gt;&lt;br /&gt;(4.) Not all surfaces need a uniform density of shading. For example dull smooth surfaces, or surfaces which need more shading density in one direction. For example, see how Rage as an extreme case has variable texel density.&lt;br /&gt;&lt;br /&gt;There are some other advantages of object space shading,&lt;br /&gt;&lt;br /&gt;(1.) It decouples shading rate from screen resolution. The object space shading cache could be dynamically resized to fit the frame budget.&lt;br /&gt;&lt;br /&gt;(2.) It simplifies AA, as the frame is then forward rendered and could easily use traditional MSAA without the heavy memory burden of deferred rendering.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8740945659066162461?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8740945659066162461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/10/random-aa-thoughts-continued.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8740945659066162461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8740945659066162461'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/10/random-aa-thoughts-continued.html' title='Random AA Thoughts Continued'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-M57JIn-Olz4/TqpPX3s-DJI/AAAAAAAAAZk/roSUoA0ICwI/s72-c/alice-crop.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8310468415080033900</id><published>2011-10-26T20:33:00.000-07:00</published><updated>2011-10-26T23:52:25.055-07:00</updated><title type='text'>Sharpness vs Temporal Aliasing</title><content type='html'>&lt;i&gt;This will come as a shock to most people, but for a given resolution, CG movie quality graphics is not obtainable without a loss of sharpness compared to our current game graphics practices.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Should be Obvious&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is a direct trade off between sharpness and temporal aliasing. This should be clear, if not, here is an example image,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-0wyZ4Pm8f40/TqjadDVNcTI/AAAAAAAAAXw/a8pWU7wO6NA/w766-h383-k/phase.png"&gt;&lt;br /&gt;&lt;br /&gt;The first two lines show the same single pixel on/off pattern, just the second line starts at a half pixel offset. As the pattern moves it horizontally it will flicker between being visible and invisible, a perfect example of temporal aliasing.&lt;br /&gt;&lt;br /&gt;The second two lines show a pattern of a two pixel on/off pattern, with the second line again starting at a half pixel offset. As the pattern moves horizontally the pattern will remain visible. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CG Movie vs Game Graphics, the Double Standard&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"The anti-aliased image does not look as sharp!"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Of course, because if the anti-aliased image does not filter out pixel sized data then some amount of temporal aliasing will remain in a moving picture. &lt;br /&gt;&lt;br /&gt;Temporal aliasing is not acceptable for CG in movies, as viewers would complain that their eyes are bleeding. However for game graphics for anything with side-by-side comparisons, some percentage of people will complain of a lack of sharpness if any anti-aliasing technique removes the temporal aliasing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GPU Hardware AA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For edges and MSAA, a 1 pixel box filter (the default resolve operation) will never filter out all temporal aliasing. The filter needs to be larger than one pixel. Even for single textured un-shaded surfaces with one sample, the default texture filtering can also leave temporal aliasing.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Another Visual Example&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Rage with MSAA and virtual 4x4 OGSSAA (I resized an image grabbed from a &lt;a href="http://www.neogaf.com/forum/showthread.php?p=31602921"&gt;Neogaf thread&lt;/a&gt;). This first image shows no filter before down-sampling via decimation. Limit in terms of sharpness and most aliased.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-lsdPJyeZegE/Tqj6g8HZOcI/AAAAAAAAAY0/Hl8rs1IfacE/s662/rage1.png"&gt;&lt;br /&gt;&lt;br /&gt;This second image uses a smaller than destination pixel size filter before down-sampling. This is sharper than a default MSAA resolve, and would still show extreme temporal aliasing.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-SBKWsvrRWHU/Tqj2zOateGI/AAAAAAAAAYU/dMV8_LhYQ58/s662/rage2.png"&gt;&lt;br /&gt;&lt;br /&gt;This is roughly similar to 4x4 OGSSAA, and this would still display temporal aliasing, and is already less sharp.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-2mhIarsG0-k/Tqj2y89jI6I/AAAAAAAAAYQ/NKBFMVNaQAw/s662/rage4.png"&gt;&lt;br /&gt;&lt;br /&gt;Same image but with a large enough filter to remove temporal aliasing,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-vqQbE5c-wuk/Tqj2xpPi9_I/AAAAAAAAAYI/UYQq_OQi8TM/s662/rage8.png"&gt;&lt;br /&gt;&lt;br /&gt;The same as above but sharpened with a pixel sized unsharpmask set at 50%,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-gZ6IXofMCUI/Tqj-uhEpdRI/AAAAAAAAAZI/pKrECGSWFVI/s662/rageU.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8310468415080033900?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8310468415080033900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/10/sharpness-vs-temporal-aliasing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8310468415080033900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8310468415080033900'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/10/sharpness-vs-temporal-aliasing.html' title='Sharpness vs Temporal Aliasing'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-lsdPJyeZegE/Tqj6g8HZOcI/AAAAAAAAAY0/Hl8rs1IfacE/s72-c/rage1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1568036367786046792</id><published>2011-09-29T09:03:00.000-07:00</published><updated>2011-09-29T09:04:05.402-07:00</updated><title type='text'>Rage Jackal Canyon Tube</title><content type='html'>&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/jSNtIeLxcMg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1568036367786046792?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1568036367786046792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/09/rage-jackal-canyon-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1568036367786046792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1568036367786046792'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/09/rage-jackal-canyon-tube.html' title='Rage Jackal Canyon Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/jSNtIeLxcMg/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3270293835544258135</id><published>2011-09-07T23:49:00.000-07:00</published><updated>2011-09-07T23:55:00.273-07:00</updated><title type='text'>Akiko by Flopi 4K Tube</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/mxZx5RlQsc4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3270293835544258135?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3270293835544258135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/09/akiko-by-flopi-4k-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3270293835544258135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3270293835544258135'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/09/akiko-by-flopi-4k-tube.html' title='Akiko by Flopi 4K Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/mxZx5RlQsc4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7610984018314751125</id><published>2011-09-07T01:24:00.001-07:00</published><updated>2011-09-07T01:37:00.637-07:00</updated><title type='text'>Parallel Programming With Clones</title><content type='html'>This is a very simple way to do CPU parallel programming which automatically handles load ballancing without requiring atomic operations. Start the same program running on N threads in parallel sharing the same memory space. Write the program such that,&lt;br /&gt;&lt;br /&gt;(1.) The program can skip over work which it knows has been completed by another clone.&lt;br /&gt;&lt;br /&gt;(2.) That clones will always write the same results to memory for data.&lt;br /&gt;&lt;br /&gt;Under these rules, any thread can be preempted and the program continues, when the thread returns it quickly skips ahead to the front of computation. Threads trade sometimes redoing work for avoiding expensive communication and synchronization. A simple example,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// frameCounter advances by one each frame&lt;br /&gt;uint32_t frame; &lt;br /&gt;...&lt;br /&gt;// check if should start task&lt;br /&gt;volatile uint32_t taskStart; &lt;br /&gt;volatile uint32_t taskEnd;&lt;br /&gt;if(taskStart != frame) &lt;br /&gt;{ taskStart = frame; DoTask(); MemoryBarrier(); taskEnd = frame; }&lt;br /&gt;...&lt;br /&gt;// do some other work&lt;br /&gt;...&lt;br /&gt;// verify task was completed&lt;br /&gt;// before using results of task&lt;br /&gt;if(taskEnd != frame) &lt;br /&gt;{ DoTask(); MemoryBarrier(); taskEnd = frame; }&lt;br /&gt;...&lt;br /&gt;// use results of DoTask()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Keep data double buffered and setup a simple barrier construct so that threads cannot fall over two frames behind. Also insure that threads are running enough out of phase so that they do not all always attempt to do all the same work.&lt;br /&gt;&lt;br /&gt;For exceptions to the rule, keep track of a threadIdx for each thread (perhaps in thread local storage). External interfaces need to be predicated to only run in one thread, for example OpenGL access requires that calls be predicated to only the thread which owns the active GL context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7610984018314751125?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7610984018314751125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/09/parallel-programming-with-clones.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7610984018314751125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7610984018314751125'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/09/parallel-programming-with-clones.html' title='Parallel Programming With Clones'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5775683051257678272</id><published>2011-08-31T00:28:00.000-07:00</published><updated>2011-08-31T00:29:19.347-07:00</updated><title type='text'>Hawken Tube</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/iVa7B1bLv8I" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5775683051257678272?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5775683051257678272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/hawken-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5775683051257678272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5775683051257678272'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/hawken-tube.html' title='Hawken Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/iVa7B1bLv8I/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6356710108809435890</id><published>2011-08-24T21:22:00.000-07:00</published><updated>2011-08-24T23:10:14.675-07:00</updated><title type='text'>Android Wish List</title><content type='html'>&lt;i&gt;Just in case this isn't clear, these are my personal opinions only!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1.) SUPPORT OPENGL&lt;br /&gt;&lt;br /&gt;Yeah GL without the ES. ES is even limiting on the current generation of tiny GPUs designed for low power, what about future rounds from all the major GPU vendors. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(2.) SUPPORT FULL SCREEN MODE&lt;br /&gt;&lt;br /&gt;Low-power, high-efficiency, access to run full screen. Game aware device orientation. Game renders into back buffer, OS scans out from the game's back buffer without the normal expensive copy and UI composite step. Support hardware scaling scanout, for efficient up-sampling. Game provides user an option for low-power mode where the game can run at a lower resolution taking advantage of the scaling scanout to save battery life.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;What about touch screen button bar?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Setup the full-screen API such that the application can resize the display, and provide a way for the application to query the size/position of the required UI bar. The application draws as normal leaving the UI bar region alone. And during the swap call, have a way for the Android UI to redraw just the bar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(3.) SUPPORT VARIABLE FRAME RATE &lt;br /&gt;&lt;br /&gt;Along with full screen mode, only scan out the display at the rate at which the application calls swap. Smart games supporting user controlled "power saving" mode can adapt frame rate to save battery life.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(4.) SUPPORT FULL NATIVE DEVELOPMENT&lt;br /&gt;&lt;br /&gt;Complete the API layer such that Java is not needed for AAA style games. So native input, native sound, native full screen, native graphics, and native support for Android Market in-app purchases and license verification requests. The entire Java development layer is a nightmare of complexity. Want only C/C++ with inline assembly. Also inefficient CPU overhead through the OS, libraries, UI, etc is fail for battery life, and fail on mobile devices which share power between the CPU and GPU.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(5.) SUPPORT NATIVE DEVELOPMENT ON THE DEVICE&lt;br /&gt;&lt;br /&gt;How funny is it when you can use a Linux device that is slower and less capable than an Android Tablet to build your Android app, and you still cannot simply use your Android Tablet to build your app or develop? Or when someone at a coffee house has an Eee Pad Transformer (Android Tablet which has a keyboard and mouse pad) and needs to bring a 2nd notebook simply to develop. I want my Android computer which can be used to produce content, not my Android brick that can only consume content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CLOSING&lt;br /&gt;&lt;br /&gt;&lt;i&gt;With the top players like Google, Microsoft, and Apple with a range of 150 to near 350 billion market cap, there is no lack of capital to fund greatness. Yeah, the race is on. All these companies have loads of talented individuals, but who has the balls to take the mobile platform to the next level?&lt;/i&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6356710108809435890?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6356710108809435890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/android-wish-list.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6356710108809435890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6356710108809435890'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/android-wish-list.html' title='Android Wish List'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5298174899897219151</id><published>2011-08-19T08:28:00.000-07:00</published><updated>2011-08-19T08:29:34.156-07:00</updated><title type='text'>PixelJunk SideScroller Tube</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/mdaBN50DMnU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5298174899897219151?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5298174899897219151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/pixeljunk-sidescroller-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5298174899897219151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5298174899897219151'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/pixeljunk-sidescroller-tube.html' title='PixelJunk SideScroller Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/mdaBN50DMnU/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-51741874086481688</id><published>2011-08-18T08:53:00.000-07:00</published><updated>2011-08-18T08:55:17.474-07:00</updated><title type='text'>Advances In Realtime Rendering in 3D Graphics and Games</title><content type='html'>&lt;a href="http://advances.realtimerendering.com/s2011/index.html"&gt;Advances In Realtime Rendering in 3D Graphics and Games&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-51741874086481688?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/51741874086481688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/advances-in-realtime-rendering-in-3d.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/51741874086481688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/51741874086481688'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/advances-in-realtime-rendering-in-3d.html' title='Advances In Realtime Rendering in 3D Graphics and Games'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3150631863996183760</id><published>2011-08-17T10:12:00.000-07:00</published><updated>2011-08-17T10:24:41.856-07:00</updated><title type='text'>Prey 2 Stills</title><content type='html'>&lt;a href="http://www.gamersyde.com/news_gc_prey_2_gets_new_screens-11696_en.html"&gt;Prey 2 Stills on Gamersyde&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://images.gamersyde.com/image_prey_2-16734-2248_0001.jpg"&gt;&lt;img src="http://www.gamersyde.com/news_gc_prey_2_gets_new_screens-11696.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://images.gamersyde.com/image_prey_2-16734-2248_0002.jpg"&gt;&lt;img src="http://images.gamersyde.com/thumb_image_prey_2-16734-2248_0002.jpg"&gt;&lt;/a&gt; &lt;a href="http://images.gamersyde.com/image_prey_2-16734-2248_0003.jpg"&gt;&lt;img src="http://images.gamersyde.com/thumb_image_prey_2-16734-2248_0003.jpg"&gt;&lt;/a&gt; &lt;a href="http://images.gamersyde.com/image_prey_2-16734-2248_0005.jpg"&gt;&lt;img src="http://images.gamersyde.com/thumb_image_prey_2-16734-2248_0005.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3150631863996183760?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3150631863996183760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/prey-2-stills.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3150631863996183760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3150631863996183760'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/prey-2-stills.html' title='Prey 2 Stills'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1430428189491631765</id><published>2011-08-14T22:09:00.000-07:00</published><updated>2011-08-14T22:21:16.185-07:00</updated><title type='text'>Evoke 2011 Tubes</title><content type='html'>&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/TUlGfIIx05A" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/twaFBR1de-w" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1430428189491631765?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1430428189491631765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/evoke-2011-tubes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1430428189491631765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1430428189491631765'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/evoke-2011-tubes.html' title='Evoke 2011 Tubes'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/TUlGfIIx05A/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3226261550771336353</id><published>2011-08-12T18:01:00.000-07:00</published><updated>2011-08-12T18:42:38.765-07:00</updated><title type='text'>Mikkel Gjoel's Brink OpenGL Talk</title><content type='html'>&lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011-siggraph-opengl-bof/Brink-preferred-rendering-with-OpenGL.pdf"&gt;Brink Preferred Rendering With OpenGL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Great talk. Definitely when going to bindless vertex attributes (was 5%-10% reduction in frame time on CPU from slides) need to transform per-frame temporaries from allocate every frame to manual allocate once then roll your own dynamic allocation inside that buffer. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3226261550771336353?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3226261550771336353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/mikkel-gjoels-brink-opengl-talk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3226261550771336353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3226261550771336353'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/mikkel-gjoels-brink-opengl-talk.html' title='Mikkel Gjoel&apos;s Brink OpenGL Talk'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3868372754471173671</id><published>2011-08-12T17:43:00.000-07:00</published><updated>2011-08-12T17:55:19.310-07:00</updated><title type='text'>FXAA 3.11 Bug Fixes For 360</title><content type='html'>&lt;a href="https://docs.google.com/leaf?id=0B2manFVVrzQAOWUwODM1YmQtNmEwOC00ZDBlLThlYzMtYzE4ZDM1ZjRlMzMx&amp;hl=en_US"&gt;FXAA 3.11 Source Updated&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bug fixes for 360 version starting on line 1425, here is what the new correct source is,&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    float4 rgbyB = rgbyN2 + rgbyP2 + rgbyA * 0.5;&lt;br /&gt;/*--------------------------------------------------------------------------*/&lt;br /&gt;    float4 rgbyR = ((FxaaLuma(rgbyB) - lumaMax) &gt; 0.0) ? rgbyA : rgbyB; &lt;br /&gt;    rgbyR = ((FxaaLuma(rgbyB) - lumaMin) &gt; 0.0) ? rgbyR : rgbyA; &lt;br /&gt;    return rgbyR; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3868372754471173671?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3868372754471173671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/fxaa-311-bug-fixes-for-360.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3868372754471173671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3868372754471173671'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/fxaa-311-bug-fixes-for-360.html' title='FXAA 3.11 Bug Fixes For 360'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5945200231047601095</id><published>2011-08-07T18:50:00.000-07:00</published><updated>2011-08-07T21:47:26.332-07:00</updated><title type='text'>Assembly Tubes</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/taFvWDc5Egs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/69Xjc7eklxE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5945200231047601095?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5945200231047601095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/assembly-tubes.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5945200231047601095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5945200231047601095'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/assembly-tubes.html' title='Assembly Tubes'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/taFvWDc5Egs/default.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6890116271313523479</id><published>2011-08-04T13:35:00.001-07:00</published><updated>2011-08-04T13:35:54.962-07:00</updated><title type='text'>Rage Uprising Tube</title><content type='html'>&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/GFE66chCZuA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6890116271313523479?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6890116271313523479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/rage-uprising-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6890116271313523479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6890116271313523479'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/rage-uprising-tube.html' title='Rage Uprising Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/GFE66chCZuA/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8142180313465042467</id><published>2011-08-02T17:57:00.000-07:00</published><updated>2011-08-02T18:04:49.551-07:00</updated><title type='text'>Note, FXAA Does Not Use Blending</title><content type='html'>I should have been more proactive about documenting FXAA integration for people new to the shader. FXAA runs in two ways,&lt;br /&gt;&lt;br /&gt;(1.) DEFAULT. FXAA takes a texture (the screen image prior to drawing HUD or text) as input, then outputs WITHOUT blending to another render target. FXAA writes all pixels.&lt;br /&gt;&lt;br /&gt;(2.) DISCARD. Using "#define FXAA_DISCARD 1". This only works on OpenGL for the PC taking advantage of extensions which enable the ability to bind the current frame buffer object as a readable texture. This option technically should not work with "#define FXAA_GREEN_AS_LUMA 1", but might work. This option also does not use blending, and also does not write all pixels.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8142180313465042467?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8142180313465042467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/08/note-fxaa-does-not-use-blending.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8142180313465042467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8142180313465042467'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/08/note-fxaa-does-not-use-blending.html' title='Note, FXAA Does Not Use Blending'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4941833406367587844</id><published>2011-07-26T16:12:00.000-07:00</published><updated>2011-07-26T16:35:56.085-07:00</updated><title type='text'>Fixed a few typos in FXAA 3.11</title><content type='html'>Changes reflected in the online source,&lt;br /&gt;&lt;br /&gt;(1.) Fixed 360 typos where float4 should have been float.&lt;br /&gt;(2.) Made "#define FXAA_PS3 1" work without also "#define FXAA_HLSL_3 1".&lt;br /&gt;(3.) Set "#pragma regcount 7" on PS3 shaders for better texture cache perf.&lt;br /&gt;&lt;br /&gt;Latest feedback,&lt;br /&gt;&lt;br /&gt;(1.) PS3 with early exit path is 1.2 ms (with regcount 7).&lt;br /&gt;(2.) However with FXAA_GREEN_AS_LUMA is 1.4 ms (adds 1 clk cycle to shader).&lt;br /&gt;&lt;br /&gt;Will attempt to address the FXAA_GREEN_AS_LUMA perf for PS3 in FXAA 3.12 and attempt to take advantage of TextureRemap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4941833406367587844?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4941833406367587844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fixed-few-typos-in-fxaa-311.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4941833406367587844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4941833406367587844'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fixed-few-typos-in-fxaa-311.html' title='Fixed a few typos in FXAA 3.11'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2375943358556710846</id><published>2011-07-26T10:03:00.000-07:00</published><updated>2011-07-26T10:08:16.953-07:00</updated><title type='text'>Voxel Pipe</title><content type='html'>&lt;a href="http://research.nvidia.com/sites/default/files/publications/voxel-pipe.pdf"&gt;Voxel Pipe Paper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Including a teaser pair of images for a future voxel based real-time GI paper,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Finally, in Figure 5 we show a proof of concept of a real-time global illumination system that we plan to disclose in the near future. The system re-lies on our voxelization pipeline to create a proxy of the scene geometry that is used to trace incoherent rays. The proxy is rebuilt every frame, allowing support of fully dynamic geometry, materials and lighting."&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2375943358556710846?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2375943358556710846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/voxel-pipe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2375943358556710846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2375943358556710846'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/voxel-pipe.html' title='Voxel Pipe'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4564069631131133157</id><published>2011-07-22T09:38:00.000-07:00</published><updated>2011-07-22T09:40:17.930-07:00</updated><title type='text'>Specular Showdown in the Wild West</title><content type='html'>Awesome post by Stephen Hill:  &lt;a href="http://blog.selfshadow.com/2011/07/22/specular-showdown/"&gt;Specular Showdown in the Wild West&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4564069631131133157?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4564069631131133157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/specular-showdown-in-wild-west.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4564069631131133157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4564069631131133157'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/specular-showdown-in-wild-west.html' title='Specular Showdown in the Wild West'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3150155158782826154</id><published>2011-07-21T22:55:00.000-07:00</published><updated>2011-07-21T23:54:27.445-07:00</updated><title type='text'>FXAA 3.11 Released</title><content type='html'>&lt;a href="https://docs.google.com/leaf?id=0B2manFVVrzQAOWUwODM1YmQtNmEwOC00ZDBlLThlYzMtYzE4ZDM1ZjRlMzMx&amp;hl=en_US"&gt;Download FXAA 3.11 Source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"... as for the next release, not sure when, probably not for a while, I'm really busy right now on other projects ..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;That comment was just yesterday, and actually I'm serious this time, likely not going to update for a while, but had to at least incorporate all the great suggestions I've been getting from developers, hence the FXAA 3.11 release.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA Now Supports Using Green Instead of Luma&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_GREEN_AS_LUMA 1&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;And massively lower the following inputs towards zero (or set to zero),&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;FxaaFloat fxaaQualityEdgeThresholdMin,&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;FxaaFloat fxaaConsoleEdgeThresholdMin,&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;This define enables developers to avoid packing luma into the alpha channel when processing non-linear RGB data. The compromise here is that colors which lack any green (like pure blues, reds, or just a mix of blues and reds) will not get any AA. This is likely ok, because often these blues and reds border something which has a non-zero green channel so at least one side will get AA, and pure hues are often rare in practice.&lt;br /&gt;&lt;br /&gt;A second compromise is that the early exit path will be less effective since the min threshold will have to be lowered in order to insure AA is not turned off on colors which contain only a very minor amount of green.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cleaned up FxaaPixelShader() Inputs and Tuning Knobs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Unified the inputs to all version of the shaders so that integration is easier. For those not using all the shaders, simply use zeros when inputs are not needed. Look on line 721 in the source for all the input docs (or see below). &lt;br /&gt;&lt;br /&gt;All the major tuning knobs, with the exception of 2 PS3 settings and FXAA_QUALITY__PRESET, are now shader inputs instead of defines as they were in the last version. &lt;br /&gt;&lt;br /&gt;Note, the constants used for FXAA Console are now different (they now match the needs of the optimized 360 version) so some C code will need to change when integrating FXAA 3.11. &lt;br /&gt;&lt;br /&gt;Quick conversion from FXAA 3.10 (with old defines in comments),&lt;br /&gt;&lt;pre&gt;FxaaFloat4 FxaaPixelShader(&lt;br /&gt;    pos,&lt;br /&gt;    posPos,&lt;br /&gt;    tex,&lt;br /&gt;    tex,                        // these will be different for 360&lt;br /&gt;    tex,                        // these will be different for 360&lt;br /&gt;    rcpFrame,&lt;br /&gt;    fxaaConsoleRcpFrameOpt,     // this is new&lt;br /&gt;    fxaaConsoleRcpFrameOpt2,    // this is new &lt;br /&gt;    fxaaConsole360RcpFrameOpt2, // this is new&lt;br /&gt;    0.75,                       // FXAA_QUALITY__SUBPIX&lt;br /&gt;    0.166,                      // FXAA_QUALITY__EDGE_THRESHOLD&lt;br /&gt;    0.0833,                     // FXAA_QUALITY__EDGE_THRESHOLD_MIN&lt;br /&gt;    8.0,                        // FXAA_CONSOLE__EDGE_SHARPNESS&lt;br /&gt;    0.125,                      // FXAA_CONSOLE__EDGE_THRESHOLD&lt;br /&gt;    0.05,                       // FXAA_CONSOLE__EDGE_THRESHOLD_MIN&lt;br /&gt;    fxaaConsole360ConstDir      // this is new&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;New input docs (also in source code),&lt;br /&gt;&lt;pre&gt;FxaaFloat4 FxaaPixelShader(&lt;br /&gt;    //&lt;br /&gt;    // Use noperspective interpolation here (turn off perspective interpolation).&lt;br /&gt;    // {xy} = center of pixel&lt;br /&gt;    FxaaFloat2 pos,&lt;br /&gt;    //&lt;br /&gt;    // Used only for FXAA Console, and not used on the 360 version.&lt;br /&gt;    // Use noperspective interpolation here (turn off perspective interpolation).&lt;br /&gt;    // {xy__} = upper left of pixel&lt;br /&gt;    // {__zw} = lower right of pixel&lt;br /&gt;    FxaaFloat4 fxaaConsolePosPos,&lt;br /&gt;    //&lt;br /&gt;    // Input color texture.&lt;br /&gt;    // {rgb_} = color in linear or perceptual color space&lt;br /&gt;    // if (FXAA_GREEN_AS_LUMA == 0)&lt;br /&gt;    //     {___a} = luma in perceptual color space (not linear)&lt;br /&gt;    FxaaTex tex,&lt;br /&gt;    //&lt;br /&gt;    // Only used on the optimized 360 version of FXAA Console.&lt;br /&gt;    // For everything but 360, just use the same input here as for "tex".&lt;br /&gt;    // For 360, same texture, just alias with a 2nd sampler.&lt;br /&gt;    // This sampler needs to have an exponent bias of -1.&lt;br /&gt;    FxaaTex fxaaConsole360TexExpBiasNegOne,&lt;br /&gt;    //&lt;br /&gt;    // Only used on the optimized 360 version of FXAA Console.&lt;br /&gt;    // For everything but 360, just use the same input here as for "tex".&lt;br /&gt;    // For 360, same texture, just alias with a 3nd sampler.&lt;br /&gt;    // This sampler needs to have an exponent bias of -2.&lt;br /&gt;    FxaaTex fxaaConsole360TexExpBiasNegTwo,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Quality.&lt;br /&gt;    // This must be from a constant/uniform.&lt;br /&gt;    // {x_} = 1.0/screenWidthInPixels&lt;br /&gt;    // {_y} = 1.0/screenHeightInPixels&lt;br /&gt;    FxaaFloat2 fxaaQualityRcpFrame,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // This must be from a constant/uniform.&lt;br /&gt;    // This effects sub-pixel AA quality and inversely sharpness.&lt;br /&gt;    //   Where N ranges between,&lt;br /&gt;    //     N = 0.50 (default)&lt;br /&gt;    //     N = 0.33 (sharper)&lt;br /&gt;    // {x___} = -N/screenWidthInPixels  &lt;br /&gt;    // {_y__} = -N/screenHeightInPixels&lt;br /&gt;    // {__z_} =  N/screenWidthInPixels  &lt;br /&gt;    // {___w} =  N/screenHeightInPixels &lt;br /&gt;    FxaaFloat4 fxaaConsoleRcpFrameOpt,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // Not used on 360, but used on PS3 and PC.&lt;br /&gt;    // This must be from a constant/uniform.&lt;br /&gt;    // {x___} = -2.0/screenWidthInPixels  &lt;br /&gt;    // {_y__} = -2.0/screenHeightInPixels&lt;br /&gt;    // {__z_} =  2.0/screenWidthInPixels  &lt;br /&gt;    // {___w} =  2.0/screenHeightInPixels &lt;br /&gt;    FxaaFloat4 fxaaConsoleRcpFrameOpt2,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.&lt;br /&gt;    // This must be from a constant/uniform.&lt;br /&gt;    // {x___} =  8.0/screenWidthInPixels  &lt;br /&gt;    // {_y__} =  8.0/screenHeightInPixels&lt;br /&gt;    // {__z_} = -4.0/screenWidthInPixels  &lt;br /&gt;    // {___w} = -4.0/screenHeightInPixels &lt;br /&gt;    FxaaFloat4 fxaaConsole360RcpFrameOpt2,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Quality.&lt;br /&gt;    // This used to be the FXAA_QUALITY__SUBPIX define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // Choose the amount of sub-pixel aliasing removal.&lt;br /&gt;    // This can effect sharpness.&lt;br /&gt;    //   1.00 - upper limit (softer)&lt;br /&gt;    //   0.75 - default amount of filtering&lt;br /&gt;    //   0.50 - lower limit (sharper, less sub-pixel aliasing removal)&lt;br /&gt;    //   0.25 - almost off&lt;br /&gt;    //   0.00 - completely off&lt;br /&gt;    FxaaFloat fxaaQualitySubpix,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Quality.&lt;br /&gt;    // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // The minimum amount of local contrast required to apply algorithm.&lt;br /&gt;    //   0.333 - too little (faster)&lt;br /&gt;    //   0.250 - low quality&lt;br /&gt;    //   0.166 - default&lt;br /&gt;    //   0.125 - high quality &lt;br /&gt;    //   0.063 - overkill (slower)&lt;br /&gt;    FxaaFloat fxaaQualityEdgeThreshold,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Quality.&lt;br /&gt;    // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // Trims the algorithm from processing darks.&lt;br /&gt;    //   0.0833 - upper limit (default, the start of visible unfiltered edges)&lt;br /&gt;    //   0.0625 - high quality (faster)&lt;br /&gt;    //   0.0312 - visible limit (slower)&lt;br /&gt;    // Special notes when using FXAA_GREEN_AS_LUMA,&lt;br /&gt;    //   Likely want to set this to zero.&lt;br /&gt;    //   As colors that are mostly not-green&lt;br /&gt;    //   will appear very dark in the green channel!&lt;br /&gt;    //   Tune by looking at mostly non-green content,&lt;br /&gt;    //   then start at zero and increase until aliasing is a problem.&lt;br /&gt;    FxaaFloat fxaaQualityEdgeThresholdMin,&lt;br /&gt;    // &lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // This does not effect PS3, as this needs to be compiled in.&lt;br /&gt;    //   Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.&lt;br /&gt;    //   Due to the PS3 being ALU bound,&lt;br /&gt;    //   there are only three safe values here: 2 and 4 and 8.&lt;br /&gt;    //   These options use the shaders ability to a free *|/ by 2|4|8.&lt;br /&gt;    // For all other platforms can be a non-power of two.&lt;br /&gt;    //   8.0 is sharper (default!!!)&lt;br /&gt;    //   4.0 is softer&lt;br /&gt;    //   2.0 is really soft (good only for vector graphics inputs)&lt;br /&gt;    FxaaFloat fxaaConsoleEdgeSharpness,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // This does not effect PS3, as this needs to be compiled in.&lt;br /&gt;    //   Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.&lt;br /&gt;    //   Due to the PS3 being ALU bound,&lt;br /&gt;    //   there are only two safe values here: 1/4 and 1/8.&lt;br /&gt;    //   These options use the shaders ability to a free *|/ by 2|4|8.&lt;br /&gt;    // The console setting has a different mapping than the quality setting.&lt;br /&gt;    // Other platforms can use other values.&lt;br /&gt;    //   0.125 leaves less aliasing, but is softer (default!!!)&lt;br /&gt;    //   0.25 leaves more aliasing, and is sharper&lt;br /&gt;    FxaaFloat fxaaConsoleEdgeThreshold,&lt;br /&gt;    //&lt;br /&gt;    // Only used on FXAA Console.&lt;br /&gt;    // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.&lt;br /&gt;    // It is here now to allow easier tuning.&lt;br /&gt;    // Trims the algorithm from processing darks.&lt;br /&gt;    // The console setting has a different mapping than the quality setting.&lt;br /&gt;    // This only applies when FXAA_EARLY_EXIT is 1.&lt;br /&gt;    // This does not apply to PS3, &lt;br /&gt;    // PS3 was simplified to avoid more shader instructions.&lt;br /&gt;    //   0.06 - faster but more aliasing in darks&lt;br /&gt;    //   0.05 - default&lt;br /&gt;    //   0.04 - slower and less aliasing in darks&lt;br /&gt;    // Special notes when using FXAA_GREEN_AS_LUMA,&lt;br /&gt;    //   Likely want to set this to zero.&lt;br /&gt;    //   As colors that are mostly not-green&lt;br /&gt;    //   will appear very dark in the green channel!&lt;br /&gt;    //   Tune by looking at mostly non-green content,&lt;br /&gt;    //   then start at zero and increase until aliasing is a problem.&lt;br /&gt;    FxaaFloat fxaaConsoleEdgeThresholdMin,&lt;br /&gt;    //    &lt;br /&gt;    // Extra constants for 360 FXAA Console only.&lt;br /&gt;    // Use zeros or anything else for other platforms.&lt;br /&gt;    // These must be in physical constant registers and NOT immedates.&lt;br /&gt;    // Immedates will result in compiler un-optimizing.&lt;br /&gt;    // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)&lt;br /&gt;    FxaaFloat4 fxaaConsole360ConstDir&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA Console 360 Code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The optimized 360 version is now the only 360 version. The 3.9 and 3.10 optimized 360 versions had a bad typo/bug which I found and fixed with 3.11. Not sure if anyone got far enough to try it yet. Hopefully it will work now, please let me know if output for some reason does not look right.&lt;br /&gt;&lt;br /&gt;Note the 360 version needs 3 samplers which alias to the same texture. Each sampler has a different exponential bias to factor out multiplies which would otherwise be done in the shader.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fixed Type Aliasing Problem for OpenGL Developers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Switched all types to "Fxaa*" so that FXAA does not alias defines with other developers who are already redefining GL's vecN types to floatN.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA Console for PC Is Tiny Bit Faster on NVIDIA Cards&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Actually at this point if you are running FXAA Console on PC, you might want to try just running the FXAA Quality algorithm with the lowest presets,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_PC 1&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_QUALITY__PRESET 10&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Or,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_PC 1&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_QUALITY__PRESET 20&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3150155158782826154?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3150155158782826154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-311-released.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3150155158782826154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3150155158782826154'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-311-released.html' title='FXAA 3.11 Released'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8577517949233168118</id><published>2011-07-20T20:38:00.000-07:00</published><updated>2011-07-21T11:07:35.457-07:00</updated><title type='text'>FXAA 3.10 Released</title><content type='html'>&lt;a href="https://docs.google.com/leaf?id=0B2manFVVrzQANDA1MmViY2QtNzM3ZC00YTlkLWIxODctNDQ5ZTdlMWYzZDFk&amp;hl=en_US"&gt;Download FXAA 3.10 Shader Source&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Images&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh5.googleusercontent.com/-8PI4kSnCEb4/TiekPkAP-5I/AAAAAAAAAWU/u4dc_ef7cDA/s800/oo-13.png"&gt;&lt;br&gt;FXAA 3.10 Preset 13 (about same cost as FXAA 3.9)&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh5.googleusercontent.com/-gqKq5uvKImg/TielMffkG8I/AAAAAAAAAWc/RlwAxe_eN2Q/s800/oo-fxaa39.png"&gt;&lt;br&gt;FXAA 3.9&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh4.googleusercontent.com/-TlmcPyNj_Jk/Tielbq82h1I/AAAAAAAAAWk/K7tXtAlYCXc/s800/oo-noaa.png"&gt;&lt;br&gt;No AA&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;360 Optimized Shader Updates&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Fixed a missing ";" typo. Made some changes here to make it easier to integrate in engines like Unreal.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Added FXAA Quality Presets&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Added presets to enable developers to tune performance/quality trade off. Change with define,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_QUALITY__PRESET 12&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The 2N presets are like FXAA 3.9 but with slightly better long edge quality. If you have problems with dithering (or ringing) by thin objects then use a 2N preset. The 1N presets trade better long edge quality for more dithering artifacts. For a given cost, 1N presets will have better long edge quality than 2N presets. Notes from the code,&lt;br /&gt;&lt;pre&gt;OPTIONS&lt;br /&gt;-----------------------------------------------------------------------&lt;br /&gt;10 to 15 - default medium dither (10=fastest, 15=highest quality)&lt;br /&gt;20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)&lt;br /&gt;39       - no dither, very expensive &lt;br /&gt;&lt;br /&gt;NOTES&lt;br /&gt;-----------------------------------------------------------------------&lt;br /&gt;12 = slightly faster then FXAA 3.9 and higher edge quality (default)&lt;br /&gt;13 = about same speed as FXAA 3.9 and better than 12&lt;br /&gt;23 = closest to FXAA 3.9 visually and performance wise&lt;br /&gt; _ = the lowest digit is directly related to performance&lt;br /&gt;_  = the highest digit is directly related to style&lt;/pre&gt;&lt;br /&gt;Performance is determined by the last digit. Example runtime for GTX 480 for a 720p frame,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;_0 = 0.171 ms&lt;br /&gt;_1 = 0.188 ms&lt;br /&gt;_2 = 0.202 ms (default for FXAA 3.10)&lt;br /&gt;_3 = 0.214 ms (default for FXAA 3.9)&lt;br /&gt;_4 = 0.226 ms&lt;br /&gt;_5 = 0.238 ms&lt;br /&gt;_6 = 0.247 ms&lt;br /&gt;_7 = 0.256 ms&lt;br /&gt;_8 = 0.265 ms&lt;br /&gt;_9 = 0.274 ms&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8577517949233168118?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8577517949233168118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-310-released.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8577517949233168118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8577517949233168118'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-310-released.html' title='FXAA 3.10 Released'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-8PI4kSnCEb4/TiekPkAP-5I/AAAAAAAAAWU/u4dc_ef7cDA/s72-c/oo-13.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7069378024694717499</id><published>2011-07-20T01:55:00.001-07:00</published><updated>2011-07-20T02:02:25.362-07:00</updated><title type='text'>FXAA 3.10 Soon</title><content type='html'>Just finished up the FXAA 3.10 update. Still need to do a little performance and image testing before I can release it (only tested thus far on my notebook). Teaser,&lt;br /&gt;&lt;br /&gt;(0.) Re-introduced presets to FXAA Quality.&lt;br /&gt;(1.) So better user control on quality/performance.&lt;br /&gt;(2.) Have much better long edge support!&lt;br /&gt;(3.) Default preset should be faster than FXAA 3.9.&lt;br /&gt;(4.) Default preset will have higher long edge quality.&lt;br /&gt;(5.) Possible faster new early exit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7069378024694717499?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7069378024694717499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-310-soon.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7069378024694717499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7069378024694717499'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-310-soon.html' title='FXAA 3.10 Soon'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1235832267927563646</id><published>2011-07-18T13:28:00.001-07:00</published><updated>2011-07-18T13:28:45.951-07:00</updated><title type='text'>HardOCP Article on FXAA in FEAR3</title><content type='html'>&lt;a href="http://hardocp.com/article/2011/07/18/nvidias_new_fxaa_antialiasing_technology"&gt;HardOCP Article on FXAA in FEAR3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1235832267927563646?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1235832267927563646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/hardocp-article-on-fxaa-in-fear3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1235832267927563646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1235832267927563646'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/hardocp-article-on-fxaa-in-fear3.html' title='HardOCP Article on FXAA in FEAR3'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2417249938305515322</id><published>2011-07-17T20:08:00.001-07:00</published><updated>2011-07-17T20:22:27.155-07:00</updated><title type='text'>Anyone want FXAA 3 with better long edge quality for PC?</title><content type='html'>&lt;a href="http://www.eurogamer.net/articles/digital-foundry-future-of-anti-aliasing"&gt;Digital Foundry : Future of AA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Should I add "FXAA Long-Edge-Quality" to FXAA 3?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I might have gone too aggressive in the optimization vs long-edge-quality trade off with FXAA 3 Quality aiming for lower end PC GPUs. Easy to fix if anyone wants it. Let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2417249938305515322?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2417249938305515322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/anyone-want-fxaa-3-with-better-long.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2417249938305515322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2417249938305515322'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/anyone-want-fxaa-3-with-better-long.html' title='Anyone want FXAA 3 with better long edge quality for PC?'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4763142552155897245</id><published>2011-07-13T16:28:00.000-07:00</published><updated>2011-07-13T16:30:40.526-07:00</updated><title type='text'>FXAA 3.9 Typo Fixed</title><content type='html'>Was a typo which is fixed now in the prior linked source: line 1347 had an extra ";", should be,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define lumaM rgbyM.w&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Not,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define lumaM rgbyM.w;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4763142552155897245?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4763142552155897245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-39-typo-fixed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4763142552155897245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4763142552155897245'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/fxaa-39-typo-fixed.html' title='FXAA 3.9 Typo Fixed'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4226952430083930219</id><published>2011-07-13T13:40:00.000-07:00</published><updated>2011-07-13T15:40:42.426-07:00</updated><title type='text'>NVIDIA FXAA 3.9 Released</title><content type='html'>(1.) Fixed FXAA Quality artifact problems.&lt;br /&gt;(2.) Some FXAA Quaility optimizations targeting NVIDIA cards.&lt;br /&gt;(3.) New prototype optimized 360 version of FXAA Console.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B2manFVVrzQAZWEyNzcwZjYtMTkwNi00YWVjLWJiMTAtZGNkN2FlMmFmODEx&amp;hl=en_US"&gt;Download FXAA 3.9 Shader Source Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA Quality Algorithm Quality Improvements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are a few image quality improvements in FXAA 3.9 for specific cases where FXAA 3.8 had problems. Here is one subtle example, FXAA 3.9 is better on already AA'ed thin features which transition between vertical to diagonal to horizontal. FXAA 3.8 has more distortion in these cases. See the area around the ring below.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Image crop taken from Civ, which already has great AA...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh4.googleusercontent.com/-tEaR14f--Nk/Th4B5KcJKRI/AAAAAAAAASc/H9RO4TyuJvE/s800/fxaa39_a.png"&gt;&lt;br&gt;FXAA 3.8 (left), FXAA 3.9 (right)&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA 3.9 Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;With FXAA 3.9's new quality improvements, performance should be similar to FXAA 3.8, with the exception of increased performance on some NVIDIA cards. For example, FXAA 3.9 on GTX 480 is about 24% faster than FXAA 3.8. A 720p frame on GTX480 can now be processed in 0.21 ms (actual timing depends slightly on the image). More importantly for lower end cards:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$113 GTX 550ti 1920x1200 @ 1.3 ms&lt;br /&gt; $88 GTS 450   1680x1050 @ 1.1 ms&lt;/pre&gt;&lt;br /&gt;The Quality version of the algorithm now runs on low-end NVIDIA cards at higher resolutions faster than the Console version of the algorithm on PS3 at 1280x720.&lt;br /&gt;&lt;br /&gt;FXAA on DX11 and GL is slightly faster than DX9 (due to gather4), numbers above represent GL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prototype Fully Optimized FXAA for 360&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Latest build contains an untested fully optimized version of FXAA Console for the 360. This code was generated thanks to suggestions from Andy Luedke. Should be fully texture bound now. Let me know if there are problems (don't have a 360 to test on right now).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why Pixel and Sub-Pixel Contrast Reduction?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The "No AA" image taken from a crop of a BBC2 screen shot. Actually this image has some AA (see the iron-sight in the lower right), however aliasing remains due to alpha test and problems associated with tone-mapping after MSAA resolve...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;FXAA from version 1, was designed differently than prior AA filters in that FXAA specifically targets reducing contrast on features which are pixel in size. Single-pixel sized features alias by snapping from pixel to pixel, and sub-pixel sized features alias by flickering on and off as they overlap a pixel's center. To me, this is more visually distracting than edge crawling on multi-pixel features.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh5.googleusercontent.com/-9l7UwpJFHRI/Th4CL4fjgoI/AAAAAAAAASw/Fx2JMOsL6aw/s800/fxaa39-e.png"&gt;&lt;br&gt;No AA (left), No Contrast Reduction (middle), FXAA (right)&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;Without FXAA's Pixel and Sub-Pixel Contrast Reduction, visually aliasing still remains. With FXAA, aliasing is much reduced and consistent across image features. No post-process AA filter is going to fix everything, there is always a compromise between sharpness and lack of aliasing, but I feel as if FXAA does a good job and has a great quality/cost ratio.&lt;br /&gt;&lt;br /&gt;Certainly some developers and users will have different preferences on the aliasing vs softness trade-off. For this FXAA 3.9 Quality algorithm has a tuning knob: FXAA_QUALITY__SUBPIX. The "No Contrast Reduction" images were produced by zeroing this tuning knob.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh6.googleusercontent.com/-y2k15YpSiWg/Th4B_MFHNVI/AAAAAAAAASg/QQ2cDOPGBOM/s800/fxaa39-b.png"&gt;&lt;br&gt;No AA&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh4.googleusercontent.com/-Rwzh3Ocpozw/Th4CJptHpiI/AAAAAAAAASo/tA_s08cST3o/s800/fxaa39-c.png"&gt;&lt;br&gt;FXAA_QUALITY__SUBPIX = 0.0&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh6.googleusercontent.com/-Eql1D4HVPqg/Th4CLGCHWrI/AAAAAAAAASs/uPOdO3w54Us/s800/fxaa39-d.png"&gt;&lt;br&gt;FXAA_QUALITY__SUBPIX = 0.75 (default)&lt;/center&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4226952430083930219?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4226952430083930219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/07/nvidia-fxaa-39-released.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4226952430083930219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4226952430083930219'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/07/nvidia-fxaa-39-released.html' title='NVIDIA FXAA 3.9 Released'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-tEaR14f--Nk/Th4B5KcJKRI/AAAAAAAAASc/H9RO4TyuJvE/s72-c/fxaa39_a.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4500599689207769682</id><published>2011-06-27T15:40:00.001-07:00</published><updated>2011-06-27T15:40:57.823-07:00</updated><title type='text'>Crysis 2 DX11 Tube</title><content type='html'>&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/W65DwHZp-l4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4500599689207769682?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4500599689207769682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/crysis-2-dx11-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4500599689207769682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4500599689207769682'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/crysis-2-dx11-tube.html' title='Crysis 2 DX11 Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/W65DwHZp-l4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7720002788068578479</id><published>2011-06-27T14:22:00.000-07:00</published><updated>2011-06-27T14:26:21.174-07:00</updated><title type='text'>Sharper FXAA3 Console</title><content type='html'>This is was NOT documented prior, but FXAA3 Console can be made sharper by changing the "rcpFrameOpt" input. To sharpen change,&lt;br /&gt;&lt;pre&gt;// This must be from a constant/uniform.&lt;br /&gt;// {x___} = 2.0/screenWidthInPixels&lt;br /&gt;// {_y__} = 2.0/screenHeightInPixels&lt;br /&gt;// {__z_} = 0.5/screenWidthInPixels&lt;br /&gt;// {___w} = 0.5/screenHeightInPixels&lt;br /&gt;float4 rcpFrameOpt&lt;/pre&gt;&lt;br /&gt;To,&lt;br /&gt;&lt;pre&gt;// This must be from a constant/uniform.&lt;br /&gt;// {x___} = 2.0/screenWidthInPixels&lt;br /&gt;// {_y__} = 2.0/screenHeightInPixels&lt;br /&gt;// {__z_} = 0.333/screenWidthInPixels&lt;br /&gt;// {___w} = 0.333/screenHeightInPixels&lt;br /&gt;float4 rcpFrameOpt&lt;/pre&gt;&lt;br /&gt;Lowing the constant from "0.5/" to "0.333/" will decrease the amount of sub-pixel AA, allowing more aliasing and less blur on single pixel features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7720002788068578479?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7720002788068578479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/sharper-fxaa3-console.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7720002788068578479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7720002788068578479'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/sharper-fxaa3-console.html' title='Sharper FXAA3 Console'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7768714982434683686</id><published>2011-06-24T08:44:00.000-07:00</published><updated>2011-06-24T08:48:37.142-07:00</updated><title type='text'>Voxel Cone Tracing</title><content type='html'>&lt;a href="http://blog.icare3d.org/2011/06/interactive-indirect-illumination-and.html"&gt;See Cyril Crassin's Interactive Indirect Illumination Post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="480" height="390" src="http://www.youtube.com/embed/fAsg_xNzhcQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7768714982434683686?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7768714982434683686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/voxel-cone-tracing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7768714982434683686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7768714982434683686'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/voxel-cone-tracing.html' title='Voxel Cone Tracing'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/fAsg_xNzhcQ/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3408203423294244318</id><published>2011-06-22T08:39:00.001-07:00</published><updated>2011-06-22T08:50:28.605-07:00</updated><title type='text'>FXAA3 Without RGBL, or With Wrong Luma</title><content type='html'>&lt;b&gt;FXAA3 Without RGBL&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;An alternative for when getting Luma in Alpha is a problem and FXAA can run on non-linear RGB data: (1.) use the Green channel in place of Luma in the Alpha channel, (2.) adjust the early exit thresholds. Note this will not work for linear RGB, and this will result in no AA on pure red and blue edges.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If anyone goes this route for PS3, let me know, I will make an updated PS3 shader, as working with the Y channel changes around all the shader scheduling...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA3 With Incorrect Luma&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If there is a need to run FXAA right after blending, and the blending passes do not store or use destination Alpha: have the opaque writes before blending write out Luma into the Alpha channel, then blend, then run FXAA like normal.&lt;br /&gt;&lt;br /&gt;In this case, Luma will not match the RGB in areas with blending. But likely areas with blended content either maintain the edges of the opaque surfaces (windows), or blend over content which does not need AA (particles). &lt;br /&gt;&lt;br /&gt;&lt;i&gt;FXAA should work in this case. Would be interested in getting feedback on this. If there are problems, let me know, I can likely fix them...&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3408203423294244318?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3408203423294244318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-without-rgbl-or-with-wrong-luma.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3408203423294244318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3408203423294244318'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-without-rgbl-or-with-wrong-luma.html' title='FXAA3 Without RGBL, or With Wrong Luma'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1562043192862920787</id><published>2011-06-21T15:46:00.000-07:00</published><updated>2011-06-21T17:17:45.430-07:00</updated><title type='text'>FXAA3 Source Released</title><content type='html'>&lt;i&gt;Releasing FXAA3, this is the 8th update to the shader source (Fxaa3_8.h).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B2manFVVrzQAOGE3ZjgzMDUtYWZmNC00ZWVlLWFhMGEtZDdjMzMxMjM4M2Y4&amp;hl=en_US&amp;authkey=CPWYuLIJ"&gt;FXAA 3 Source Shader&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Results With FXAA3 Quality (PC) Algorithm&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Note this image was processed at one time instead of individual crops of images processed then stitched together.&lt;br /&gt;&lt;br /&gt;No AA (left), then FXAA3 Quality on linear RGB (right)&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-H_d5jqdv1Ws/Tf_WIAihLMI/AAAAAAAAAOk/bpbyUyDuFx0/s800/box.png"&gt; &lt;img src="https://lh3.googleusercontent.com/-r-NX2zgR2Sg/TgEw5buolbI/AAAAAAAAAR0/KfsN-GTSeVE/s800/box-quality-linear.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-Ah8vXQKL4BE/TgEwx9v3eNI/AAAAAAAAARk/yFOgSw9yPNA/box-quality-linear-2x.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linear RGB vs Non-Linear RGB&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Linear RGB (left), then non-linear RGB (right)&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-r-NX2zgR2Sg/TgEw5buolbI/AAAAAAAAAR0/KfsN-GTSeVE/s800/box-quality-linear.png"&gt; &lt;img src="https://lh5.googleusercontent.com/-qer_TSh4mmw/TgEw7C77coI/AAAAAAAAAR8/5QmACULIJLk/s800/box-quality-nonlinear.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-mklfggV9amg/TgEw1yOmMPI/AAAAAAAAARs/WdtxJKx05PA/box-quality-nonlinear-2x.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA3 Console vs FXAA3 Quality&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Both non-linear, Console (left), and Quality (right),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-C36dVONYJ-E/Tf_Xeeord_I/AAAAAAAAAQs/pCHNW4NADEk/s800/box-P-S8-T8.png"&gt; &lt;img src="https://lh5.googleusercontent.com/-qer_TSh4mmw/TgEw7C77coI/AAAAAAAAAR8/5QmACULIJLk/s800/box-quality-nonlinear.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1562043192862920787?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1562043192862920787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1562043192862920787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1562043192862920787'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html' title='FXAA3 Source Released'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-H_d5jqdv1Ws/Tf_WIAihLMI/AAAAAAAAAOk/bpbyUyDuFx0/s72-c/box.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6475006984748523746</id><published>2011-06-20T16:29:00.000-07:00</published><updated>2011-06-20T17:48:11.005-07:00</updated><title type='text'>FXAA3 Console Tuning</title><content type='html'>&lt;i&gt;This is for all those with the 2rd release candidate (Fxaa3_7.h). Also sorry in advance, some of the test swatches were sourced from JPEGs.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Still exploring getting the best quality of out of the latest FXAA3 Console. The settings in the last file might not be optimal (defaults were slightly blurry again), here is the latest that I have found. Note in all these screenshots I have, &lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_THRESHOLD_MIN 0.0&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;to turn off this feature so that output looks the same between PS3 and 360. Best to tune everything else first with this set to zero. Then afterwards tune the threshold min for 360.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IMO The New Best Settings&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is using non-linear RGB, and non-linear Luma, with the following settings,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 8.0&lt;br /&gt;#define FXAA_CONSOLE__EDGE_THRESHOLD 0.125&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Original then these settings with FXAA3 Console, &lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/-H_d5jqdv1Ws/Tf_WIAihLMI/AAAAAAAAAOk/bpbyUyDuFx0/s800/box.png"&gt; &lt;img src="https://lh4.googleusercontent.com/-C36dVONYJ-E/Tf_Xeeord_I/AAAAAAAAAQs/pCHNW4NADEk/s800/box-P-S8-T8.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-8RF4tWbI_AA/Tf_XilqIZQI/AAAAAAAAAQ0/lWJOSoYYtRc/box-P-S8-T8-2x.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why Does FXAA3 Console Add A Little Noise?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After gradient detection and early exit (5 samples), the algorithm only uses 4 or 2 samples to "blur" to remove aliasing. Hard to do any better in the very limited performance window...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Going Sharper&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is a little sharper and faster on 360 due to a more aggressive early exit, but starts to turn off AA on some edges. Same non-linear RGB, and non-linear Luma, with the following settings,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 8.0&lt;br /&gt;#define FXAA_CONSOLE__EDGE_THRESHOLD 0.25&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Comparing edge threshold 0.125 (left) then 0.25 (right), &lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-C36dVONYJ-E/Tf_Xeeord_I/AAAAAAAAAQs/pCHNW4NADEk/s800/box-P-S8-T8.png"&gt; &lt;img src="https://lh3.googleusercontent.com/-yGPRfBKzYNs/Tf_W9_-YYxI/AAAAAAAAAP8/HCbh9EHNNXQ/s800/box-P-S8-T4.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-XB3931tTGlU/Tf_XCH-cHCI/AAAAAAAAAQE/YaZUeWCC0aI/box-P-S8-T4-2x.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Turning Off Early Exit On PS3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This saves 2 shader clock cycles on PS3, but will decrease non-edge sharpness as the algorithm starts acting like a directionally adaptive noise reduction filter!,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 8.0&lt;br /&gt;#define FXAA_EARLY_EXIT 0&lt;br /&gt;#define FXAA_PS3 1&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Early exit on (left), and off (right).&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-C36dVONYJ-E/Tf_Xeeord_I/AAAAAAAAAQs/pCHNW4NADEk/s800/box-P-S8-T8.png"&gt; &lt;img src="https://lh6.googleusercontent.com/-HIJVMA_462M/Tf_XTepR_II/AAAAAAAAAQc/aHOq9TtKAII/s800/box-P-S8-T4-NE.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/-exKYd_bsuXQ/Tf_XZEPKcoI/AAAAAAAAAQk/EsBcbmIZV5Y/box-P-S8-T4-NE-2x.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linear RGB vs Non-Linear RGB&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First off Linear only looks good with,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 8.0&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Linear RGB input tends to "bloom" bright areas outward where as non-linear RGB tends to maintain the dark thin features (this is a function of how the algorithm works). Yes technically linear is more correct, however given how hacky FXAA3 Console is, technically correct does not always yield the visually best results.&lt;br /&gt;&lt;br /&gt;Non-linear (left), and linear (right)&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/-C36dVONYJ-E/Tf_Xeeord_I/AAAAAAAAAQs/pCHNW4NADEk/s800/box-P-S8-T8.png"&gt; &lt;img src="https://lh3.googleusercontent.com/-OOw3DI9d2o4/Tf_WckuRGgI/AAAAAAAAAPE/NDR7QPtFZXI/s800/box-L-S8-T8.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Going Softer On Edges&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Believe these were the last defaults. When using non-linear RGB inputs can use,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 4.0&lt;br /&gt;#define FXAA_CONSOLE__EDGE_THRESHOLD 0.25&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Edge sharpness 8.0 (left), and 4.0 (right),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-yGPRfBKzYNs/Tf_W9_-YYxI/AAAAAAAAAP8/HCbh9EHNNXQ/s800/box-P-S8-T4.png"&gt; &lt;img src="https://lh3.googleusercontent.com/-I8SiTUEia8E/Tf_WqcyyCiI/AAAAAAAAAPc/a35LW_JZBn0/s800/box-P-S4-T4.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Going Softer Everywhere&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Perhaps if looking for a more film like look (even digital film is never sharp like a GPU rendered image),&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#define FXAA_CONSOLE__EDGE_SHARPNESS 4.0&lt;br /&gt;#define FXAA_CONSOLE__EDGE_THRESHOLD 0.125&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Edge sharpness 8.0 (left), and 4.0 (right),&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/-yGPRfBKzYNs/Tf_W9_-YYxI/AAAAAAAAAP8/HCbh9EHNNXQ/s800/box-P-S8-T4.png"&gt; &lt;img src="https://lh6.googleusercontent.com/-XuYqKy5nrpI/Tf_nx8rTHSI/AAAAAAAAARE/BDSOowJmvnU/s800/box-P-S4-T8.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;All Images&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/111290018550484579189/FxaaConsole3?authkey=Gv1sRgCJK6pePUq66w_gE&amp;feat=directlink"&gt;Picasa&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6475006984748523746?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6475006984748523746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-console-tuning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6475006984748523746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6475006984748523746'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-console-tuning.html' title='FXAA3 Console Tuning'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-H_d5jqdv1Ws/Tf_WIAihLMI/AAAAAAAAAOk/bpbyUyDuFx0/s72-c/box.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6872527837042333691</id><published>2011-06-20T08:17:00.000-07:00</published><updated>2011-06-20T08:18:18.162-07:00</updated><title type='text'>Xenoblade Tube</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/1CUNNyNK-4w" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6872527837042333691?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6872527837042333691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/xenoblade-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6872527837042333691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6872527837042333691'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/xenoblade-tube.html' title='Xenoblade Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/1CUNNyNK-4w/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2875841748834554294</id><published>2011-06-18T18:29:00.000-07:00</published><updated>2011-06-18T18:31:16.783-07:00</updated><title type='text'>Lighting Tree Leaves With Modified Normals</title><content type='html'>&lt;a href="http://oceanquigley.blogspot.com/2010/11/lighting-3d-trees.html"&gt;Lighting 3D Trees&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/BezAkq_N2Qg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2875841748834554294?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2875841748834554294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/lighting-tree-leaves-with-modified.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2875841748834554294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2875841748834554294'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/lighting-tree-leaves-with-modified.html' title='Lighting Tree Leaves With Modified Normals'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/BezAkq_N2Qg/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1118260370064716321</id><published>2011-06-11T09:09:00.000-07:00</published><updated>2011-06-11T10:24:05.814-07:00</updated><title type='text'>Optimizing the Linear Play-Through Game</title><content type='html'>&lt;i&gt;I would like a AAA studio targeting PC and PS3 (requires Blue Ray) to optimize for the interactive movie experience. Want a consistently awesome 10 hour &lt;b&gt;CG quality experience instead of game quality experience&lt;/b&gt; where the player controls the micro events in-between fixed big budget macro events: similar 3rd person gameplay as current linear titles like Uncharted, but from a director's camera. &lt;br /&gt;&lt;br /&gt;When, with many AAA titles, it is just as much fun to watch someone play through your game as it is to play through the game, this is hinting at something important. How about enable the player to be able to release the controls and have the fully scripted path take over, or where if the player sucks, the game takes over and makes the player not suck enough to keep the experience awesome. Why force frustrating replays? Other games already have the frustrating replay game mechanic nailed, and how many players of those games actually finish the game? Why have more choice in a linear game, how about less choice and more awesome. Want replay-ability? Who honestly replays linear games? Rather the studio reuse technology and asses and build another awesome new play-through from the perspective of another character in the same universe.&lt;br /&gt;&lt;br /&gt;Linear games should look substantially better than non-linear games.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Factor Out Rendering of Static Content&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Camera runs through a fixed linear play through, however local interactive elements are any range between fully dynamic and fully scripted. Camera is on a rail.  Opaque static geometry, background non-interactive visuals, and assets such as static shadow maps, light probes, environment maps, etc, are fully CG pre-rendered. The local GPU (+SPUs on PS3) are tasked only with rendering characters and dynamic objects, and compositing them with the pre-rendered streamed content.&lt;br /&gt;&lt;br /&gt;Blue Ray capacity, at the low end is 25GB, which is good for over 10 hours of video at 4 Mbits/sec.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Highly risky, but highly likely to be technically possible on current generation hardware...&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1118260370064716321?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1118260370064716321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/optimizing-linear-play-through-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1118260370064716321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1118260370064716321'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/optimizing-linear-play-through-game.html' title='Optimizing the Linear Play-Through Game'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6079318457598010899</id><published>2011-06-10T08:46:00.000-07:00</published><updated>2011-06-10T09:59:30.760-07:00</updated><title type='text'>FXAA3 Console Status Update 2</title><content type='html'>&lt;i&gt;Thanks again for everyone who has provided feedback for the FXAA3 preview!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adjusted the Console Algorithm Again&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA2 and FXAA3 Console applied to a wire frame image resulted in some artifacts at the center of intersecting lines. Also really wanted FXAA3 to not have a performance hit when using the sub-pixel AA contrast reduction.&lt;br /&gt;&lt;br /&gt;The solution to both problems was to make an adjustment to the 4 samples used for filtering. Prior solutions kept all 4 samples on the same line, picking either the first 2 close samples (for short edges) or all 4 samples (for longer edges) for the resulting box filter. The new solution uses different and simpler logic for choosing the positions of the first 2 close samples, and the last 2 far samples. Assuming this is the last adjustment, I'll be covering this in detail at the SIGGRAPH presentation. Note the slides which are on the DVD are now outdated.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tuning on PS3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Verified the limiting "speed of light" of the first version of the new algorithm as 13 shader clock cycles for NV4x/RSX (ALU bound). On a 7900 GT this limit is 1.11ms for a 720P frame. Was able to achieve 1.16ms in a sample GL app. NVIDIA's GLSL compiler path managed to get optimal instructions even before I verified with hand tuning. This early version did not contain the early exit code which resulted in some blurring on areas which needed no AA filtering.&lt;br /&gt;&lt;br /&gt;Then revised the algorithm adding back "early exit" in the form of a conditional mov. This added one cycle for a limit of 14 shader cycles. Estimated limiting speed of light on PS3 of around 1ms for 720p frame. To approach this limit, PS3 likely requires manual forcing a higher register count to get better texture cache performance though lower shader occupancy.&lt;br /&gt;&lt;br /&gt;Still have to verify PS3 compiler is getting correct instruction generation, but PS3 tuning is nearing its logical conclusion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tuning on 360&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The limiting speed of light for the non-early exit version is 8 texture fetches or 0.92ms. The early exit version adds an extra texture fetch, but has early exit after 5 texture fetches. Early profiling results before this latest algorithm were presenting with a measured 1.1ms for 720p (maybe ALU bound). Goal for 360 is under 1ms total.&lt;br /&gt;&lt;br /&gt;Note I'm doing at least 2 versions of the FXAA Console algorithm now: one for PS3 and one for 360, because of the differences in vector pipelines and branch performance of these 2 consoles. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The End Result of All This&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA3 should be around 1ms for 720p on either console, and using the same interface, has a higher quality PC version. FXAA3 Console on PS3 does not have the same long edge quality as Sony's MLAA, but overall FXAA3 costs significantly less, freeing up SPU time for things like tile deferred lighting, etc!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6079318457598010899?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6079318457598010899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-console-status-update-2.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6079318457598010899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6079318457598010899'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/fxaa3-console-status-update-2.html' title='FXAA3 Console Status Update 2'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7154130971947580365</id><published>2011-06-09T22:48:00.000-07:00</published><updated>2011-06-09T23:51:23.820-07:00</updated><title type='text'>Ideas for Unique Texturing After Rage</title><content type='html'>&lt;b&gt;Loss of Chroma&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Maybe just an artifact of double compression (compressed video of a game with highly compressed unique texturing)? Seems like the trade off between unique texturing and limited storage media is resulting in a loss of chroma. Low bit rate in the darks tends colors to push towards primary colors (red/green/blue), or secondaries  (magenta/yellow/cyan). Might also be amplified by quick transcoding not being able to get ideal dithering when recompressing to DXT, or lack of ability to have a scale and bias for each physical page to maximize bit utilization of DXT?  &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Would be awesome for another unique texturing title to go monochrome.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Maybe practical, is there a way to do a parallel friendly error diffusion dither during transcode, maybe using a more expensive two pass DXT compression? First pass normal compression, second pass doing a second compression, where each pixel adds in weighted error of first pass gathered from an eye-pleasing diffuse pattern?&lt;br /&gt;&lt;br /&gt;Also maybe practical, seems like the low-bit rate dark problem can be improved retroactively by artist managed color grading (seems like this is currently being used?), or proactively by allowing pages to have unique dequantization look up tables?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vector Quantization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;VQ is easily impractical for CPU based decoders because of the memory latency problem (look up tables are larger than cache sizes). Given that the GPU does not have this problem, would be very interested to take another look at using some form of vector quantization based GPU image decompression for virtual texturing. Would be ideal to be able to do simple VQ based transcoding from a pixel shader running in parallel with other normal graphics pixel shaders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7154130971947580365?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7154130971947580365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/ideas-for-unique-texturing-after-rage.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7154130971947580365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7154130971947580365'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/ideas-for-unique-texturing-after-rage.html' title='Ideas for Unique Texturing After Rage'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-123035796594141017</id><published>2011-06-09T19:07:00.001-07:00</published><updated>2011-06-09T22:36:26.434-07:00</updated><title type='text'>Prey2 E3 In-Game Footage</title><content type='html'>&lt;OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  WIDTH=640 HEIGHT=391 id="videoPlayer"&gt;&lt;PARAM NAME=movie VALUE="http://image.com.com/gamespot/images/cne_flash/production/eidothea/release/eidothea.swf?ver=008_11"&gt;&lt;PARAM NAME=scale VALUE="noScale"&gt;&lt;PARAM NAME=salign VALUE="lt"&gt;&lt;PARAM NAME=quality VALUE=high&gt;&lt;PARAM NAME=allowscriptaccess VALUE="always"&gt;&lt;PARAM NAME=allowFullScreen VALUE="true"&gt;&lt;PARAM NAME=flashvars VALUE="bwr=0&amp;playerMode=embedded&amp;movieAspect=16.9&amp;mapp=embedded_640&amp;gen=1&amp;viewMode=sd&amp;autoPlay=false&amp;paramsXML=http%3A%2F%2Fwww.gamespot.com%2Fpages%2Fvideo_player%2Fxml.php%3Fid%3D6318738%26mode%3Dembedded%26width%3D640%26height%3D391%26newplayer%3D1%26skin%3DeidotheaEmbedded640_169.xml"&gt;&lt;PARAM NAME=wmode VALUE="opaque"&gt;&lt;embed  id="mymovie"  width="640"  height="391" flashvars="bwr=0&amp;playerMode=embedded&amp;movieAspect=16.9&amp;mapp=embedded_640&amp;gen=1&amp;viewMode=sd&amp;autoPlay=false&amp;paramsXML=http%3A%2F%2Fwww.gamespot.com%2Fpages%2Fvideo_player%2Fxml.php%3Fid%3D6318738%26mode%3Dembedded%26width%3D640%26height%3D391%26newplayer%3D1%26skin%3DeidotheaEmbedded640_169.xml" wmode="opaque" allowscriptaccess="always" scale="noScale" salign="lt" allowFullScreen="true" quality="high" name="mymovie" style="" src="http://image.com.com/gamespot/images/cne_flash/production/eidothea/release/eidothea.swf?ver=008_11" type="application/x-shockwave-flash"/&gt;&lt;/embed&gt;&lt;/OBJECT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-123035796594141017?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/123035796594141017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/prey2-e3-in-game-footage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/123035796594141017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/123035796594141017'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/prey2-e3-in-game-footage.html' title='Prey2 E3 In-Game Footage'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7388664957238676095</id><published>2011-06-09T16:30:00.000-07:00</published><updated>2011-06-09T16:31:09.828-07:00</updated><title type='text'>PixelJunk Sidescroller E3 Tube</title><content type='html'>&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/mBgiPCClA64" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7388664957238676095?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7388664957238676095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/pixeljunk-sidescroller-e3-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7388664957238676095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7388664957238676095'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/pixeljunk-sidescroller-e3-tube.html' title='PixelJunk Sidescroller E3 Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/mBgiPCClA64/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4271581526410751403</id><published>2011-06-09T07:49:00.001-07:00</published><updated>2011-06-09T07:49:47.747-07:00</updated><title type='text'>Least Squares Vertex Baking</title><content type='html'>&lt;a href="http://www.jarmilakavanova.cz/ladislav/papers/vb-egsr11/vb-egsr11.pdf"&gt;Least Squares Vertex Baking&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4271581526410751403?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4271581526410751403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/least-squares-vertex-baking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4271581526410751403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4271581526410751403'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/least-squares-vertex-baking.html' title='Least Squares Vertex Baking'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2013832568175418333</id><published>2011-06-03T08:54:00.001-07:00</published><updated>2011-06-03T08:54:39.148-07:00</updated><title type='text'>Prey2 E3 2011 Trailer</title><content type='html'>&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/lP5w_4r8wo4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2013832568175418333?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2013832568175418333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/06/prey2-e3-2011-trailer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2013832568175418333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2013832568175418333'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/06/prey2-e3-2011-trailer.html' title='Prey2 E3 2011 Trailer'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/lP5w_4r8wo4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1704415935051350623</id><published>2011-05-30T16:00:00.001-07:00</published><updated>2011-05-30T16:26:51.385-07:00</updated><title type='text'>FXAA Console Status</title><content type='html'>Quick update on the FXAA Console Algorithm,&lt;br /&gt;&lt;br /&gt;Got console feedback for the FXAA2 and FXAA3 Console algorithm, working some serious re-optimization for consoles. PC: FXAA3 is faster than FXAA2, unfortunately not the case on consoles. On 360: FXAA2=1.3ms (TEX bound), FXAA3=1.5ms (ALU bound). On PS3: FXAA2=1.7ms and FXAA3=2.5ms, both massively ALU bound. Was expecting trouble on PS3 because the code was never vectorized, and PS3 compiler won't find all the transforms a human will. &lt;br /&gt;&lt;br /&gt;Plugged in a 7900 GT (an optimization proxy for PS3) and went to town on optimization for FXAA2. Timing progression with various code transforms. Numbers on a 720p frame.&lt;br /&gt;&lt;br /&gt;1.76 ms = FXAA2 baseline (from original post)&lt;br /&gt;1.50 ms = factoring out texture coordinate math to vertex shader&lt;br /&gt;1.24 ms = factoring + RGBL optimization&lt;br /&gt;1.23 ms = factoring + RGBL + transform ending "if" to conditional move&lt;br /&gt;1.17 ms = hand instruction vectorization, switching to dot products, etc &lt;br /&gt;&lt;br /&gt;Possible that PS3 ends up faster than 360 for FXAA2 with these new optimizations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FXAA3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FXAA3 is getting a new round of optimizations too. For PS3 expect FXAA3 will be a little slower (so far 0.16 ms slower) than FXAA2 because the FXAA3 early-exit or early-discard is a net loss on this platform. Still haven't fully optimized FXAA3 Console shader. For 360 not sure, need to double check if early-exit is a win after the hand vectorization.&lt;br /&gt;&lt;br /&gt;FXAA3 in final release will be including both the FXAA2 and FXAA3 optimized shaders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1704415935051350623?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1704415935051350623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/fxaa-console-status.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1704415935051350623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1704415935051350623'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/fxaa-console-status.html' title='FXAA Console Status'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1717466170546199307</id><published>2011-05-29T21:11:00.001-07:00</published><updated>2011-05-29T21:18:23.228-07:00</updated><title type='text'>Tegra 3 Glow Ball Demo</title><content type='html'>Good friends from the NVIDIA demo team built this demo,&lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="390" src="http://www.youtube.com/embed/eBvaDtshLY8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1717466170546199307?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1717466170546199307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/tegra-3-glow-ball-demo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1717466170546199307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1717466170546199307'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/tegra-3-glow-ball-demo.html' title='Tegra 3 Glow Ball Demo'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/eBvaDtshLY8/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-722006138075084379</id><published>2011-05-27T11:10:00.000-07:00</published><updated>2011-05-27T11:14:35.385-07:00</updated><title type='text'>BF3 Pure Awesomeness</title><content type='html'>Lit particles and dynamic lighting, &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.abload.de/img/bf3-2c8pk.gif"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-722006138075084379?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/722006138075084379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/bf3-pure-awesomeness.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/722006138075084379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/722006138075084379'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/bf3-pure-awesomeness.html' title='BF3 Pure Awesomeness'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8473013780885290719</id><published>2011-05-27T01:01:00.000-07:00</published><updated>2011-05-27T01:53:00.524-07:00</updated><title type='text'>FXAA 3 Status Update</title><content type='html'>&lt;b&gt;Linearly Correct&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Finally have FXAA working correctly in a linear color space: sRGB typed textures work amazingly well. Here is FXAA 3 Quality using linear color space processing one of my favorite hard-to-anti-alias sources: the beautiful pixel art from the Metal Slug series. &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh4.googleusercontent.com/-0gJWWQBeZ-Q/Td9ZgIEMEvI/AAAAAAAAAHI/VltqbfE7H2M/s800/slug1.png"&gt;&lt;br&gt;No FXAA&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh5.googleusercontent.com/-YD5ek5bxhLk/Td9ZY1mi4bI/AAAAAAAAAHE/ezogu8-iawM/s800/slug1-fxaa.png"&gt;&lt;br&gt;FXAA&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Console Perf&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Console perf with FXAA III is still an unknown, waiting on some more feedback and then another round of tuning before FXAA III is released. FXAA II performance has been reported by a few developers, with PS3 taking about 1.3x more time than Xbox360, which is to be expected. While PS3 has more texture performance, PS3's lack of unified shaders hurts when doing GPU post processing (pixel pipe only): FXAA II Console is likely ALU bound on PS3.&lt;br /&gt;&lt;br /&gt;FXAA III has an early exit path which FXAA II didn't have, this should improve performance, but FXAA III, as it is in the prototype stage, requires more ALU for pixels which don't early exit. Very curious about performance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4/3 Super-sample FXAA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Really like the results I'm getting with 4/3 Super-sample FXAA. The technique is simple, mocked up below on a crop from Mirror's Edge. Render 1.7x the number of total pixels as normal and without any anti-aliasing,&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh6.googleusercontent.com/-2fizk6Hy_xQ/Td9h6xj3i8I/AAAAAAAAAHM/irzWJle3O0M/s800/edge.png"&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then apply FXAA Quality, and down-sample by 3/4 in each direction to return to the target resolution,&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;center&gt;&lt;img src="https://lh3.googleusercontent.com/-2AvIYRO3JtE/Td9h_imB1-I/AAAAAAAAAHQ/J1a1_HiSDG0/s800/edge-fxaa.png"&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Image quality clearly increases with increased amount of super-sampling. With FXAA, the super-sampling can be fractional. Compared to deferred shading with super-sample lighting, I believe this fractional super-sampling + FXAA method will provide better quality results at a lower cost. &lt;br /&gt;&lt;br /&gt;This is ideal for me, since my preferred PC outputs are a small 720p HDTV and another 1080p 3D HDTV: want higher quality/pixel rather than crazy high resolutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8473013780885290719?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8473013780885290719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/fxaa-3-status-update.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8473013780885290719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8473013780885290719'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/fxaa-3-status-update.html' title='FXAA 3 Status Update'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-0gJWWQBeZ-Q/Td9ZgIEMEvI/AAAAAAAAAHI/VltqbfE7H2M/s72-c/slug1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1373930382517365</id><published>2011-05-13T10:34:00.000-07:00</published><updated>2011-05-13T14:15:21.342-07:00</updated><title type='text'>HDR24 Encoding</title><content type='html'>&lt;i&gt;In case this is useful for someone, I haven't had the time to explore this in practical applications yet...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Goal&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ALU is scaling faster than bandwidth: want a fast effectively linear 24-bit per pixel color framebuffer/texture encoding which has 8-bits free in the alpha channel for other usage (in my case a proxy for depth to avoid an extra depth buffer read). Encoding needs to not add artifacts during texture interpolation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Enter HDR24&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Using hardware sRGB support for linear2sRGB encode/decode, HDR24 encoding maintains data in 32-bit/pixel sRGB, but changes the meaning of some upper region of the displayable range of sRGB (for example, the top 1.0/8.0).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tonemapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Games use tonemapping in order to map a high dynamic range (HDR) into the the low dynamic range (LDR) of displayable sRGB values. However these mappings distort saturation and contrast across the entire displayable sRGB range. Here are a few resources,&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mynameismjp.wordpress.com/2010/04/30/a-closer-look-at-tone-mapping/"&gt;A Closer Look At Tone Mapping&lt;/a&gt;&lt;br /&gt;&lt;a href="http://filmicgames.com/archives/75"&gt;Filmic Tonemapping Operators&lt;/a&gt;&lt;br /&gt;&lt;a href="http://filmicgames.com/archives/183"&gt;Why Reinhard Desaturates Your Blacks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://filmicgames.com/archives/190"&gt;Why Filmic Curve Saturates Your Blacks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Often tonemapping is done after lighting right before post processing and this causes a mix of problems,&lt;br /&gt;&lt;br /&gt;(1.) Tonemapping alone is hard for an artist to control when tuning saturation and contrast.&lt;br /&gt;&lt;br /&gt;(2.) Tonemapping followed by Color Grading is hard to control because the Color Grading fights against the change done in Tonemapping.&lt;br /&gt;&lt;br /&gt;(3.) Post tonemapping, sRGB-to-linear fetched texels are no longer linear, post processing is not working in a linear color space.&lt;br /&gt;&lt;br /&gt;(4.) Game tonemapping clips to {1.0,1.0,1.0} white which removes any hints of clipped tint via white point color temp.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HDR24 Highlight Compression as Tonemapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;HDR24 takes a different approach. The idea is to leave a majority of the displayable range unadjusted, and to provide reversible highlight compression at the heel of the displayable range only. This way,&lt;br /&gt;&lt;br /&gt;(1.) Engine would do exposure adjustment on lit HDR data prior to conversion to HDR24. This insures colors are nearly at un-post-processed final output luminance.&lt;br /&gt;&lt;br /&gt;(2.) Post processing works effectively in a linear color space. With the exception of texture interpolation between texels in the compressed highlight area. Error which likely is not noticable anyway.&lt;br /&gt;&lt;br /&gt;(3.) After post processing is finished effectively in linear space, Color Grading can be applied. Effectively non-visible noise (+/- around one sRGB value) is added during HDR24 encoding, which should provide enough quality for Color Grading from 8-bit data.&lt;br /&gt;&lt;br /&gt;(4.) Noise is acceptable in the clipped HDR range. Clipped range always gets returned to small compressed area in highlights only. Noise will get filtered out, because post processing operators are effectively low-pass filters.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Visual Result&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Grabbed a linear 14-bit/channel Canon 5D Mark II photograph RAW file from &lt;a href="http://www.dpreview.com/"&gt;dpreview.com&lt;/a&gt; then used &lt;a href="http://www.cybercom.net/~dcoffin/dcraw/"&gt;dcraw&lt;/a&gt; to extract a 16-bit/channel raw image. Applied some contrast,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh5.googleusercontent.com/_U07JXw0AsDs/Tcx27EI8t4I/AAAAAAAAAFA/uX5VGEJltug/s800/Hdr24_Base.png"&gt;&lt;br /&gt;&lt;br /&gt;Then added some HDR over-exposure in the color channels. Here is non-tone-mapped and clipped LDR output, notice how clipped areas loose any hint of color temperature,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh4.googleusercontent.com/_U07JXw0AsDs/Tcx27B3voHI/AAAAAAAAAE4/s6zNMldw03g/s800/Hdr24_Clip.png"&gt;&lt;br /&gt;&lt;br /&gt;Same image encoded with HDR24. This example is using the upper 1.0/8.0 of the displayable linear range to compress the HDR range of 1.0-16.0. Note the highlight compression maintains a hint of the hue of a clipped color as can be see in white color temp. Highlight compression also softens the transition to overexposure, more like a real film exposure responce curve.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/_U07JXw0AsDs/Tcx27SGYaMI/AAAAAAAAAFQ/LW7Fl6mR9OE/s800/Hdr24_NoClip.png"&gt;&lt;br /&gt;&lt;br /&gt;Clearly after conversion to 8-bit LDR, all HDR information is normally lost. Here is the result of scaling the first clipped output by 1/16,&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh6.googleusercontent.com/_U07JXw0AsDs/Tcx27ToovII/AAAAAAAAAFE/P-88g0rqHsE/s800/Hdr24_ClipScale.png"&gt;&lt;br /&gt;&lt;br /&gt;However with HDR24 encoding, the mapping is semi-reversible. After readback from an 8-bit per channel framebuffer, the upper 1.0-16.0 linear range is noisy, but quite usable for post processing operations, as the saturation and luminance is maintained.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/_U07JXw0AsDs/Tcx27gJIt6I/AAAAAAAAAFM/c7RgYVdUVec/s800/Hdr24_NoClipScale.png"&gt;&lt;br /&gt;&lt;br /&gt;On the left is a simple 9-tap motion blur from LDR 8-bit/channel input (notice the typical desaturation caused by highlight clipping). On the right is the same using HDR24.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://lh3.googleusercontent.com/_U07JXw0AsDs/Tcx27J864gI/AAAAAAAAAE8/xzu9jISqnvo/s800/Hdr24_ClipMotion.png"&gt; &lt;img src="https://lh5.googleusercontent.com/_U07JXw0AsDs/Tcx27jIm-ZI/AAAAAAAAAFI/ukFSkBJY2Ls/s800/Hdr24_NoClipMotion.png"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Technical&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;HDR24 is configurable via two inputs:&lt;br /&gt;&lt;br /&gt;(1.) Supported HDR linear range (0-1 = LDR, 1-N = HDR).&lt;br /&gt;(2.) Amount of top displayable linear range to use for compression.&lt;br /&gt;&lt;br /&gt;The tonemapping operator is a Log2() curve starting where the derivative matches the 45deg slope of the unadjusted region (1/ln(2)), and compressed to fit in the user configurable compression region.&lt;br /&gt;&lt;br /&gt;Converting configurable options to constants required for operator,&lt;br /&gt;&lt;br /&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .1em;padding:.2em .6em;"&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;// EXAMPLE INPUTS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;paramRange&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;16.0f&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #8f5902; font-style: italic"&gt;// Supported HDR linear range.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;paramTop&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1.0f&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;8.0f&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #8f5902; font-style: italic"&gt;// Amount of top displayable linear range to use for compression.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;// INTERMEDIATES&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;log2deg45&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1.442695f&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #8f5902; font-style: italic"&gt;// 1/ln(2)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;begin&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;log2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;log2deg45&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;// OUTPUTS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1.0f&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;paramTop&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;log2deg45&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulC&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1.0f&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;log2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;paramRange&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;log2deg45&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;begin&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddC&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;constMul&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;begin&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulD&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1.0f&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;float&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddD&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;begin&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;constMulD&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Highlight compression,&lt;br /&gt;&lt;br /&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .1em;padding:.2em .6em;"&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;log2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;log2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;log2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddC&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Highlight decompression,&lt;br /&gt;&lt;br /&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .1em;padding:.2em .6em;"&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;exp2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;((&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;r&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;exp2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;((&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;g&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #204a87; font-weight: bold"&gt;if&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;constSplit&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;exp2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;((&lt;/span&gt;&lt;span style="color: #000000"&gt;color&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;b&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;constMulD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;constAddD&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;constStart&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Adding noise to the encoding before final output,&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Out of time, saving this for another post (fast noise without a texture lookup!)...&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1373930382517365?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1373930382517365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/hdr24-encoding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1373930382517365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1373930382517365'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/hdr24-encoding.html' title='HDR24 Encoding'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/_U07JXw0AsDs/Tcx27EI8t4I/AAAAAAAAAFA/uX5VGEJltug/s72-c/Hdr24_Base.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8237511136951155816</id><published>2011-05-05T17:31:00.000-07:00</published><updated>2011-05-05T17:32:23.203-07:00</updated><title type='text'>ARM PC on USB/HDMI Stick</title><content type='html'>&lt;a href="http://www.geek.com/articles/games/game-developer-david-braben-creates-a-usb-stick-pc-for-25-2011055/"&gt;ARM PC on USB/HDMI stick!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8237511136951155816?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8237511136951155816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/05/arm-pc-on-usbhdmi-stick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8237511136951155816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8237511136951155816'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/05/arm-pc-on-usbhdmi-stick.html' title='ARM PC on USB/HDMI Stick'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-5043046136911638657</id><published>2011-04-27T01:54:00.000-07:00</published><updated>2011-04-27T04:30:14.436-07:00</updated><title type='text'>GPU Point Based Rendering</title><content type='html'>&lt;i&gt;Rendering points?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Odd-Even Merge Sort&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Up until Fermi, triangle setup was limited by a serial path tied to the GPU clock rate. Recently, there has been an explosion of great demos, see &lt;a href="http://directtovideo.wordpress.com/"&gt;Matt Swoboda's work&lt;/a&gt; taking advantage of &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter46.html"&gt;Odd-Even Merge Sort&lt;/a&gt; to incrementally sort points on the GPU. There is also a bounded method to &lt;a href="http://www.iquilezles.org/www/articles/volumesort/volumesort.htm"&gt;pre-calculate the sortings&lt;/a&gt; for a static point cloud.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A2C&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Another option to sorting is alpha to coverage (A2C). Hardware A2C masks leave a lot to be desired (and yes, worse on AMD, guessing their pattern is a trick to increase utilization of bandwidth during stores?). With newer GPUs, &lt;a href="http://www.humus.name/index.php?page=Comments&amp;ID=230"&gt;software coverage mask&lt;/a&gt; can be generated in the shader to provide better dithering. Or alternatively the alpha value could be modified instead (works on older GPUs). &lt;a href="http://www.anandtech.com/show/2918/5"&gt;CSAA&lt;/a&gt; on NVIDIA hardware can greatly increase the quality for a given bandwidth. Temporal dithering could be placed under control with &lt;a href="http://timothylottes.blogspot.com/2011/04/tssaa-temporal-super-sampling-aa.html"&gt;temporal feedback&lt;/a&gt;. Also might want to give &lt;a href="http://enderton.org/eric/pub/StochasticTransparency_I3D2010.pdf"&gt;Stochastic Transparency&lt;/a&gt; a read for ideas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OIT&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A non-option (too expensive) is &lt;a href="https://graphics.stanford.edu/wikis/cs448s-10/FrontPage?action=AttachFile&amp;do=get&amp;target=CS448s-10-11-oit.pdf"&gt;AMD's Linked List OIT&lt;/a&gt;, or the next logical extension, &lt;a href="http://software.intel.com/en-us/articles/adaptive-transparency/"&gt;Adaptive Transparency&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Certainly these OIT ideas can be optimized (and likely will still be too expensive) by removing the linked list (removes bandwidth, memory, and atomic overhead) and instead maintaining a single counter per pixel and a fixed size array per pixel. Overflow problem can be dealt with stochastically. For instance, before incrementing the atomic counter to find array position, non-atomically read the counter, then based on the counter's position and the sample's alpha value, start tossing out low alpha samples. As the array fills up, start pruning at higher alpha values. Can add in a stochastic randomness to this. Could have objects or groups of points, frame incrementally sorted using odd-even merge sort to reduce the likely-hood of filling the array in the worst case back to front ordering. &lt;br /&gt;&lt;br /&gt;Or could go a step further, by removing the atomic, and just selecting a random position in the per pixel array to write to. The challenge of this method is that the ideal random position offset should be the same for a given SIMD grouping (or warp in CUDA) to avoid randomly hitting different cache lines, and also keeping point locality in a SIMD grouping. Note if doing this manually, clearly the arrays need to be interleaved in groups for cache coherency. Yes there will be collisions and dithering. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FreePipe&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/hmcen0921/cudarasterizer"&gt;FreePipe&lt;/a&gt; aims for correctness and still has good perf for tiny triangles. Global 32-bit minimum atomics used to simulate a z-buffer. Global atomics are much faster in Fermi compared to prior generation (GT200), however access patterns can have large effects on performance. Ultimately I suspect that global atomic performance could be a bottleneck if the amount of ALU and TEX/MEM per sample is low enough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Probabilistic Methods&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The aim here is to remove the usage of atomics, and instead take advantage the performance of direct global memory loads and stores, by engineering the algorithm such that there is a high probability that a read-modify-write cycle address collision is rare, or there is some inherent ability to converge to the correct results even in the presence of errors (perhaps temporally for real-time graphics).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"When the particle has been updated (or maybe respawned) it is rasterized into a 32 bit combined z and color buffer (11+7+7+7 bit). No hard sync on the zbuffer (ie it's just if (z &amp;lt zbuffer) zbuffer=z) , so it may be incorrect some places, but not very likely."&lt;/i&gt; - &lt;a href="http://forum.beyond3d.com/showpost.php?p=1546454&amp;postcount=1"&gt;Beyond3D post&lt;/a&gt; on the tech for the 4KB demo Michigan by Loonies. &lt;br /&gt;&lt;br /&gt;Given a larger address range for random accesses (and ideally block random accesses), the probability of access collision decreases (probability of needing atomics decreases). Certainly GPU architecture has a large effect on this with regards to access latency. The probability of a collision during a read-modify-write cycle decreases if the "modify" ALU instruction(s) are scheduled with only enough multitasking to hide any ALU latency. Clearly the "modify" code should not do any other memory transactions. &lt;br /&gt;&lt;br /&gt;Estimated ideal pattern for this kind of algorithm,&lt;br /&gt;&lt;br /&gt;(1.) Output array has a 2D surface style address layout instead of a linear layout. Use surface stores (or address calculation), or manually convert into a block linear address mapping where a block fits into a single cache line. &lt;br /&gt;&lt;br /&gt;(2.) SIMD groups (warps) randomly grab a group of neighboring points to draw. Note in this case collisions between items in this group have an unspecified ordering. &lt;br /&gt;&lt;br /&gt;(3.) Render into an image tree? Choose a level of the image hierarchy based on the projected radius of the point group distribution (SIMD group). This has two aims, first this is ideal for push-pull type hole filling, and second, this reduces the number of cache lines touched in a memory transaction. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bright Future&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Only scratching the surface of what can be done with parallel computing and &lt;a href="http://graphics.pixar.com/library/PointBasedGlobalIlluminationForMovieProduction/Slides.pdf"&gt;point based methods&lt;/a&gt; on GPUs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-5043046136911638657?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/5043046136911638657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/gpu-point-based-rendering.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5043046136911638657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/5043046136911638657'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/gpu-point-based-rendering.html' title='GPU Point Based Rendering'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-3327238274007225974</id><published>2011-04-27T00:57:00.000-07:00</published><updated>2011-04-27T00:59:42.593-07:00</updated><title type='text'>Api Trace GUI</title><content type='html'>&lt;a href="http://zrusin.blogspot.com/2011/04/apitrace.html?spref=tw"&gt;Api Trace GUI Post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-3327238274007225974?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/3327238274007225974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/api-trace-gui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3327238274007225974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/3327238274007225974'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/api-trace-gui.html' title='Api Trace GUI'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-4913342874317596973</id><published>2011-04-25T13:45:00.000-07:00</published><updated>2011-04-25T13:46:27.919-07:00</updated><title type='text'>More Revision 2011 Tubes</title><content type='html'>&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/_RgGWzosC48" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/OrqKuWfNF0E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/SGuA8V3B5oQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-4913342874317596973?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/4913342874317596973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/more-revision-2011-tubes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4913342874317596973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/4913342874317596973'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/more-revision-2011-tubes.html' title='More Revision 2011 Tubes'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/_RgGWzosC48/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8935102240264908863</id><published>2011-04-24T15:57:00.000-07:00</published><updated>2011-04-24T15:58:20.821-07:00</updated><title type='text'>Michigan a 4K intro by Loonies Tube</title><content type='html'>&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/Xci2kQsV7Cs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8935102240264908863?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8935102240264908863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/michigan-4k-intro-by-loonies-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8935102240264908863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8935102240264908863'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/michigan-4k-intro-by-loonies-tube.html' title='Michigan a 4K intro by Loonies Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Xci2kQsV7Cs/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1083203182770530991</id><published>2011-04-24T11:34:00.001-07:00</published><updated>2011-04-24T11:34:31.507-07:00</updated><title type='text'>CNCD &amp; Fairlight - Numb Res Tube</title><content type='html'>&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/LTOC_ajkRkU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1083203182770530991?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1083203182770530991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/cncd-fairlight-numb-res-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1083203182770530991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1083203182770530991'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/cncd-fairlight-numb-res-tube.html' title='CNCD &amp; Fairlight - Numb Res Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/LTOC_ajkRkU/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-2726367981990299980</id><published>2011-04-22T08:49:00.000-07:00</published><updated>2011-04-22T08:51:16.221-07:00</updated><title type='text'>Tri-Ace Tech Tube</title><content type='html'>&lt;a href="http://research.tri-ace.com/"&gt;Tri-Ace Research&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/6cuXgRVMvZ0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-2726367981990299980?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/2726367981990299980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tri-ace-tech-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2726367981990299980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/2726367981990299980'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tri-ace-tech-tube.html' title='Tri-Ace Tech Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/6cuXgRVMvZ0/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6667038036831340594</id><published>2011-04-19T12:07:00.000-07:00</published><updated>2011-04-19T12:12:40.367-07:00</updated><title type='text'>Voxatron</title><content type='html'>&lt;a href="http://www.lexaloffle.com/bbs/?uid=1"&gt;Blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="640" height="510" src="http://www.youtube.com/embed/epwh1qJVoB8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="640" height="510" src="http://www.youtube.com/embed/_q-xqI8Cm5A" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6667038036831340594?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6667038036831340594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/voxatron.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6667038036831340594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6667038036831340594'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/voxatron.html' title='Voxatron'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/epwh1qJVoB8/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1265349981473085534</id><published>2011-04-19T12:06:00.001-07:00</published><updated>2011-04-19T12:06:53.966-07:00</updated><title type='text'>WebGL Path Tracing</title><content type='html'>&lt;a href="http://madebyevan.com/webgl-path-tracing/"&gt;WebGL Path Tracing by Evan Wallace&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1265349981473085534?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1265349981473085534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/webgl-path-tracing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1265349981473085534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1265349981473085534'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/webgl-path-tracing.html' title='WebGL Path Tracing'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-920607579676409462</id><published>2011-04-14T13:04:00.000-07:00</published><updated>2011-04-14T13:06:43.657-07:00</updated><title type='text'>Inemeri IBL Tube</title><content type='html'>&lt;iframe title="YouTube video player" width="640" height="510" src="http://www.youtube.com/embed/YTFgwzx5ViA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://altdevblogaday.org/2011/04/14/simplifying-my-workflow/"&gt;Simplifying My Workflow Post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-920607579676409462?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/920607579676409462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/inemeri-ibl-tube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/920607579676409462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/920607579676409462'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/inemeri-ibl-tube.html' title='Inemeri IBL Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/YTFgwzx5ViA/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-1111308431133830700</id><published>2011-04-14T12:32:00.001-07:00</published><updated>2011-04-14T12:33:11.347-07:00</updated><title type='text'>The Hobbit Start of Production Tube</title><content type='html'>&lt;iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/FfesknLk5uI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-1111308431133830700?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/1111308431133830700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/hobbit-start-of-production-tube.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1111308431133830700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/1111308431133830700'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/hobbit-start-of-production-tube.html' title='The Hobbit Start of Production Tube'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/FfesknLk5uI/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-9141006394048955855</id><published>2011-04-11T09:27:00.000-07:00</published><updated>2011-04-11T09:29:11.375-07:00</updated><title type='text'>Speculative Contacts</title><content type='html'>&lt;a href="http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/"&gt;Speculative Contacts&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-9141006394048955855?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/9141006394048955855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/speculative-contacts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/9141006394048955855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/9141006394048955855'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/speculative-contacts.html' title='Speculative Contacts'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-9086039521271675043</id><published>2011-04-07T09:49:00.000-07:00</published><updated>2011-04-07T09:58:58.447-07:00</updated><title type='text'>Prey2 Concept Art + Screen Shot</title><content type='html'>&lt;img src="http://static.zenimax.com/bethblog/upload/2011/03/NordicsGamereactorMarchissue2.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/47857688@N08/5597986810/" title="Prey 2 City Concept by Bethesda Blog, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5069/5597986810_79201b61d8_z.jpg" width="640" height="278" alt="Prey 2 City Concept"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/47857688@N08/5598199064/" title="Prey 2 Screenshot by Bethesda Blog, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5187/5598199064_67d204a3d7_z.jpg" width="640" height="393" alt="Prey 2 Screenshot"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-9086039521271675043?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/9086039521271675043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/prey2-concept-art-screen-shot.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/9086039521271675043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/9086039521271675043'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/prey2-concept-art-screen-shot.html' title='Prey2 Concept Art + Screen Shot'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5069/5597986810_79201b61d8_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8786933509268051228</id><published>2011-04-04T12:44:00.000-07:00</published><updated>2011-04-04T12:47:23.219-07:00</updated><title type='text'>TSSAA prevPos Notes</title><content type='html'>A few options exist for generating the required "prevPos" input.&lt;br /&gt;&lt;br /&gt;NO REPROJECTION : Just set "prevPos.xy = posPos.xy". Result will be blurry in motion, and converge to high quality when motion stops. Not the best option, but could be a first step for integration.&lt;br /&gt;&lt;br /&gt;CAMERA BASED REPROJECTION ONLY : For each pixel, sample depth, compute the view space position, then transform to the projected view space position in the prior frame. Result will be blurry on objects which move at a different rate than the camera change. Might work ok.&lt;br /&gt;&lt;br /&gt;MOTION VECTOR BASED REPROJECTION : Best option. Compute reprojection position using the motion vector field which is used for motion blur, "prevPos.xy = posPos.xy - mv.xy". Motion vector field can easily be 1/2 or 1/4 screen resolution (better for texture cache). Motion vectors can be computed per fragment or per object, the TSSAA algorithm should be highly tolerant of incorrect or slightly off motion vectors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8786933509268051228?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8786933509268051228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tssaa-prevpos-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8786933509268051228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8786933509268051228'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tssaa-prevpos-notes.html' title='TSSAA prevPos Notes'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-6074649403244373887</id><published>2011-04-04T10:48:00.000-07:00</published><updated>2011-04-04T11:16:45.334-07:00</updated><title type='text'>An Unfinished AA Idea</title><content type='html'>&lt;i&gt;Posting another AA idea here which I didn't see through to completion, perhaps someone will find this useful for something...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Using a similar sample pattern to DLAA, grab the following 13 samples around the pixel center MM, where the spacing is {-7.5, -3.5, -1, 0, 1, 3.5, 7.5} pixels,&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;             N3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;             N2 &lt;br /&gt;&lt;br /&gt;             N1&lt;br /&gt;W3    W2  W1 MM E1  E2    E3 &lt;br /&gt;             S1&lt;br /&gt;&lt;br /&gt;             S2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;             S3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then compute horizontal and vertical blurs for 3 increasing larger widths in the vertical and horizontal direction,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;H1 = (W1 + MM*2.0 + E1) * 0.25&lt;br /&gt;V1 = (N1 + MM*2.0 + S1) * 0.25&lt;br /&gt;H2 = (W2 + H1*2.0 + E2) * 0.25&lt;br /&gt;V2 = (N2 + V1*2.0 + S2) * 0.25&lt;br /&gt;H3 = (W3 + H2*2.0 + E3) * 0.25&lt;br /&gt;V3 = (N3 + V2*2.0 + S3) * 0.25&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then for each {horizontal, vertical} pair of blurs for each width, choose the blur which results in the lower change from the center pixel (MM). For the given sets of edge lengths, this chooses correctly the blur direction. Note that each Bn might choose a different direction.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;B1 = (abs(H1.g - MM.g) &lt; abs(V1.g - MM.g)) ? H1 : V1&lt;br /&gt;B2 = (abs(H2.g - MM.g) &lt; abs(V2.g - MM.g)) ? H2 : V2&lt;br /&gt;B3 = (abs(H3.g - MM.g) &lt; abs(V3.g - MM.g)) ? H3 : V3&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then the unfinished part, compute weights for each Bn (without taking any more samples), and return a weighted sum,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;W1 = ?&lt;br /&gt;W2 = ?&lt;br /&gt;W3 = ?&lt;br /&gt;OUTPUT = (W1 * B1) + (W2 * B2) + (W3 * B3)&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-6074649403244373887?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/6074649403244373887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/unfinished-aa-idea.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6074649403244373887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/6074649403244373887'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/unfinished-aa-idea.html' title='An Unfinished AA Idea'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-8288605944498607420</id><published>2011-04-03T13:36:00.000-07:00</published><updated>2011-04-03T15:35:47.636-07:00</updated><title type='text'>TSSAA (Temporal Super-Sampling AA)</title><content type='html'>&lt;i&gt;Here is a prototype of Temporal Super-Sampling Anti-Aliasing which solves prior problems of ghosting and reprojection, while supporting quality around 8x SSAA.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This requires 11 32-bit texture fetches per pixel. Estimate cost around 1.7ms for a 1280x720 frame on Xbox360.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Screen Shots&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Images are ripped from a simple GL test app which uses a modified Unigine screenshot to texture. Images are presented 2x size. Second shot shows the extreme motion case (where TSSAA slightly blurs the image),&lt;br /&gt;&lt;br /&gt;&lt;div style="width:620px"&gt;&lt;img src="https://lh3.googleusercontent.com/_U07JXw0AsDs/TZjy9Io2I7I/AAAAAAAAACY/4U3bcFZzwh0/s800/Tssaa.png"&gt;&lt;center&gt;TSSAA without motion (16x sub-pixel jitter from below)&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:620px"&gt;&lt;img src="https://lh4.googleusercontent.com/_U07JXw0AsDs/TZjy9UlmSGI/AAAAAAAAACc/grCJ0Ixs8KY/s800/TssaaMotion.png"&gt;&lt;center&gt;TSSAA with fast motion (16x sub-pixel jitter from below)&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:620px"&gt;&lt;img src="https://lh5.googleusercontent.com/_U07JXw0AsDs/TZj1tBIExzI/AAAAAAAAAC0/a98qdypAuIQ/s800/TssaaNoAA.png"&gt;&lt;center&gt;No AA&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it Works&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yakiimo3D's &lt;a href="http://www.yakiimo3d.com/2010/09/28/dx11-perspective-matrix-jittering-temporal-aa/"&gt;DX11 Perspective Matrix Jittering Temporal AA&lt;/a&gt; is a good place to get some background on the Halo/Crysis method for temporal 2xSSAA, which is a similar but slightly different temporal AA method (combining samples instead of accumulating samples).&lt;br /&gt;&lt;br /&gt;This TSSAA algorithm reprojects the results from the prior TSSAA output frame. Then limits this reprojection by a smooth minimum and maximum color computed from the neighborhood of the pixel in the current frame. This limiter removes ghosting and other temporal artifacts caused by incorrect reprojection. The current pixel is accumulated with the limited reprojection using a simple falloff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Artifacts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(1.) Motion will tend to reduce sharpness a little. &lt;br /&gt;(2.) Fast exposure change exhibits light image erosion/dilation.&lt;br /&gt;(3.) Very thin sub-pixel details will still exhibit some temporal dithering. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantages Besides Super-Sampling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Haven't had the chance to test in a real game, so would really like to get some feedback if anyone tries this!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;TSSAA should remove shader jitter and noise (so should likely apply any film grain effects after TSSAA perhaps during write to back-buffer). In theory things like jittered shadowing, dithered DOF, dithered motion blur, and SSAO without blur will be partly cleaned up by TSSAA, but only if the noise is single pixel noise. Lower frequency noise likely will not get cleaned up as well.&lt;br /&gt;&lt;br /&gt;In theory TSSAA should work on transparent objects even if the object's motion vectors are not rendered into the motion vector field and used for reprojection offset. Might even work better when the typically sharper background motion vectors are used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Temporal Sub-pixel Shift&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When using this method, frames need to be drawn with a sub-pixel shift on the projection matrix (different offset for each frame). This is the same type of shift one would use when accumulating frames for a super-sampled AA "press-release" screen shot. Not sure what the best pattern is right now (haven't had the time to try all options). I have been using the following pattern for 4x,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;{-0.75,-0.25}, {-0.75,0.25}, {0.25,-0.75}, {-0.25,0.75}&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then for 16x adding in a different offset each 4 frames,&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;{-0.375,-0.125}, {0.375,0.125}, {0.125,-0.375}, {-0.125,0.375}&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Likely best to use a rotated grid pattern (like hardware AA) but distribute the samples temporally such that the distribution fills a pixel evenly temporally.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;When integrating with AFR Rendering&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Have not tried this with AFR, so this is only a best guess at how to integrate!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;For AFR rendering with two GPUs, integration will need to be adjusted. Instead of depending on the previous N-1 frame output, use the previous N-2 frame output. Then for computing the previous position, offset by the N frame motion vector * 2.0. The algorithm should work fine even if the reprojection vector isn't fully correct. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note, I've only tested the TSSAA_GLSL_130 path, everything else should work however...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This source is designed to work with the DX10/DX11/GL pixel position instead of the half offset DX9 position. Setting TSSAA_FALLOFF at 1/8 seems to have the best trade-off between sharpness during motion and reduction of temporal dithering. Setting TSSAA_SMOOTHER to zero will make the shader sharper during motion, but the algorithm will be less effective on edge AA on the borders of objects in motion on a non-moving background.&lt;br /&gt;&lt;br /&gt;Note this should be applied using non-HDR and non-sRGB inputs (towards the end of the post processing pipeline)!&lt;br /&gt;&lt;br /&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .1em;padding:.2em .6em;"&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*============================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                 TSSAA PROTOTYPE by TIMOTHY LOTTES @ NVIDIA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;============================================================================*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                               API PORTING&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;============================================================================*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#ifndef     TSSAA_GLSL_120&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_GLSL_120 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#ifndef     TSSAA_GLSL_130&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_GLSL_130 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#ifndef     TSSAA_HLSL_3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_HLSL_3 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#ifndef     TSSAA_HLSL_4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_HLSL_4 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#if TSSAA_GLSL_120&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #8f5902; font-style: italic"&gt;// Requires,&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #8f5902; font-style: italic"&gt;//  #version 120&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #8f5902; font-style: italic"&gt;//  #extension GL_EXT_gpu_shader4 : enable&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define int2 ivec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float2 vec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float3 vec3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float4 vec4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaInt2 ivec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaFloat2 vec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTex sampler2D&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexLod0(t, p) texture2DLod(t, p, 0.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#if TSSAA_GLSL_130&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #8f5902; font-style: italic"&gt;// Requires &amp;quot;#version 130&amp;quot; or better&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define int2 ivec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float2 vec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float3 vec3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define float4 vec4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaInt2 ivec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaFloat2 vec2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTex sampler2D&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexLod0(t, p) textureLod(t, p, 0.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#if TSSAA_HLSL_3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define int2 float2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaInt2 float2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaFloat2 float2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTex sampler2D&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexLod0(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#if TSSAA_HLSL_4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaInt2 int2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaFloat2 float2&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #204a87; font-weight: bold"&gt;struct&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTex&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;{&lt;/span&gt; &lt;span style="color: #000000"&gt;SamplerState&lt;/span&gt; &lt;span style="color: #000000"&gt;smpl&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #000000"&gt;Texture2D&lt;/span&gt; &lt;span style="color: #000000"&gt;tex&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexLod0(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TssaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*============================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                                VERTEX SHADER&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;============================================================================*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float4&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaVertexShader&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float2&lt;/span&gt; &lt;span style="color: #000000"&gt;pos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;                 &lt;span style="color: #8f5902; font-style: italic"&gt;// Both x and y range {-1.0 to 1.0 across screen}.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float2&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;{&lt;/span&gt;          &lt;span style="color: #8f5902; font-style: italic"&gt;// {1.0/frameWidth, 1.0/frameHeight}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float4&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;pos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #204a87; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                                PIXEL SHADER&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;                                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;============================================================================*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaPixelShader&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float4&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;     &lt;span style="color: #8f5902; font-style: italic"&gt;// TssaaVertexShader() output interpolated across screen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;TssaaTex&lt;/span&gt; &lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;  &lt;span style="color: #8f5902; font-style: italic"&gt;// Current frame before TSSAA.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;TssaaTex&lt;/span&gt; &lt;span style="color: #000000"&gt;texPrev&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;  &lt;span style="color: #8f5902; font-style: italic"&gt;// Previous TSSAA output.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float2&lt;/span&gt; &lt;span style="color: #000000"&gt;posPrev&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;    &lt;span style="color: #8f5902; font-style: italic"&gt;// Position of pixel in previous TSSAA output frame.   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000"&gt;float2&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;{&lt;/span&gt; &lt;span style="color: #8f5902; font-style: italic"&gt;// Constant {1.0/frameWidth, 1.0/frameHeight}.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_FALLOFF (1.0/8.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #define TSSAA_SMOOTHER 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #if TSSAA_SMOOTHER&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;zw&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;    #endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextN&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexLod0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextS&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexOff&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texNext&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPos&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaInt2&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;1&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;),&lt;/span&gt; &lt;span style="color: #000000"&gt;rcpFrame&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;prevM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;TssaaTexLod0&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;texPrev&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;posPrev&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;xy&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;).&lt;/span&gt;&lt;span style="color: #000000"&gt;xyz&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNN&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSS&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinH&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextNN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSS&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxH&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextNN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSS&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextWW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNW&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSW&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextEE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;nextNE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000"&gt;nextSE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinV&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextWW&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextEE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxV&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextWW&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextEE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinHV&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMinH&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinV&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxHV&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMaxH&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxV&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;)&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #0000cf; font-weight: bold"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinHVN&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMinHV&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxHVN&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMaxHV&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinWM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextW&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxWM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextW&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMFalloff&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;nextM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000"&gt;TSSAA_FALLOFF&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinSE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextS&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxSE&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextS&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinHVNWM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMinHVN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinWM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxHVNWM&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMaxHVN&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxWM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMin&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMinSE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMinHVNWM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000000"&gt;float3&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMax&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMaxSE&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMaxHVNWM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8f5902; font-style: italic"&gt;/*--------------------------------------------------------------------------*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #204a87; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #000000"&gt;nextMFalloff&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;+&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;min&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMax&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;max&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;nextMin&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;,&lt;/span&gt; &lt;span style="color: #000000"&gt;prevM&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;))&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;(&lt;/span&gt;&lt;span style="color: #0000cf; font-weight: bold"&gt;1.0&lt;/span&gt; &lt;span style="color: #ce5c00; font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #000000"&gt;TSSAA_FALLOFF&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold"&gt;));&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-8288605944498607420?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/8288605944498607420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tssaa-temporal-super-sampling-aa.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8288605944498607420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/8288605944498607420'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/tssaa-temporal-super-sampling-aa.html' title='TSSAA (Temporal Super-Sampling AA)'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/_U07JXw0AsDs/TZjy9Io2I7I/AAAAAAAAACY/4U3bcFZzwh0/s72-c/Tssaa.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-412309657486690750.post-7430534502412241168</id><published>2011-04-01T23:54:00.000-07:00</published><updated>2011-04-02T00:51:03.848-07:00</updated><title type='text'>Inemeri IBL</title><content type='html'>&lt;a href="http://www.inemeri.com/blog"&gt;Inemeri's&lt;/a&gt; IBL prototype is looking really good, a painterly lighting model complements the art style well. Not sure if they are using a down-sampled rendering result of the prior frame, if so, would be tempted on mobile devices to try rendering an even more low-poly version of the scene into a tiny render target, blurring, then using this as the IBL lighting source (instead of using the prior frame).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/412309657486690750-7430534502412241168?l=timothylottes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timothylottes.blogspot.com/feeds/7430534502412241168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://timothylottes.blogspot.com/2011/04/inemeri-ibl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7430534502412241168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/412309657486690750/posts/default/7430534502412241168'/><link rel='alternate' type='text/html' href='http://timothylottes.blogspot.com/2011/04/inemeri-ibl.html' title='Inemeri IBL'/><author><name>Timothy Lottes</name><uri>http://www.blogger.com/profile/04221161397691295747</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
