<?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-935410731531028523</id><updated>2012-02-01T20:57:21.529-05:00</updated><category term='Teaching'/><category term='GPU'/><category term='Writing Tips'/><category term='Book Reviews'/><category term='General'/><category term='Direct3D'/><category term='Linux'/><category term='Geometry Shaders'/><category term='Advice for Students'/><category term='Silhouettes'/><category term='WebGL'/><category term='Precision'/><category term='Terrain'/><category term='Multithreading'/><category term='NPR'/><category term='Vector Data'/><category term='Book Contents'/><category term='HTML5'/><category term='OpenGL'/><category term='Ray Casting'/><category term='SIGGRAPH'/><title type='text'>Virtual Globe and Terrain Rendering</title><subtitle type='html'>Real-time rendering with a focus on virtual globes and terrain.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1974961438363054720</id><published>2011-11-09T22:42:00.007-05:00</published><updated>2011-11-09T23:03:15.701-05:00</updated><title type='text'>OpenGlobe moved to GitHub</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-pKgFgSHLELg/TrtKLYETR3I/AAAAAAAAAGQ/YS82b7UA3Qw/s1600/github_logo_smaller.png"&gt;&lt;/a&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;OpenGlobe, the virtual globe 3D engine we developed for our &lt;a href="http://www.virtualglobebook.com"&gt;book&lt;/a&gt;, is now on &lt;a href="https://github.com/virtualglobebook/OpenGlobe"&gt;GitHub&lt;/a&gt;!&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/virtualglobebook/OpenGlobe"&gt;&lt;img style="width: 145px; height: 84px; cursor: pointer;" id="BLOGGER_PHOTO_ID_5673209824725523906" border="0" alt="" src="http://2.bp.blogspot.com/-B2N_YgvzLqs/TrtKRxMFXcI/AAAAAAAAAGc/9QoIijEWINE/s400/github_logo_smaller.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;We think GitHub is really cool because it makes it easy to collaborate on open source projects.  Please &lt;a href="http://help.github.com/fork-a-repo/"&gt;fork&lt;/a&gt; at will, and if you do something cool, send us a &lt;a href="http://help.github.com/send-pull-requests/"&gt;pull request&lt;/a&gt;.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1974961438363054720?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1974961438363054720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/11/openglobe-moved-to-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1974961438363054720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1974961438363054720'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/11/openglobe-moved-to-github.html' title='OpenGlobe moved to GitHub'/><author><name>Kevin Ring</name><uri>http://www.blogger.com/profile/06646223287468895533</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='24' src='http://3.bp.blogspot.com/_d5C3_Dbd94k/TLZdMKuGiAI/AAAAAAAAACg/JoOhQyXMhNE/S220/Blogger.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-B2N_YgvzLqs/TrtKRxMFXcI/AAAAAAAAAGc/9QoIijEWINE/s72-c/github_logo_smaller.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2365394956624008752</id><published>2011-10-17T21:00:00.000-04:00</published><updated>2011-10-25T20:37:05.199-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebGL'/><title type='text'>WebGL in Internet Explorer</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vAmHCkXNXL8/Tpxgzv0psxI/AAAAAAAABaA/6pgg7rA5Lds/s1600/ie.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="100" src="http://2.bp.blogspot.com/-vAmHCkXNXL8/Tpxgzv0psxI/AAAAAAAABaA/6pgg7rA5Lds/s200/ie.jpg" width="100" /&gt;&lt;/a&gt;&lt;/div&gt;Currently, even &lt;a href="http://msdn.microsoft.com/en-us/ie/gg192966.aspx"&gt;Internet Explorer 10&lt;/a&gt; will not support&amp;nbsp;&lt;a href="http://www.khronos.org/webgl/"&gt;WebGL&lt;/a&gt;.  Meanwhile, all the other &lt;a href="http://www.khronos.org/webgl/wiki/Getting_a_WebGL_Implementation"&gt;major browsers&lt;/a&gt; support this new standard.  I'm still confident that Microsoft will add WebGL support to IE, but as WebGL developers what can we do in the meantime?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/chrome/chromeframe/"&gt;Chrome Frame&lt;/a&gt; - an IE plugin that uses the Chrome engine to render web-pages that request so.  If an IE user has this plugin installed, all we need to do is include a single meta&amp;nbsp;tag in our WebGL-enabled pages:  &lt;pre&gt;&amp;lt;meta http-equiv="X-UA-Compatible" content="chrome=1"&amp;gt;&lt;/pre&gt;The major downside is Chrome Frame is a plugin, and, therefore, requires an install.&amp;nbsp;&amp;nbsp;However, we don't need &lt;a href="http://www.chromium.org/developers/how-tos/chrome-frame-getting-started/chrome-frame-faq#TOC-Google-Chrome-Frame-can-install-for"&gt;administer privileges&lt;/a&gt; to install Chrome Frame, making this option very attractive.&lt;/li&gt;&lt;li&gt;&lt;a href="http://iewebgl.com/"&gt;IEWebGL&lt;/a&gt; - an IE plugin that implements WebGL.  It is lightweight, and was fairly simple to port our large engine to.  Unlike Chrome Frame, IE's JavaScript engine still runs our JavaScript, and only the WebGL calls are forwarded to the plugin.  The advantage over Chrome Frame is the install is smaller.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/jebgl/"&gt;jebgl&lt;/a&gt; - uses a Java applet to emulate WebGL in IE by forwarding WebGL calls to&amp;nbsp;&lt;a href="http://jogamp.org/jogl/www/"&gt;JOGL&lt;/a&gt;.  This sounds really promising because it does not require installing a plugin.  Unfortunately, I have not been able to get it to work.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/sinisterchipmunk/webgl-compat"&gt;webgl-compat&lt;/a&gt; - a work-in-progress that implements WebGL with Canvas.  I can't imagine that this is going to perform well.  The first proof-of-concept rendered 25 rotating triangles at 42 fps without depth testing.  Today's hardware pushes billions of triangles per second.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/cwebgl/"&gt;cwebgl&lt;/a&gt; - implements WebGL using JavaScript and Canvas, similar to webgl-compat.  Again, I don't think this will meet the performance needs of most applications.&lt;/li&gt;&lt;/ul&gt;Today, I think our best bet is to use Chrome Frame.  It worked well in my tests, can be installed without admin privileges, and supports even IE6 (admittetly, I only tested using IE9).  Even when IE supports WebGL, we will need to consider these options for our users who can't upgrade right away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2365394956624008752?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2365394956624008752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/10/webgl-in-internet-explorer.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2365394956624008752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2365394956624008752'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/10/webgl-in-internet-explorer.html' title='WebGL in Internet Explorer'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vAmHCkXNXL8/Tpxgzv0psxI/AAAAAAAABaA/6pgg7rA5Lds/s72-c/ie.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-4598395398660234679</id><published>2011-09-26T20:00:00.000-04:00</published><updated>2011-09-26T20:00:01.508-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebGL'/><title type='text'>WebGL: GPU acceleration for the open web</title><content type='html'>&lt;p&gt;For the past six months, I've been developing with &lt;a href="http://www.khronos.org/webgl/"&gt;WebGL&lt;/a&gt; full-time.  Coming from C++, I was not exactly thrilled about the idea of doing web development and coding in JavaScript.  To my surprise, I really enjoy JavaScript, and the development tools are quite good.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.seas.upenn.edu/~kiderj/"&gt;Joe Kider&lt;/a&gt; kindly allowed me to share my enthusiasm for WebGL with his students in &lt;a href="http://www.seas.upenn.edu/~cis565/"&gt;CIS 565: GPU Programming and Architecture&lt;/a&gt; at the &lt;a href="http://www.upenn.edu/"&gt;University of Pennsylvania&lt;/a&gt;.  My talk focused on the motivation for WebGL; WebGL support in current desktop and mobile browsers; and basic JavaScript:&lt;/p&gt;&lt;p&gt;&lt;div style="width:425px" id="__ss_9432229"&gt;&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/9432229?rel=0" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/p&gt;Download the &lt;a href="http://www.slideshare.net/pjcozzi/webgl-gpu-acceleration-for-the-open-web/download"&gt;ppt&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-4598395398660234679?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/4598395398660234679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/09/webgl-gpu-acceleration-for-open-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4598395398660234679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4598395398660234679'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/09/webgl-gpu-acceleration-for-open-web.html' title='WebGL: GPU acceleration for the open web'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-28850273056915859</id><published>2011-09-05T11:37:00.000-04:00</published><updated>2011-09-05T11:37:19.054-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Advice for Students'/><title type='text'>The Google Resume Book Review</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/0470927623/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=0470927623" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;Format=_SL110_&amp;amp;ASIN=0470927623&amp;amp;MarketPlace=US&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;tag=virtua06a-20&amp;amp;ServiceVersion=20070822" /&gt;&lt;/a&gt;I'm not prepping for a job search, but I did just read &lt;a href="http://www.amazon.com/gp/product/0470927623/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0470927623"&gt;The Google Resume&lt;/a&gt; by &lt;a href="http://www.technologywoman.com/"&gt;Gayle Laakmann McDowell&lt;/a&gt;.  Gayle is a Penn alum (me too) so I wanted to check out one of her books.&lt;br /&gt;&lt;br /&gt;Overall, this is a really outstanding book on the entire hiring process process for technical jobs:  networking, career fairs, resumes, references, programming interviews, negotiating an offer, excelling once you are hired, etc.  It is useful for developers of all experience levels, but it will be most useful for undergraduate and masters students in computer science or a similar major. &amp;nbsp;Its technical focus makes it hit home more than the general advice given by a university's career services department.&lt;br /&gt;&lt;br /&gt;Being on both sides of the hiring process many times myself, I can say that the advice is practical and modern.  It also includes lots of stories, like a candidate who used himself as a reference, and when the author&amp;nbsp;interviewed with Microsoft.&lt;br /&gt;&lt;br /&gt;Some of the advice you've probably heard, and some you may not have.  The advice I like includes getting to know your professors; GPA isn't everything - excel at something; customize your resume for each company; keep your resume concise; use twitter for networking; have an online presence such as a blog,&amp;nbsp;portfolio, or active forum participation; your&amp;nbsp;initial&amp;nbsp;email is really a cover letter; focus on accomplishments over responsibilities; map out your career 7-10 years ahead; find a mentor; and build relationships.  There are also a number of subtle tips like watch what you write in an email because it may get forwarded (side note: I also recommend watching what you write about competitive works in a book proposal because it might get forwarded to the work's author.  I am two for two on this!).&lt;br /&gt;&lt;br /&gt;The chapter on programming interviews and the appendix on behavior questions are quite good.  There is a great section on approaches to algorithm design that is useful way beyond an interview.&lt;br /&gt;&lt;br /&gt;The section on evaluating an offer is great because it includes important considerations that I think many people ignore. &amp;nbsp;For example, we all consider location from the perspective of do we want to live there and cost of living, but do we consider if there will be other job&amp;nbsp;opportunities&amp;nbsp;there in the future? &amp;nbsp;Also, when looking at an offer, we should consider what the average annual raise is.&lt;br /&gt;&lt;br /&gt;This book is really&amp;nbsp;excellent, but if I had to critique a few minor things I would have liked to see more&amp;nbsp;emphasis&amp;nbsp;on contributing to open-source to gain project experience, especially considering that companies like Google and IBM contribute significantly. &amp;nbsp;The chapter on getting into gaming had lots of quotes but appeared to be less based on experience than the other chapters - and also focused more on social and casual games than AAA games that many people aspire to. &amp;nbsp;In fairness, an entire book could be written on gaming though.&lt;br /&gt;&lt;br /&gt;All in all, I really&amp;nbsp;recommend&amp;nbsp;this book, especially for students before they start searching for their first internship or co-op.&lt;br /&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0470927623&amp;amp;camp=217145&amp;amp;creative=399373" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;br /&gt;&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/935410731531028523-28850273056915859?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/28850273056915859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/09/google-resume-book-review.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/28850273056915859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/28850273056915859'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/09/google-resume-book-review.html' title='The Google Resume Book Review'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-3276829530477656066</id><published>2011-08-22T07:00:00.004-04:00</published><updated>2011-09-13T08:41:52.915-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Electronic Version of Our Book</title><content type='html'>We have had several requests for an electronic version of our &lt;a href="http://www.virtualglobebook.com/"&gt;virtual globe book&lt;/a&gt;. &amp;nbsp;I'm happy to say that it is now available&amp;nbsp;&lt;a href="http://store.vitalsource.com/show/9781439891926"&gt;on VitalSource&lt;/a&gt;. &amp;nbsp;You can read it on your desktop or transfer it to your iPhone, iPad, or iPod Touch. &amp;nbsp;This electronic version is discounted, and there are rental options that cost even less. &amp;nbsp;Pretty cool.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ut1_6S02E9k/TkkMbEJwy2I/AAAAAAAABZ0/zXR9AQiksX0/s1600/VitalSource.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://3.bp.blogspot.com/-Ut1_6S02E9k/TkkMbEJwy2I/AAAAAAAABZ0/zXR9AQiksX0/s400/VitalSource.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;em&gt;Update&lt;/em&gt;:  Unfortunately, VitalSource only accepts credit cards from the US and Canada because of rights issues with some publishers.  Our publisher, &lt;a href="http://www.crcpress.com/"&gt;CRC Press&lt;/a&gt;, is working on a new website that will solve this problem.  We'll keep you posted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-3276829530477656066?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/3276829530477656066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/electronic-version-of-our-book.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3276829530477656066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3276829530477656066'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/electronic-version-of-our-book.html' title='Electronic Version of Our Book'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Ut1_6S02E9k/TkkMbEJwy2I/AAAAAAAABZ0/zXR9AQiksX0/s72-c/VitalSource.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1061832843118117956</id><published>2011-08-14T22:32:00.002-04:00</published><updated>2011-08-15T19:45:52.929-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='WebGL'/><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>SIGGRAPH 2011 Trip Report:  Day Five</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2CwJqjSZKyM/TkRcxwyd4RI/AAAAAAAABZQ/XnYsdvPGKio/s1600/IMAG0182.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;a href="http://1.bp.blogspot.com/-2CwJqjSZKyM/TkRcxwyd4RI/AAAAAAAABZQ/XnYsdvPGKio/s1600/IMAG0182.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2CwJqjSZKyM/TkRcxwyd4RI/AAAAAAAABZQ/XnYsdvPGKio/s1600/IMAG0182.jpg" imageanchor="1" style="clear: right; display: inline !important; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="191" src="http://1.bp.blogspot.com/-2CwJqjSZKyM/TkRcxwyd4RI/AAAAAAAABZQ/XnYsdvPGKio/s320/IMAG0182.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I spent the morning in the &lt;a href="http://www.khronos.org/developers/library/2011-siggraph-mobile-bof"&gt;Mobile BOF&lt;/a&gt;.  One theme I am very happy with is that using HTML5, including WebGL, sounds like a viable strategy for targeting mobile devices.  In his &lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011-siggraph-mobile/OpenGL-ES-and-Mobile-Trends_Aug-11.pdf"&gt;talk&lt;/a&gt;, &lt;a href="http://jonpeddie.com/"&gt;Jon Peddie&lt;/a&gt; predicted HTML5 will have 100% penetration on mobile platforms by late 2012.  In all fairness, flash already has 100%.  Jon's claim, which was echoed elsewhere during the conference, is that WebGL's biggest problem will be misinformation, not technical.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Neil_Trevett"&gt;Neil Trevett&lt;/a&gt; also highlighted WebGL in his &lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011-siggraph-mobile/Khronos-and-the-Mobile-Ecosystem_Aug-11.pdf"&gt;talk&lt;/a&gt;, which included a demo of the &lt;a href="http://webglsamples.googlecode.com/hg/aquarium/aquarium.html"&gt;WebGL Aquarium&lt;/a&gt; with 100 fish running on a Tegra 2 tablet!  This was an early, pre-optimized WebGL implementation in WebKit on Android, but it is very promising.&lt;br /&gt;&lt;br /&gt;Someone brought up an interesting question: if we develop in HTML5 instead of native apps, how is Apple, who makes a lot of money through their App Store, going to respond?  Are they going to treat it like they &lt;a href="http://www.pcmag.com/article2/0,2817,2368965,00.asp"&gt;did flash&lt;/a&gt;?  I don't recall how this was answered, but my take on it is Apple will have to allow it; otherwise, consumers will reject Apple's products if HTML5 is not supported.  HTML5 is not some corner-case technology; &lt;em&gt;it is the web&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;There were several other great presentations at the BOF, but my favorite was &lt;a href="http://www.linkedin.com/pub/tom-olson/2/512/769"&gt;Tom Olson&lt;/a&gt;'s talk on &lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011-siggraph-mobile/Writing-Portable-OpenGL-ES-2.0_Aug-11.pdf"&gt;writing portable OpenGL ES 2 code&lt;/a&gt; (similar &lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011_GDC_Mobile/Writing-Portable-OpenGL-ES-2-0_GDC-Mar11.pdf"&gt;GDC 2011 slides&lt;/a&gt;).  Between this talk and &lt;a href="http://aras-p.info/"&gt;Aras Pranckevičius&lt;/a&gt;' talk &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;earlier in the week&lt;/a&gt;, I really gained an appreciation for targeting multiple mobile devices.  Although mobile segmentation is better than it use to be, there are still several different operating systems and a wide array of hardware with varying performance.&lt;br /&gt;&lt;br /&gt;Just like in desktop OpenGL, OpenGL ES has implementation-dependent limits like number of vertex attributes and number of textures.  In my own code, I usually try to stay within these limits by doing things like packing multiple values into a single vertex attribute.  In Tom's talk, I also learned that the precision qualifiers can cause cross-platform issues.  &lt;code&gt;lowp&lt;/code&gt; guarantees at least 10-bits, &lt;code&gt;mediump&lt;/code&gt; guarantees 16, and &lt;code&gt;highp&lt;/code&gt; guarantees 24.  This sounds OK at first, except that some platforms may always use 32-bits, so if we only test on these platforms, we never test with lower precision.  In addition, &lt;code&gt;highp&lt;/code&gt; isn't always supported in fragment shaders; some platforms will silently ignore it, and others will fail to compile the shader.  Ugh.  This reminds me of shaders that compile with warnings on NVIDIA, and fail to compile on AMD.&lt;br /&gt;&lt;br /&gt;It sounds like some platform-compatibility problems can be solved by cleaning up drivers, and others can be solved by cleaning up the specification.  Tom noted that the spec doesn't say what to do with bad code.  For example, what does divide-by-zero yield?  Nan?  Infinite?  Zero?&lt;br /&gt;&lt;br /&gt;Overall, this was a great BOF.  I want to thank Tom Olson for organizing it, and for giving me a time-slot to announce the call for authors for &lt;a href="http://www.openglinsights.com/"&gt;OpenGL Insights&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Books&lt;/h2&gt;&lt;a href="http://www.amazon.com/Real-Time-Shadows-Elmar-Eisemann/dp/1568814380?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"&gt;&lt;img alt="Real-Time Shadows" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=1568814380&amp;amp;tag=virtua06a-20" /&gt;&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814380" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;br /&gt;No SIGGRAPH would be complete without checking out all the new books.  For starters, &lt;a href="http://www.amazon.com/Real-Time-Shadows-Elmar-Eisemann/dp/1568814380?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Real-Time Shadows&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814380" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; by &lt;a href="http://artis.imag.fr/Members/Elmar.Eisemann/"&gt;Elmar Eisemann&lt;/a&gt;, &lt;a href="http://www.mpi-inf.mpg.de/~mschwarz/"&gt;Michael Schwarz&lt;/a&gt;, &lt;a href="http://www.cse.chalmers.se/~uffe/"&gt;Ulf Assarsson&lt;/a&gt;, and &lt;a href="http://www.cg.tuwien.ac.at/staff/MichaelWimmer.html"&gt;Michael Wimmer&lt;/a&gt; is out, and looks excellent.  At first glance, techniques like shadow mapping and shadow volumes seem simple, but the devil is in the details; efficient, robust implementations that yield high visual quality are quite difficult.  Therefore, a lot can be said about shadows even though it is a sub-field of real-time rendering, which is a sub-field of rendering, which is a sub-field of computer graphics, which is a sub-field of computer science, etc.&lt;br /&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814380" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;I was also happy to see proofs for the second edition of &lt;a href="http://www.amazon.com/Graphics-Shaders-Theory-Practice-Second/dp/1568814348?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Graphics Shaders: Theory and Practice&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814348" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; by &lt;a href="http://web.engr.oregonstate.edu/~mjb/WebMjb/mjb.html"&gt;Mike Bailey&lt;/a&gt; and &lt;a href="http://www.cs.csustan.edu/~rsc/"&gt;Steve Cunningham&lt;/a&gt;.  I am a huge fan of the first edition and am glad to see the second edition is updated for OpenGL 4.  However, I was surprised to see that immediate mode, built-in vertex attributes, and built-in uniforms were still used in the example code.  Perhaps the code will be updated before the book is printed.&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568813341" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Graphics-Game-Programming-JungHyun-Han/dp/1439827370?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="3D Graphics for Game Programming" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=1439827370&amp;amp;tag=virtua06a-20" /&gt;&lt;/a&gt;I'm also excited about two intro graphics books that I browsed during the conference.  I like to go over the&amp;nbsp;fundamentals&amp;nbsp;once in a while because it keeps me somewhat broad, fills gaps (and I have plenty of them!), and seeing material over again from a different perspective is a great way to deepen knowledge.  &lt;a href="http://www.amazon.com/Graphics-Game-Programming-JungHyun-Han/dp/1439827370?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;3D Graphics for Game Programming&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1439827370" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; by JungHyun Han looks like a pragmatic, concise introduction to graphics.&lt;br /&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1439827370" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;I was pleasantly surprised to see a partial draft of the 3rd edition of the classic &lt;a href="http://www.amazon.com/Computer-Graphics-Principles-Practice-3rd/dp/0321399528?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Computer Graphics: Principles and Practice (3rd Edition)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0321399528" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; by &lt;a href="http://www.cc.gatech.edu/fac/Jim.Foley/foley.html"&gt;James Foley&lt;/a&gt;, &lt;a href="http://www.cs.brown.edu/~avd/"&gt;Andries van Dam&lt;/a&gt;, &lt;a href="http://www.cs.columbia.edu/~feiner/"&gt;Steven Feiner&lt;/a&gt;, and &lt;a href="http://www.cs.brown.edu/people/faculty/jfh.html"&gt;John Hughes&lt;/a&gt;.  At almost 1800 pages, this thing is heavy and appears to cover just about every topic in computer graphics, from 2D with WPF to GPU architecture with an NVIDIA GeoForce GTX 9800 case-study.  I am definitently getting a copy of this when it comes out (March 2012 according to Amazon), but reading it cover-to-cover is going to take some effort.&lt;br /&gt;&lt;a href="http://www.amazon.com/3D-Engine-Design-Virtual-Globes/dp/1568817118?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"&gt;&lt;img alt="3D Engine Design for Virtual Globes" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=1568817118&amp;amp;tag=virtua06a-20" /&gt;&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568817118" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;Of course, our book, &lt;a href="http://www.amazon.com/3D-Engine-Design-Virtual-Globes/dp/1568817118?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;3D Engine Design for Virtual Globes&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568817118" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, was also new this SIGGRAPH.  I was happy to meet many people who were excited about it, and glad to hear that it was selling well.  I'm taking my 75 cents to Vegas.  Kevin is risking his in biomedical startups.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Final Thoughts&lt;/h2&gt;&lt;br /&gt;This was my fourth SIGGRAPH; each one keeps getting better.  I didn't spend as much time in courses as I usually do, but I enjoyed many BOFs and met several people submitting to &lt;a href="http://www.openglinsights.com/"&gt;OpenGL Insights&lt;/a&gt;.  As I said after attending &lt;a href="http://blogs.agi.com/insight3d/index.php/2008/08/18/siggraph-2008-trip-report/"&gt;my first SIGGRAPH&lt;/a&gt;, SIGGRAPH is all about meeting people and sharing ideas.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tp2Mpp957Hs/TkRcAJqSfOI/AAAAAAAABZM/NHOiuKz3u0Q/s1600/IMAG0172.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://1.bp.blogspot.com/-tp2Mpp957Hs/TkRcAJqSfOI/AAAAAAAABZM/NHOiuKz3u0Q/s400/IMAG0172.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Full SIGGRAPH Trip Report:  day &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html"&gt;one&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;two&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;three&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html"&gt;four&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html"&gt;five&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1061832843118117956?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1061832843118117956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1061832843118117956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1061832843118117956'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html' title='SIGGRAPH 2011 Trip Report:  Day Five'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2CwJqjSZKyM/TkRcxwyd4RI/AAAAAAAABZQ/XnYsdvPGKio/s72-c/IMAG0182.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7414518762222113717</id><published>2011-08-14T22:31:00.002-04:00</published><updated>2011-08-18T19:48:11.180-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebGL'/><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>SIGGRAPH 2011 Trip Report:  Day Four</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-o4fUs0Suf0c/TkgYUWZvE1I/AAAAAAAABZU/nclf5c74PAs/s1600/IMAG0184.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-o4fUs0Suf0c/TkgYUWZvE1I/AAAAAAAABZU/nclf5c74PAs/s320/IMAG0184.jpg" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;Today had two very important events: &amp;nbsp;the &lt;a href="http://www.khronos.org/webgl/wiki_1_15/index.php/Presentations"&gt;WebGL BOF&lt;/a&gt; and the &lt;a href="http://www.khronos.org/developers/library/2011-siggraph-opengl-bof"&gt;OpenGL BOF&lt;/a&gt;. Over the past six months, I have been developing with WebGL full-time, so I have been watching it closely (mainly through the &lt;a href="http://www.webglcamp.com/"&gt;WebGL Camps&lt;/a&gt; and Gile's &lt;a href="http://learningwebgl.com/blog/"&gt;Learning WebGL&lt;/a&gt; blog). The WebGL BOF exceeded my already high expectations; it was standing room only and even people outside of the room were trying to peak their heads in. There was a bit of news and &lt;i&gt;lots&lt;/i&gt; of demos.&lt;br /&gt;&lt;br /&gt;WebGL 1.0.1 is expected to be out in the fall to cover some corner-cases. We can also expect compressed textures soon &amp;nbsp;The most exciting news is that &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/complete/workers.html"&gt;web workers&lt;/a&gt; will be able to pass &lt;a href="http://www.khronos.org/registry/typedarray/specs/latest/"&gt;typed arrays&lt;/a&gt; without cloning them! &amp;nbsp;We'll have to see how fast it is, but this will make web workers much more useful and&amp;nbsp;suitable&amp;nbsp;for a wider array of tasks like computing bounding volumes and vertex cache optimization, since hopefully thread communication overhead will not be the bottleneck. Even more interesting is that Microsoft worked on this specification. Perhaps they are adding WebGL support to IE. If they want to continue to be a player, I don't see how they will not support WebGL.&lt;br /&gt;&lt;br /&gt;The BOF was full of exciting demos, which are on the &lt;a href="http://www.khronos.org/webgl/wiki_1_15/index.php/Presentations"&gt;WebGL Wiki&lt;/a&gt;. I'll highlight a few that I really enjoyed. Ken Russell showed a 3D cloth simulation used to &lt;a href="http://dev.chromium.org/developers/design-documents/extensions/offscreen-tabs"&gt;flip through Chrome tabs&lt;/a&gt;&amp;nbsp;written by a few Google interns. Very cool.&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Neil_Trevett"&gt;Neil Trevett&lt;/a&gt; showed the &lt;a href="http://webglsamples.googlecode.com/hg/aquarium/aquarium.html"&gt;WebGL Aquarium demo&lt;/a&gt; running on a Xoom Tablet using a to-be-released version of the native browser. This is super-important to me because we are banking on using WebGL to target both cross-platform desktop and mobile devices.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.danks.org/mark/"&gt;Mark Danks&lt;/a&gt; demoed &lt;a href="http://www.myrobotnation.com/"&gt;My Robot Nation&lt;/a&gt;, which is a creative business-idea combing WebGL and 3D printing. Users model a robot using a WebGL application. A full-color 3D-printed version of the robot can then be ordered. Pricing wasn't discussed, but I wonder if this will be cheap enough to get wind-spread adoption among our youth. Mark discussed some interesting implementation details, including that the robot's mesh is never actually stored. Instead, the commands to recreate the robot are stored, which can be used to generate the rendering and 3D-printing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/emoller/blog/"&gt;Erik Möller&lt;/a&gt; gave an excellent &lt;a href="http://www.khronos.org/webgl/wiki_1_15/images/WebGL-game-platform.pdf"&gt;talk&lt;/a&gt; and &lt;a href="http://operasoftware.github.com/Emberwind/"&gt;demo&lt;/a&gt; on using WebGL and HTML as a game platform. Erik works for &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt;, whose browser only has 2-3% market-share, but is used on the Nintendo Wii and has more than 20% market-share on mobile devices. He discussed a platform game developed in&amp;nbsp;HTML5, &lt;a href="http://operasoftware.github.com/Emberwind/"&gt;Emberwind&lt;/a&gt;, developed by three summer interns (full&amp;nbsp;&lt;a href="http://www.timetrap.se/emberwind/"&gt;original&amp;nbsp;version&lt;/a&gt;). It has the very handy feature of being able to switch between Canvas 2D and WebGL for rendering, showing WebGL to be significantly faster. Some numbers I saw showed Canvas 2D at 15 fps and WebGL above 60 fps. Part of this was due to batching draw calls together in WebGL using a texture atlas. Erik made the excellent point that WebGL has a higher barrier to entry but allows more flexibility.&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eYw8GzeHeCs/TkgYamHuaII/AAAAAAAABZY/gXrIDabCyY8/s1600/IMAG0155.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-eYw8GzeHeCs/TkgYamHuaII/AAAAAAAABZY/gXrIDabCyY8/s320/IMAG0155.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This bird&amp;nbsp;smelled&amp;nbsp;my English Muffin&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The BOF included several other exciting demos, including the &lt;a href="https://brainbrowser.cbrain.mcgill.ca/"&gt;BrainBrowser&lt;/a&gt; by&amp;nbsp;&lt;a href="http://www.linkedin.com/pub/nicolas-kassis/7/1a2/2b7"&gt;Nicolas Kassis&lt;/a&gt;, which uses &lt;a href="http://www.w3.org/TR/XMLHttpRequest2/"&gt;XHR2&lt;/a&gt; for&amp;nbsp;transferring&amp;nbsp;binary data over HTTP; &lt;a href="http://senchalabs.github.com/philogl/"&gt;PhiloGL&lt;/a&gt; by&amp;nbsp;Nicolas Garcia Belmonte; and&amp;nbsp;&lt;a href="http://chrysaora.com/"&gt;Chrysaora&lt;/a&gt; by&amp;nbsp;&lt;a href="http://aleksandarrodic.com/"&gt;Aleksandar Rodic&lt;/a&gt;, which is doing the bone simulation on the server. See the &lt;a href="http://www.khronos.org/webgl/wiki_1_15/index.php/Presentations"&gt;wiki&lt;/a&gt; for the full list of talks and demos. I want to thank Ken Russell for organizing an awesome event and for giving me a time-slot to announce the call for authors for &lt;a href="http://www.openglinsights.com/"&gt;OpenGL Insights&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.khronos.org/developers/library/2011-siggraph-opengl-bof"&gt;OpenGL BOF&lt;/a&gt; was also excellent this year. Of course, the big news was the release of &lt;a href="http://www.opengl.org/registry/doc/glspec42.core.20110808.withchanges.pdf"&gt;OpenGL 4.2&lt;/a&gt;. This release has a number of new features that expose hardware features, including &lt;a href="http://www.opengl.org/registry/specs/ARB/shader_atomic_counters.txt"&gt;ARB_shader_atomic_counters&lt;/a&gt; and &lt;a href="http://www.opengl.org/registry/specs/ARB/shader_image_load_store.txt"&gt;ARB_shader_image_load_store&lt;/a&gt;. Both of which allow shader instances to communicate to some extent.&amp;nbsp;&lt;i&gt;Shaders can now have side-effects&lt;/i&gt;. GLSL shaders are starting to feel an&amp;nbsp;awful&amp;nbsp;lot like CUDA (and OpenCL) kernels.&lt;br /&gt;&lt;br /&gt;GL 4.2 also introduces &lt;a href="http://www.opengl.org/registry/specs/ARB/texture_storage.txt"&gt;ARB_texture_storage&lt;/a&gt;, which helps guarantee a texture is complete. This reminds me of using templates for immutability in &lt;a href="http://www.opengl.org/pipeline/article/vol003_4/"&gt;Longs Peak&lt;/a&gt;. I'm glad to see those API designs making their way into OpenGL. For much, much more information on GL 4.2, check out Christophe Riccio's &lt;a href="http://www.g-truc.net/post-0414.html"&gt;review&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In other OpenGL news, a version of the conformance test suite for OpenGL 3.3 and selected extensions is expected to be complete in November. GL drivers have been getting much better in recent years, and this test suite is a huge step in the right direction. In his &lt;a href="http://www.khronos.org/assets/uploads/developers/library/2011-siggraph-opengl-bof/OpenGL-Ecosystem.pdf"&gt;ecosystem update&lt;/a&gt;, Jon Leech also mentioned they are tidying up the spec to have less undefined-behavior. I want to thank him for mentioning our call for authors for &lt;a href="http://www.openglinsights.com/"&gt;OpenGL Insights&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The BOF ended with an excellent talk, &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;, by&amp;nbsp;&lt;a href="https://twitter.com/#!/pixelmager"&gt;Mikkel Gjøl&lt;/a&gt;. He described the rendering in &lt;a href="http://www.splashdamage.com/"&gt;Splash Damage&lt;/a&gt;, including its deferred rendering pipeline, use of occlusion queries, and virtual texturing. He said OpenGL works for AAA games, and had several useful requests including a lower-level API (&lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;not the first time&lt;/a&gt; we heard this at SIGGRAPH); performance warnings; and display lists, which are widely used on consoles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Full SIGGRAPH Trip Report:  day &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html"&gt;one&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;two&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;three&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html"&gt;four&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html"&gt;five&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7414518762222113717?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7414518762222113717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7414518762222113717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7414518762222113717'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html' title='SIGGRAPH 2011 Trip Report:  Day Four'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-o4fUs0Suf0c/TkgYUWZvE1I/AAAAAAAABZU/nclf5c74PAs/s72-c/IMAG0184.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6631626497231172894</id><published>2011-08-11T19:00:00.003-04:00</published><updated>2011-08-14T22:35:41.624-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebGL'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><category scheme='http://www.blogger.com/atom/ns#' term='GPU'/><title type='text'>SIGGRAPH 2011 Trip Report:  Day Three</title><content type='html'>I spent the morning in the &lt;a href="http://www.siggraph.org/s2011/content/out-core"&gt;Out of Core&lt;/a&gt; talks - a topic quite dear to me considering my &lt;a href="http://blogs.agi.com/insight3d/index.php/2009/02/19/out-of-core-rendering/"&gt;master's thesis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Won Chun's talk, &lt;em&gt;Google Body: 3D Human Anatomy in the Browser&lt;/em&gt;, was a modified version of a similar talk from &lt;a href="http://www.youtube.com/watch?v=vsHHNClzJPg"&gt;WebGL Camp 3&lt;/a&gt;.  He discussed the mesh compression and WebGL rendering used in &lt;a href="http://bodybrowser.googlelabs.com/"&gt;Google Body&lt;/a&gt;.  My favorite part was how &lt;a href="http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html"&gt;vertex cache optimization&lt;/a&gt;, which is used to optimize rendering, also helped improve compression by increasing coherence.  There was lots of other goodness like how rendering with &lt;code&gt;float&lt;/code&gt; vertex components was faster than using &lt;code&gt;short&lt;/code&gt; components even though floats require more data.  Won's compression code is now &lt;a href="http://code.google.com/p/webgl-loader/"&gt;open source&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://artis.imag.fr/Members/Cyril.Crassin/"&gt;Cyril Crassin&lt;/a&gt; gave a very impressive talk titled &lt;a href="http://artis.imag.fr/Publications/2011/CNSGE11a/"&gt;Interactive Indirect Illumination Using Voxel Cone Tracing: An Insight&lt;/a&gt;.  It showed fast, approximate, two-bounce global illumination by grouping coherent rays of reflected light in a pre-integrated cone.  I obviously do not work in GI, but if you do, this talk is definitively worth checking out.&lt;br /&gt;&lt;br /&gt;Another very impressive talk was &lt;em&gt;Out-of-Core GPU Ray Tracing of Complex Scenes&lt;/em&gt; presented by &lt;a href="http://garanzha.com/default.aspx"&gt;Kirill Garanzha&lt;/a&gt;.  They interactively rendered the Boeing 777 model, a classic "massive model", on an NVIDIA GeForce GTX 480 at 1024x768.  For many views, it looked like it was 200-300 ms per frame with a cache size of 21% of the model (360 million polygons).  I'm pretty sure only diffuse shading was used, but even so, this is outstanding work.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QlXeCLp60Vo/TkILbCAXw1I/AAAAAAAABZA/hj4Ajo3BsSs/s1600/IMAG0162.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://1.bp.blogspot.com/-QlXeCLp60Vo/TkILbCAXw1I/AAAAAAAABZA/hj4Ajo3BsSs/s400/IMAG0162.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One course I never miss at SIGGRAPH is &lt;a href="http://bps11.idav.ucdavis.edu/"&gt;Beyond Programmable Shading&lt;/a&gt;.  A lot of material from this SIGGRAPH course makes its way into our &lt;a href="http://www.seas.upenn.edu/~cis565/"&gt;course&lt;/a&gt; at &lt;a href="http://cg.cis.upenn.edu/index.html"&gt;Penn&lt;/a&gt;.  I wasn't able to make all the sessions this year, but I will certainly catch the rest on &lt;a href="http://encore.siggraph.org/"&gt;SIGGRAPH Encore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A major course theme was system-on-a-chip (SOC), where both CPU and GPU cores are on the same chip.  This has the benefit of eliminating the system bus between the CPU and GPU, which is often a bottleneck.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VzHNwSaNGDU/TkILygJ0XCI/AAAAAAAABZI/yLKubw5U7sw/s1600/IMAG0174.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-VzHNwSaNGDU/TkILygJ0XCI/AAAAAAAABZI/yLKubw5U7sw/s400/IMAG0174.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I really enjoyed the panel &lt;em&gt;What Is the Right Cross-Platform Abstraction Level for Real-Time 3D Rendering?&lt;/em&gt; with &lt;a href="http://www.linkedin.com/pub/david-blythe/4/664/472"&gt;David Blythe&lt;/a&gt;, Chas Boyd, &lt;a href="http://graphics.stanford.edu/~mhouston/"&gt;Mike Houston&lt;/a&gt;, Raja Koduri, Henry Moreton, and &lt;a href="http://www.ppsloan.org/"&gt;Peter-Pike Sloan&lt;/a&gt;.  They discussed the tension between application developers, middleware developers, OS developers, and hardware vendors when it comes to APIs like Direct3D and OpenGL.  It was generally accepted that D3D/OpenGL are at the right level of abstraction, but need tweaking.  Various ideas were discussed, including shorter specs; merging compute and rendering APIs; new APIs for system-on-a-chip; and even having one low-level rendering API and multiple high-level rendering APIs, with the argument that there are many abstractions (programming languages) that do the same thing: change the CPU's instruction pointer.&lt;br /&gt;&lt;br /&gt;My favorite part about the panel was the discussion on what goes on in the driver.  There is significant pressure for hardware vendors to do well on game benchmarks so many hacks are added to optimize for specific games.  The games may not be using best practices, so they are "rewritten in the driver" making the driver really bloated - what a mess.  This reminds me of the &lt;a href="http://www.joelonsoftware.com/articles/fog0000000054.html"&gt;special allocator mode&lt;/a&gt; added to Windows 95 to workaround a bug in SimCity, who was using memory right after it was freed.&lt;br /&gt;&lt;br /&gt;All of these game-specific hacks (I almost called them &lt;em&gt;optimizations&lt;/em&gt;) lead to non-obvious fast-paths.  What vertex-format should I use?  As an application developer, I don't know.  Well, I sort of know, but when killer-next-gen-game comes out, which uses double-precision texture coordinates, should I also switch to make my application run faster?  Introducing a low-level rendering API would fix many of these problems and remove the bloat from the drivers.&lt;br /&gt;&lt;br /&gt;Another interesting topic in this discussion was why closed-source drivers are higher quality than open-source drivers.  The reasons are quite understandable:  closed-source drivers can hide hardware bugs, hide intellectual property that isn't patented, and hide third-party code.  It also sounds like there are a lot less open-source developers (40-to-1?) and changes in the Linux kernel can affect the drivers.&lt;br /&gt;&lt;br /&gt;Every year, the Beyond Programmable Shading ends with a thought-provoking panel, but this panel was by far the best one!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Full SIGGRAPH Trip Report:  day &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html"&gt;one&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;two&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;three&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html"&gt;four&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html"&gt;five&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6631626497231172894?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6631626497231172894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6631626497231172894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6631626497231172894'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html' title='SIGGRAPH 2011 Trip Report:  Day Three'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-QlXeCLp60Vo/TkILbCAXw1I/AAAAAAAABZA/hj4Ajo3BsSs/s72-c/IMAG0162.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7414140190401042577</id><published>2011-08-10T01:03:00.002-04:00</published><updated>2011-08-18T19:49:38.120-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><category scheme='http://www.blogger.com/atom/ns#' term='GPU'/><title type='text'>SIGGRAPH 2011 Trip Report:  Day Two</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-aqBaVREhOSk/TkBKjq_kO0I/AAAAAAAABY4/O08DlHOgLZ8/s1600/IMAG0181.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-aqBaVREhOSk/TkBKjq_kO0I/AAAAAAAABY4/O08DlHOgLZ8/s320/IMAG0181.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I started off today at some of the &lt;a href="http://www.nvidia.com/object/siggraph-2011.html"&gt;NVIDIA exhibitor sessions&lt;/a&gt;.  In the &lt;em&gt;OpenGL &amp;amp; CUDA-Based Tessellation&lt;/em&gt; talk, Philippe Rollin made an excellent point about tessellation shaders: the result can be cached using transform-feedback, and used for several frames.  This is just one of the many examples of the synergy among recent hardware features.  He also convinced me that tessellation can be useful for real-world terrain data by reducing the amount of preprocessing - and everyone hates preprocessing!  In the final part of this talk, Miguel Ortega talked about tessellation in Thor.  An interesting stat he mentioned is that the biggest asset used 900 4K textures - wow! Movies are quite a bit different than real-time rendering.&lt;br /&gt;&lt;br /&gt;I also stayed for the &lt;em&gt;Parallel Nsight 2.0 and CUDA 4.0 for the Win&lt;/em&gt; talk by Jeff Kiel.  Parallel Nsight has some very impressive Direct3D debugging capabilities, and I'm looking forward to full OpenGL support.  I will be ecstatic when I can set breakpoints in a shader.  Parallel Nsight is also a great tool for GPU Compute debugging.  I want to work this into our &lt;a href="http://www.seas.upenn.edu/~cis565/"&gt;GPU course&lt;/a&gt;, but requiring two GPUs will call for some careful logistics.  However, it will run on some laptops.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Sy68-81DSa0/TkBKq7CAZvI/AAAAAAAABY8/p-GFVIHSaKE/s1600/IMAG0166.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-Sy68-81DSa0/TkBKq7CAZvI/AAAAAAAABY8/p-GFVIHSaKE/s400/IMAG0166.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I spent some time in the &lt;a href="http://advances.realtimerendering.com/"&gt;Advances in Real-Time Rendering&lt;/a&gt; course, but I spent the bulk of my afternoon in the &lt;a href="http://blogs.unity3d.com/2011/08/18/fast-mobile-shaders-talk-at-siggraph/"&gt;How to Write Fast iPhone and Android Shaders in Unity&lt;/a&gt; Studio Workshop by &lt;a href="http://aras-p.info/"&gt;Aras Pranckevičius&lt;/a&gt; and &lt;a href="http://www.linkedin.com/in/renaldas"&gt;Renaldas Zioma&lt;/a&gt;.  So far, this was my favorite talk of the conference.  It was full of battle-won tips on optimizing shaders for mobile platforms.  I haven't done any mobile development yet, but it sounds messy with all the different architectures.  For example, on some architectures you should pack varyings into a &lt;code&gt;vec4&lt;/code&gt;, and on others you shouldn't.  Some architectures scale better than others as more ALU instructions are used.  Some architectures care what precision qualifier you use (&lt;code&gt;lowp&lt;/code&gt;, &lt;code&gt;mediump&lt;/code&gt;, &lt;code&gt;highp&lt;/code&gt;), some don't, and some are slow when swizzling &lt;code&gt;lowp&lt;/code&gt; precision variables.&lt;br /&gt;&lt;br /&gt;Some themes were uniform across all architectures though: baking lighting into textures to avoid heavy ALU instructions like the &lt;code&gt;pow()&lt;/code&gt; function in specular lighting; combining several post-processing passes into a single pass to avoid fill-rate; and pragmatic front-to-back rendering for early-z, e.g., render the large player, followed by the environment, followed by enemies which are likely occluded, and finally the skybox.  I really enjoyed how this talk was realistic, and even mentioned the reality of optimizations not working and tools crashing.  These things happen to me too, and I always tell my friends &lt;em&gt;so you really want to be a graphics developer?!?!?&lt;/em&gt;  I hope they give a similar talk next year, and that SIGGRAPH gives them a bigger room with more seats.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Full SIGGRAPH Trip Report:  day &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html"&gt;one&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;two&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;three&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html"&gt;four&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html"&gt;five&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7414140190401042577?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7414140190401042577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7414140190401042577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7414140190401042577'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html' title='SIGGRAPH 2011 Trip Report:  Day Two'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-aqBaVREhOSk/TkBKjq_kO0I/AAAAAAAABY4/O08DlHOgLZ8/s72-c/IMAG0181.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-3809412688849503497</id><published>2011-08-08T12:55:00.002-04:00</published><updated>2011-08-14T22:35:20.275-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>SIGGRAPH 2011 Trip Report:  Day One</title><content type='html'>Vancouver is awesome.  It is clean; the people are unbelievably nice; and the convention center is right on the water and easy to navigate.  Let's stop going to LA every other year, and start going to Vancouver!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-aaWOzV6CyAQ/Tj70DpP1hRI/AAAAAAAABYo/e7khvJD0Imc/s1600/IMAG0168.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://4.bp.blogspot.com/-aaWOzV6CyAQ/Tj70DpP1hRI/AAAAAAAABYo/e7khvJD0Imc/s400/IMAG0168.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I spent the afternoon in the &lt;a href="http://www.daveshreiner.com/SIGGRAPH/s11/"&gt;Introduction to Modern OpenGL Programming&lt;/a&gt; course taught by &lt;a href="http://www.cs.unm.edu/~angel/"&gt;Edward Angel&lt;/a&gt; and &lt;a href="http://www.daveshreiner.com/"&gt;Dave Shreiner&lt;/a&gt;.  It was packed, which shows how important OpenGL has become, especially given OpenGL ES and WebGL.  I've been a big fan of this course since I &lt;a href="http://blogs.agi.com/insight3d/index.php/2008/08/18/siggraph-2008-trip-report/"&gt;first attended it&lt;/a&gt; in 2008.  They've done a great job of keeping it up to date.  It is a nice introduction to OpenGL, including VBOs, VAOs, GLSL, uniforms, transforms, lighting, and texture mapping.  They briefly covered tessellation and geometry shaders, but time was tight.  I'm looking forward to this class being a full day in the future.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-0xUcQEKbNIM/TkANx9VOtGI/AAAAAAAABYs/BV9qcMnj5vE/s1600/IMAG0179.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-0xUcQEKbNIM/TkANx9VOtGI/AAAAAAAABYs/BV9qcMnj5vE/s320/IMAG0179.jpg" width="255" /&gt;&lt;/a&gt;I usually don't make it to the paper sessions, but I always attend the &lt;a href="http://www.siggraph.org/s2011/for_attendees/technical-papers-fast-forward"&gt;papers fast forward&lt;/a&gt; to get an overview of the research being presented.  Even the overflow room was packed this year.  One paper that jumped out at me was &lt;a href="http://sourceforge.net/apps/mediawiki/hdrvdp/"&gt;HDR-VDP-2: A calibrated visual metric for visibility and quality predictions in all luminance conditions&lt;/a&gt; by &lt;a href="http://pages.bangor.ac.uk/~eesa0c/"&gt;Rafal Mantiuk&lt;/a&gt; et al.  It describes an algorithm for comparing images.  They suggest use-cases like determines the quality-loss due to compression.  I am interested in it for a much simpler use-case:  unit tests.  That is, I want to compare images rendered by our 3D engine on different hardware and different drivers, and I don't what false failures for slight differences.  This is a surprising hard problem to solve, and at some point, I'd like to look into HDR-VDP for doing so.&lt;br /&gt;&lt;br /&gt;A tip for SIGGRAPH attendees:  you can buy merchandise from previous SIGGRAPHs at a steep discount at the SIGGRAPH Store.  I bought two tee-shirts for $3 each.  They also have things like polo shirts, hats, and coffee mugs for dirt-cheap.&lt;br /&gt;&lt;br /&gt;One more tip:  there is a separate registration line for contributors that is much shorter than the normal line.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tzL5GhwYaG0/TkARhbPdHII/AAAAAAAABY0/ye8adUI1d0E/s1600/IMAG0170.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://1.bp.blogspot.com/-tzL5GhwYaG0/TkARhbPdHII/AAAAAAAABY0/ye8adUI1d0E/s400/IMAG0170.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Full SIGGRAPH Trip Report:  day &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html"&gt;one&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-two.html"&gt;two&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-three.html"&gt;three&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-four.html"&gt;four&lt;/a&gt; | &lt;a href="http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-five.html"&gt;five&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-3809412688849503497?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/3809412688849503497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3809412688849503497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3809412688849503497'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/siggraph-2011-trip-report-day-one.html' title='SIGGRAPH 2011 Trip Report:  Day One'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-aaWOzV6CyAQ/Tj70DpP1hRI/AAAAAAAABYo/e7khvJD0Imc/s72-c/IMAG0168.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6785010550362154998</id><published>2011-08-06T07:00:00.001-04:00</published><updated>2011-08-06T09:57:25.941-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Advice for Students'/><title type='text'>The Passionate Programmer Review</title><content type='html'>Jon McCaffrey's &lt;a href="http://mccaffreydev.blogspot.com/2011/05/passionate-programmer.html"&gt;review&lt;/a&gt; of &lt;a href="http://www.amazon.com/Passionate-Programmer-Remarkable-Development-Pragmatic/dp/1934356344?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;The Passionate Programmer&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1934356344" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; by &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt; motivated me to read it myself.  I used to read lots of books like these, but over the past six or seven years, I’ve buried myself so deep in graphics that I've read very little general development books.  It’s time to change that.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Passionate-Programmer-Remarkable-Development-Pragmatic/dp/1934356344?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"&gt;&lt;img alt="The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life)" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=1934356344&amp;amp;tag=virtua06a-20" /&gt;&lt;/a&gt;The Passionate Programmer is well worth a read.  At about 200 pages, it is short, readable, and inspiring.  It contains 53 bitesize chapters on being productive, marketing yourself, staying sharp, etc.  I agree with the vast majority of the book's advice.  It is a particularly great read for students and new developers; it will get them in the proper mindset to be &lt;em&gt;awesome&lt;/em&gt; developers as Chad would say.  If you are more experienced, you are probably already doing many things in this book; if not, you should consider them.&lt;br /&gt;&lt;br /&gt;One of my favor chapters is &lt;em&gt;4. Be the Worst&lt;/em&gt;, which suggests surrounding yourself with the best developers you can, because doing so makes you grow faster and perform better.  I couldn't agree more!&lt;br /&gt;&lt;br /&gt;You would think that &lt;em&gt;14. Be a Mentor&lt;/em&gt; contradicts the advice of being the worst, but it does not.  It is important to be a mentor to new developers because teaching is one of the best ways to learn.  Do I really know how the automated build and test system works?  I will once I try to explain it to someone.&lt;br /&gt;&lt;br /&gt;Being a mentor also helps a team gel and integrate new developers quickly.  If there is one thing our industry needs to get better at, it is mentoring.  Electricians, plumbers, and tattoo artists do apprenticeships.  Software developers do not.  How often do we sit down with the experts in our development teams and learn from them?  Probably never, or not often enough at best.&lt;br /&gt;&lt;br /&gt;In &lt;em&gt;28. Eight-Hour Burn&lt;/em&gt;, Chad argues to only work eight-hour days but work with the utmost intensity.  Working longer days leads to burning out, wasting time, and less overall long-term productivity.  I agree; however, I am a hypocrite.  Given my outside writing and teaching activities, I am consistently over 70 hours a week, and sometimes much higher.  The only justification I have is writing and teaching are different enough from developing that the burn out isn’t as severe.  I know I can't maintain this pace forever though.&lt;br /&gt;&lt;br /&gt;Perhaps &lt;em&gt;39. Let Your Voice Be Heard&lt;/em&gt; is my favorite piece of advice.  Chad suggests thinking beyond your current employer and contributing to the industry as a whole, first with a weblog (I don't know why he didn't just say blog), and eventually through publications and presentations.  I really like this advice because there are a lot of sharp people in our field, and it is great to have everyone share ideas.&lt;br /&gt;&lt;br /&gt;I don't think any advice in the book is terrible, but some needs to be put into perspective.  For example, in &lt;em&gt;27. Learn to Love Maintenance&lt;/em&gt;, it is argued that maintenance development can allow for freedom, creativity, and direct-customer interaction.  For old, large applications, this isn't always true.  If you are working on a twenty-year old, multi-million line application that has seen the hands of hundreds of developers at various stages in their careers, maintenance is often a test of patience.  For example, do we really want to continue to design legacy APIs using COM?  Is making our code const correct easy when all the code we call is not?  Do we really want to integrate old code using a struct for vectors with new code using a class?  No.  we want to build our skills using modern technology and techniques.&lt;br /&gt;&lt;br /&gt;I advise interns and new grads to get in on the ground floor of a new project.  They will be given the best opportunity and most responsibly.  They will see the big picture, and will accelerate their skills faster than being bogged down by long build-times, legacy code, and legacy mistakes.  The contractor who built the house learned much more than the contractor who remodeled the bathroom.  With all this said, if you get an opportunity to work on a large, &lt;em&gt;outstanding&lt;/em&gt; piece of software - say the Linux kernel, for example - you should go for it.&lt;br /&gt;&lt;br /&gt;One final comment:  this book is a revised edition of the book &lt;em&gt;My Job Went to India: 52 Ways to Save Your Job&lt;/em&gt;.  Naming a book is really important, just like naming software, classes, functions, variables, etc.  With the original title, I would not have paid this book any attention.  The revised title – and I assume content – made it really appealing.  Naming is hard.&lt;br /&gt;&lt;br /&gt;Overall, The Passionate Programmer is an inspiring, worthwhile read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6785010550362154998?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6785010550362154998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/08/passionate-programmer-review.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6785010550362154998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6785010550362154998'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/08/passionate-programmer-review.html' title='The Passionate Programmer Review'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-8805680127222247306</id><published>2011-07-05T11:00:00.002-04:00</published><updated>2011-07-06T21:34:57.205-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vector Data'/><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><title type='text'>Book Signing and More at SIGGRAPH 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.akpeters.com/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="47" src="http://www.akpeters.com/resources/skin/images/akp_logo.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Stop by the A K Peters / CRC Press booth at the SIGGRAPH exhibition on Tuesday, 08/09/2011, from 1:15-2pm for our virtual globe book book signing.  Even if you don't have (or want) a copy of our book, stop by to chat about anything related:  OpenGL, 3D engine design, computer science education, etc.  If you have a copy you want me to sign but can't make the signing, email me (&lt;a href="mailto:pjcozzi@siggraph.org"&gt;pjcozzi@siggraph.org&lt;/a&gt;), and we'll meetup sometime during the conference.  If you're interesting in submitting a proposal for &lt;a href="http://www.openglinsights.com/"&gt;OpenGL Insights&lt;/a&gt;, also email me if you want to chat during SIGGRAPH.&lt;br /&gt;&lt;br /&gt;If you really want to stalk me, and I fully encourage it, stop by the poster session either right before the book signing on Tuesday, 12:15-1pm, or on Wednesday, also 12:15-1pm.  I will be presenting a poster I worked on with Deron Ohlarik called &lt;a href="http://blogs.agi.com/agi/?p=2456"&gt;A screen-space approach to rendering polylines on terrain&lt;/a&gt;.  We are quite happy with the technique and are even using it in commercial code.  We are also honored that it was mentioned on the &lt;a href="http://www.realtimerendering.com/blog/seven-things-for-may-4th-2011/"&gt;Real-Time Rendering blog&lt;/a&gt; (full disclaimer:  Eric reviewed the abstract before we submitted it.  He also reviewed the abstract for the &lt;a href="http://blogs.agi.com/insight3d/index.php/2010/04/19/gpu-ray-casting-of-virtual-globes/"&gt;poster&lt;/a&gt; I presented last year.  Man, I owe him).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5bJLV5KSXTA/ThUNFpNxcvI/AAAAAAAABYc/uzYcvVtVWKk/s1600/representative_image.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://4.bp.blogspot.com/-5bJLV5KSXTA/ThUNFpNxcvI/AAAAAAAABYc/uzYcvVtVWKk/s400/representative_image.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://sis.siggraph.org/OPAL/Themes/SIS/2011/src/downloads/c96-f96_3-a311-representative_image-v1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In other book-related news, Brano Kemen from &lt;a href="http://www.outerra.com/"&gt;Outerra&lt;/a&gt; wrote the first &lt;a href="http://outerra.blogspot.com/2011/07/book-3d-engine-design-for-virtual.html"&gt;book review&lt;/a&gt; we are aware of, and there has been some book-related discussion on the &lt;a href="http://forum.worldwindcentral.com/showthread.php?p=95185"&gt;NASA World Wind forums&lt;/a&gt;.  We're excited that a lot of people are excited about our work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-8805680127222247306?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/8805680127222247306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/07/book-signing-and-more-at-siggraph-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/8805680127222247306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/8805680127222247306'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/07/book-signing-and-more-at-siggraph-2011.html' title='Book Signing and More at SIGGRAPH 2011'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5bJLV5KSXTA/ThUNFpNxcvI/AAAAAAAABYc/uzYcvVtVWKk/s72-c/representative_image.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-3972488562286573179</id><published>2011-07-02T16:30:00.004-04:00</published><updated>2011-07-02T16:30:00.578-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Virtual Globe Book Updates</title><content type='html'>We recently added several things to our book's &lt;a href="www.virtualglobebook.com"&gt;website&lt;/a&gt;, including a zip of the &lt;a href="http://www.virtualglobebook.com/code.html"&gt;example code with build instructions&lt;/a&gt; for Windows and Linux (Ubuntu); a zip of most of the book's figures, available under &lt;a href="http://en.wikipedia.org/wiki/Fair_use"&gt;fair use&lt;/a&gt;; the &lt;a href="http://www.virtualglobebook.com/bibliography.html"&gt;bibliography&lt;/a&gt; with hyperlinks that all work as of today; and the &lt;a href="http://www.virtualglobebook.com/backcover.html"&gt;back cover&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s1600/backcover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s640/backcover.png" width="432" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Posting the figures and bibliography is a great idea we borrowed from &lt;a href="http://www.realtimerendering.com/"&gt;Real-Time Rendering&lt;/a&gt;, who has set the bar for book websites quite high.&lt;br /&gt;&lt;br /&gt;More exciting news: &lt;a target="_blank"  href="http://www.amazon.com/3D-Engine-Design-Virtual-Globes/dp/1568817118?ie=UTF8&amp;tag=virtua06a-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Amazon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=1568817118" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt; says our book is "in stock but may require an extra 1-2 days to process."  Hopefully it is shipping by the time you read this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-3972488562286573179?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/3972488562286573179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/07/virtual-globe-book-updates.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3972488562286573179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3972488562286573179'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/07/virtual-globe-book-updates.html' title='Virtual Globe Book Updates'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s72-c/backcover.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2680947522343617440</id><published>2011-06-24T07:15:00.004-04:00</published><updated>2011-07-02T07:03:09.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Advice for Students'/><title type='text'>Resume Tips for Computer Science Students</title><content type='html'>Here are some resume tips I've learned over the years.  I've interviewed about 100 computer science candidates, mostly interns, and have been a technical recruiter at least a dozen times at university career fairs.  I've seen thousands of resumes, and have hopefully learned some things you will find useful.  For the most part, I've left out obvious recommendations and, instead, focused on tips you may not have heard - or heard from the same point of view.  In my youth, I was heavily influenced by &lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt;, so I probably borrowed some of these ideas from him.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;1. Backup your Buzzwords&lt;/h2&gt;&lt;br /&gt;Almost every computer science resume has a section that looks like:&lt;br /&gt;&lt;pre&gt;Skills:  C, C++, C#, Java, .NET, WPF, OpenGL, Direct3D, GLSL, Visual Studio, Eclipse, NUnit, JUnit, NAnt, ...&lt;br /&gt;&lt;/pre&gt;I'm tempted to recommend removing this section entirely.  It does have some uses though; it is good for google searches and HR/manager buzzword hunters.  It can also paint a quick profile:  is this person a client-side graphics developer?  a server-side PHP/MySQL developer?  An &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;architect astronaut&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;In order to play the game with the less technical folks, I am OK with candidates including this section, but these skills need to be backed up throughout the resume.  For example, if OpenCL is listed but I don't see any evidence elsewhere in the resume, I will be skeptical.  If I ask about it in an interview and the candidate doesn't have any experience or even exposure to the topic, they have just lost integrity points.&lt;br /&gt;&lt;br /&gt;If you list something in the skills section, make sure it is proven elsewhere in your resume, e.g., "Implemented a GPU-accelerated cloth simulation using OpenCL, which resulted in a 30x performance improvement over a multithreaded C++ version."  The buzzword hunters will give you extra points for having multiple instances of the buzzword, and technical folks are more likely to believe you.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;2. List Coursework Strategically&lt;/h2&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gq9pbIJ8Lus/TgJmu3eyn6I/AAAAAAAABXA/k-5eXTt6rZ4/s1600/buzz.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-gq9pbIJ8Lus/TgJmu3eyn6I/AAAAAAAABXA/k-5eXTt6rZ4/s320/buzz.jpg" width="265" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This motorcycle has nothing to do with &lt;br /&gt;resumes but it sure is fun to ride.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;For a student or recent graduate, it is a great idea to including a "Selected Courses" or, better yet, "Favorite Courses" section that highlights some unique courses you have taken.  It is an even better idea to tailor this section, and your resume in general, to each employer.  Applying to Google search?  Include Distributed Systems and Machine Learning.  Applying to Pixar?  List Computer Graphics and Physically-Based Animation.&lt;br /&gt;&lt;br /&gt;Do not list a course that you cannot discuss intelligently.  You should have a reasonable grasp of the subject and a story about a related project.  For example, I took machine learning in grad school.  I got an A and somehow even passed the PhD qualifier, but I can't do machine learning to save my life.  I can pronounce fancy algorithms like boosting and principle component analysis, but I can barely tell you the difference between them - not something worth discussing in an interview.&lt;br /&gt;&lt;br /&gt;Do not list required courses!  This is common with underclassmen, but I still see it done by upperclassmen who have more interesting things to list.  If I know your major is computer science and you go to a reputable school, I also know you took intro to programming, calculus, and discrete math.  Don't list them; they get in the way of the good stuff.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;3. Include Your GPA&lt;/h2&gt;&lt;br /&gt;If you are an undergraduate, masters student, or recent graduate, include your GPA in your education section.  Why?  Because if you don't include it, the recruiter is going to think it is low - really low - like 1.5 low.  What if you don't have a 3.0 GPA?  Study more and play World of Warcraft less.  More seriously, if your cumulative GPA is not great, still include it but also consider listing your in-major GPA or last-semester GPA - &lt;i&gt;clearly marked&lt;/i&gt;.  Some students do not practice drinking enough in high school and party too much freshmen year, resulting in poor grades (disclaimer: underage drinking is bad.).  Listing the previous semester's or year's GPA gives the student a chance to talk to their improvements - in school work, not alcohol tolerance.  I recommend listing your in-major, or even in-minor, GPA only if it is higher than your cumulative GPA.  If it's not higher, think twice about your field.&lt;br /&gt;&lt;br /&gt;Wait a minute.  I thought GPAs only matter if you are going to grad school.  No one in industry looks at those things, right?  Given my extensive teaching experience (one semester), I can say that some of my brightest students had some of the worse grades.  They were too busy raising money for their startups or going on job interviews to do every assignment rigorously.  Students with the best grades were really organized and conscientious - absolutely fantastic characteristics to have, but not necessarily a guaranteed indication of raw brilliant.  Case-in-point:  I had a 3.97 in grad school and I am continuously humbled by the intelligence of people in our field.  A great GPA can help you by showing your rigorousness; a poor GPA isn't necessarily going to bury you but it will mean you have some explaining to do.  Many companies have a minimum GPA require, so I'd play the game to show that you can.&lt;br /&gt;&lt;br /&gt;Some people will say that your GPA is only important for getting your first job.  After that, leave it off your resume.  Baloney.  Why not drop the name of your university too?  Why should I care that you went to CMU 20 years ago?  Because you got in!  If your GPA was low or average, OK, drop it.  If your GPA was really high, leave it.  If you were an over-achiever in college, you are probably still an over-achiever unless your motivation changed.&lt;br /&gt;&lt;br /&gt;I don't have a PhD so I can't say if a PhD student should list their GPA but I will anyway.  I have never seen a candidate with a PhD be evaluated on their GPA.  I'm not saying it doesn't happen, but I've never seen or heard of it.  I have heard that if a PhD student's GPA is too high, they should be focusing more on research.  If that is really the case, then why do they take classes at all?  Go ask someone who is qualified.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;4. Don't Ignore What You Did in High School&lt;/h2&gt;&lt;br /&gt;When you are looking for an internship, don't think that high school isn't important, especially if you are a freshmen or a sophomore.  Yes, freshmen can and should land internships.  I had two offers from Intel for the summer after my freshmen, and I didn't know anything.  Well, at the time I thought I knew everything.&lt;br /&gt;&lt;br /&gt;If your high school class rank was really high, put it.  Valedictorian - put it.  President of the computer club?  Put it.  Fail history class because you were busy coding Android games in Java?  PUT IT.  Sell your Android-based startup to Google on your 18th birthday?  I should be working for you.&lt;br /&gt;&lt;br /&gt;It is espeically important to include self-started personal programming projects, even if you coded them when you were 14.  Hell, say "Implemented a pacman clone for the Xbox 360 using C# and XNA when I was 14."  If I see that on a freshmen's resume, I want to hire them even if they don't know what a &lt;a href="http://en.wikipedia.org/wiki/Skip_list"&gt;skip list&lt;/a&gt; is.  They'll never use one anyway.&lt;br /&gt;&lt;br /&gt;As you gain experience, it is OK to remove things you did in high school with more recent and stronger experiences.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;5. Include Books and Conferences&lt;/h2&gt;&lt;br /&gt;You're passionate.  You read books, go to conferences, and argue with your smart friends to sharpen your skills.  Everyday, you make yourself a better developer.&lt;br /&gt;&lt;br /&gt;Let your passion show through on your resume and include a section with a few of your favorite technical books. How about &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Code Complete&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0735619670" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Peopleware&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0932633439" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=020161622X" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Effective C++&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=020161622X" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, and &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Real-Time Rendering&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=020161622X" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;?  Those are my favorites.  Pick your own.  Be ready to discuss them.  If your interviewer has read the same books, there's a good chance you will hit it off.  If they haven't read the classics, you probably want to work somewhere else.  If you haven't read the classics, start yesterday.&lt;br /&gt;&lt;br /&gt;As an aside, my first day as an intern at Intel, I asked if I should read any books.  My mentor, &lt;a href="http://www.linkedin.com/pub/john-spotswood/7/280/573"&gt;John Spotswood&lt;/a&gt;, recommended Code Complete.  Reading that book brought me to a new level in software development - granted I was 18 so I had no where to go but up.  Intel was nice enough to pay for any technical books I wanted to read, so Code Complete was just the beginning.  Peopleware, The Pragmatic-Programmer, and others followed.  I always let the interns I work with now borrow these books and others.&lt;br /&gt;&lt;br /&gt;In addition to listing your favorite or most influential books, list the conferences you have attended, or better yet, volunteered at, or even better yet, had work accepted at.  This sends the message that you are keeping your skills current, know what's on the cutting edge, or are even defining the cutting edge.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;6. Be Specific&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-VhrBJkpOIGU/TgJlFvfrtPI/AAAAAAAABW8/8SfepfZDIrk/s1600/2003060117.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="249" src="http://2.bp.blogspot.com/-VhrBJkpOIGU/TgJlFvfrtPI/AAAAAAAABW8/8SfepfZDIrk/s320/2003060117.jpg" width="320" /&gt;&lt;/a&gt;In 2003, the stars aligned in such a way that I was accepted into IBM's &lt;a href="http://www-01.ibm.com/employment/us/extremeblue/"&gt;Extreme Blue&lt;/a&gt; internship program.  This is an outstanding program that I encourage all passionate computer science students (BS, MS, and PhD) to apply to.  I believe much of the program's success is due to &lt;a href="http://www.linkedin.com/in/kieran"&gt;Kieran Lal&lt;/a&gt;, the program's co-founder and one of our mentors for the summer.  Kieran is a great culture-building leader that is truly interested in the long-term success of every intern.  Kieran gave great advice, and here I share one piece of it:  be specific.&lt;br /&gt;&lt;br /&gt;What is stronger:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Implemented a distributed storage system"&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Implemented a Linux-based distributed filesystem in C (~20K lines) tested with 20K concurrent users"?&lt;br /&gt;&lt;br /&gt;Being specific backs up your buzzwords and gives the reader context and scope.  What does this mean?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Implemented an application to track chipset validation"&lt;br /&gt;&lt;br /&gt;Is it:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Implemented a database front-end to track chipset validation in MS Access 97 in an afternoon"&lt;br /&gt;&lt;br /&gt;or:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Lead a team of five developers creating a chipset validation tracking application with an HTML5 and Android front-end.  Used SQL Server with stored procedures on the back-end."?&lt;br /&gt;&lt;br /&gt;A fun side story about Kieran is on the first Friday of our internship I organized a party with all the interns at my lovely apartment IBM was paying for.  As the party started picking up, I got a phone call from...Kieran.  I figured I was in trouble.  No, he was at the apartment's entrance and needed me to buzz him in!  I don't know how he found out about it, but I'm glad he did.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;7. Keep it to One Page&lt;/h2&gt;&lt;br /&gt;When I was a know-it-all intern at Intel, I spent an afternoon toying with SQL Query Analyzer.  So I thought it was a good idea to beef up my resume:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Optimized SQL queries using Microsoft SQL Query Analyzer"&lt;br /&gt;&lt;br /&gt;I added lots of things like this, which turned me into an 18 year old intern with a two page resume.  I brought it to an internal job fair, and people didn't know what to do with it.  Staple it?  Paperclip?  More importantly, they couldn't see the meat in the resume because all the SQL Query Analyzer junk got in the way.&lt;br /&gt;&lt;br /&gt;As a recruiter, I got lucky one time at a university career fair and noticed that a resume was actually two-sided - and all the good stuff was on the back side!  I wonder how many two-pages resumes I missed.&lt;br /&gt;&lt;br /&gt;If your an undergraduate, keep your resume to one page if your going to the career fair.  A PhD student or developer with a few years experience can definitively have multiple pages.  I actually keep two resumes:  a short academic-focused CV and a longer industry-focused resume.&lt;br /&gt;&lt;br /&gt;Need to save space?  Leave off "References available upon request."  That is always implied.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;8. Link to Your Personal Website&lt;/h2&gt;&lt;br /&gt;The top of your resume should have a link to your &lt;a href="http://www.seas.upenn.edu/~pcozzi/"&gt;personal website&lt;/a&gt;, which acts as a portfolio with screen shots of your work and possibly code examples.  You don't have a personal website?  Make one.  Everyone else is doing it so you need it to be a player.  A development blog is also appropriate and perhaps even better.&lt;br /&gt;&lt;br /&gt;In 2000, I had a personal website that included some games I wrote in Turbo Pascal and assembly when I was 15.  When I started my internship at Intel that summer, I learned that one of the developers downloaded my code and reviewed it, and that played a big role in me getting the job offer.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;In Closing&lt;/h2&gt;&lt;br /&gt;In an interview, I always try to bring out the best in a candidate.  I hate walking out of an interview thinking the candidate might be good but I wasn't able to elicit it.  In that case, I have to say no hire.  When looking at a resume, I have to go by what's on paper.  I can't interact with the candidate hoping to see them shine.  Hopefully, some of these resume tips will help our computer science students put their best foot forward.&lt;br /&gt;&lt;br /&gt;Other tips?  Comments?  Criticisms?  Let's discuss.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2680947522343617440?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2680947522343617440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/06/resume-tips-for-computer-science.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2680947522343617440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2680947522343617440'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/06/resume-tips-for-computer-science.html' title='Resume Tips for Computer Science Students'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-gq9pbIJ8Lus/TgJmu3eyn6I/AAAAAAAABXA/k-5eXTt6rZ4/s72-c/buzz.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-4994619583790448355</id><published>2011-05-22T13:50:00.004-04:00</published><updated>2011-05-22T21:49:47.878-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL Insights: Call for Authors</title><content type='html'>&lt;a href="http://www.g-truc.net/"&gt;Christophe Riccio&lt;/a&gt; and I are starting an exciting new book project.  Please join us:&lt;br /&gt;&lt;p&gt;It is with great enthusiasm that we invite you to contribute to &lt;a href="http://www.openglinsights.com"&gt;OpenGL Insights&lt;/a&gt;, a book containing original articles on OpenGL, OpenGL ES, and WebGL techniques by the OpenGL community and for the OpenGL community: from game programmers to web developers to researchers. &lt;em&gt;OpenGL Insights&lt;/em&gt; will be published by A K Peters, Ltd. / CRC Press in time for SIGGRAPH 2012.&lt;br /&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;Given the wide array of OpenGL platforms, from Mac desktops to Android phones to web browsers, we invite you to submit article proposals on all aspects of OpenGL development, including performance tuning, recent GL features/extensions, application architecture, vendor-specific techniques, WebGL, and interoperability with other APIs. We are interested in proposals based on your unique real-world experience using OpenGL. Some ideas include:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;OpenGL performance, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Best performance practices for using vertex buffers&lt;/li&gt;&lt;li&gt;Best performance practices for texture streaming&lt;/li&gt;&lt;li&gt;Performance and memory profiling techniques&lt;/li&gt;&lt;li&gt;64-bit performance considerations&lt;/li&gt;&lt;li&gt;Multithreading with OpenGL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Modern OpenGL 3 and 4 programming, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introduction to tessellation&lt;/li&gt;&lt;li&gt;Image load and store&lt;/li&gt;&lt;li&gt;Programmable multisampling&lt;/li&gt;&lt;li&gt;Using shader subroutines effectively&lt;/li&gt;&lt;li&gt;Managing uniform data&lt;/li&gt;&lt;li&gt;Strategies for debugging OpenGL applications&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Application architecture, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Porting between Direct3D and OpenGL&lt;/li&gt;&lt;li&gt;Writing portable code between OpenGL, OpenGL ES, and WebGL&lt;/li&gt;&lt;li&gt;Designing an OpenGL-based graphics engine&lt;/li&gt;&lt;li&gt;A testing framework for OpenGL applications&lt;/li&gt;&lt;li&gt;Shader architecture best practices, e.g., shader binaries and separate shaders&lt;/li&gt;&lt;li&gt;Cross-platform programming with OpenGL&lt;/li&gt;&lt;li&gt;Tools, libraries&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Vendor-specific techniques, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Understanding and optimizing for specific hardware and driver implementations:  AMD, Apple, ARM, Imagination Technologies, Intel, NVIDIA, Qualcomm, S3 Graphics, etc.&lt;/li&gt;&lt;li&gt;Bindless Graphics:  GL_NV_shader_buffer_load and GL_NV_vertex_buffer_unified_memory&lt;/li&gt;&lt;li&gt;How VAO works on AMD drivers&lt;/li&gt;&lt;li&gt;Taking advantage of deferred tile rendering on PowerVR&lt;/li&gt;&lt;li&gt;How GLSL compiler works&lt;/li&gt;&lt;li&gt;Understanding multithreaded OpenGL drivers&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;OpenGL ES, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Best practices for targeting both desktop and mobile devices&lt;/li&gt;&lt;li&gt;Targeting multiple mobile device platforms&lt;/li&gt;&lt;li&gt;Developing with power consumption in mind&lt;/li&gt;&lt;li&gt;Differences between desktop and mobile devices&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;WebGL, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introduction to WebGL for web developers&lt;/li&gt;&lt;li&gt;Introduction to WebGL for OpenGL developers&lt;/li&gt;&lt;li&gt;Optimizing WebGL applications&lt;/li&gt;&lt;li&gt;Writing large-scale software in JavaScript&lt;/li&gt;&lt;li&gt;Understanding web browser implementations of WebGL&lt;/li&gt;&lt;li&gt;WebGL interoperability with WebCL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Interoperability, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hybrid OpenGL and OpenCL/CUDA rendering pipelines&lt;/li&gt;&lt;li&gt;Working with both OpenGL and Direct3D&lt;/li&gt;&lt;li&gt;OpenGL interoperability with OpenCL and CUDA&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Inspirational thoughts and experiences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenGL's 20th anniversary:  history and evolution&lt;/li&gt;&lt;li&gt;ARB members and OpenGL developers interviews&lt;/li&gt;&lt;li&gt;OpenGL software making of&lt;/li&gt;&lt;li&gt;Daily programmer experiences with OpenGL&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These are, of course, examples.  Please don't feel limited to these areas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The planned schedule is:&lt;br /&gt;&lt;/p&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;August 15, 2011&lt;/td&gt;&lt;td&gt;Proposals due&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;September 1, 2011&lt;/td&gt;&lt;td&gt;Authors selected&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;November 1, 2011&lt;/td&gt;&lt;td&gt;Articles due&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;December 1, 2011&lt;/td&gt;&lt;td&gt;Peer review feedback due&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;December 15, 2011&lt;/td&gt;&lt;td&gt;Revised articles due, all articles sent to publisher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;January 1, 2012&lt;/td&gt;&lt;td&gt;Supplemental material due, e.g., videos, source code, etc.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SIGGRAPH 2012&lt;/td&gt;&lt;td&gt;Book released&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Please send proposals to &lt;a href="mailto:editors@openglinsights.com"&gt;editors@openglinsights.com&lt;/a&gt; using &lt;a href="https://docs.google.com/document/d/1YcJUbyjfSNDBOPY-JeAskUwNktZME6zVpxJDJwRGvP0/edit?hl=en&amp;amp;authkey=CMzHwr4L"&gt;this example proposal&lt;/a&gt; as a template by August 15th.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Proposals should include the title, your name and affiliation, a one-page abstract, and anything else you feel helps convey your article such as related images or references.  Proposals must demonstrate the author's real-world OpenGL experience and ability to write clearly.  Proposals can have multiple authors, and a single author can submit multiple proposals.  There is no required article length, but we expect most articles will be 5-20 pages.  Example code can be written in any language on any platform.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Please feel free to &lt;a href="mailto:editors@openglinsights.com"&gt;contact us&lt;/a&gt; for additional discussion.  We're looking forward to putting together a valuable book for the OpenGL community.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Thanks,&lt;br /&gt;&lt;a href="http://www.seas.upenn.edu/~pcozzi/"&gt;Patrick Cozzi&lt;/a&gt; and &lt;a href="http://www.g-truc.net/"&gt;Christophe Riccio&lt;/a&gt;, Editors&lt;br /&gt;&lt;a href="http://www.openglinsights.com"&gt;www.openglinsights.com&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-4994619583790448355?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/4994619583790448355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/05/opengl-insights-call-for-authors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4994619583790448355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4994619583790448355'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/05/opengl-insights-call-for-authors.html' title='OpenGL Insights: Call for Authors'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6865547913312420633</id><published>2011-05-16T20:00:00.003-04:00</published><updated>2011-05-16T20:00:01.509-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><title type='text'>Book Update</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: right;"&gt;&lt;a href="http://3.bp.blogspot.com/-6a8Utz0Bz2E/Tc7FT87_IfI/AAAAAAAABWY/wfDyKtFPxtA/s1600/IMAG0096.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-6a8Utz0Bz2E/Tc7FT87_IfI/AAAAAAAABWY/wfDyKtFPxtA/s320/IMAG0096.jpg" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We have some exciting book-related updates.  For starters, we made a small website for our book, &lt;a href="http://www.virtualglobebook.com/"&gt;www.virtualglobebook.com&lt;/a&gt;, and posted several samples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Detailed &lt;a href="http://www.virtualglobebook.com/TOC.pdf"&gt;table of contents&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Chapter 1:  &lt;a href="http://www.virtualglobebook.com/3DEngineDesignForVirtualGlobesChapter1.pdf"&gt;Introduction&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Section 3.1:  &lt;a href="http://www.virtualglobebook.com/3DEngineDesignForVirtualGlobesSection31.pdf"&gt;The Need for a Renderer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Section 4.3:  &lt;a href="http://www.virtualglobebook.com/3DEngineDesignForVirtualGlobesSection43.pdf"&gt;GPU Ray Casting&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Section 12.1:  &lt;a href="http://www.virtualglobebook.com/3DEngineDesignForVirtualGlobesSection121.pdf"&gt;Level of Detail&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;We also found our book on the cover the latest &lt;a href="http://www.crcpress.com/"&gt;CRC Press&lt;/a&gt; catalog.  Exciting!  Finally, we wrote a short book-related article in our company's &lt;a href="http://blogs.agi.com/inview/?p=96"&gt;newsletter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Things are wrapping up nicely and I suspect the manuscript will be off to the printer any day now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6865547913312420633?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6865547913312420633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/05/book-update.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6865547913312420633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6865547913312420633'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/05/book-update.html' title='Book Update'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-6a8Utz0Bz2E/Tc7FT87_IfI/AAAAAAAABWY/wfDyKtFPxtA/s72-c/IMAG0096.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1602019594411959753</id><published>2011-05-08T08:15:00.003-04:00</published><updated>2011-05-09T21:01:37.006-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='GPU'/><title type='text'>Reflections on Teaching GPU Programming and Architecture</title><content type='html'>I just finished teaching &lt;a href="http://www.seas.upenn.edu/~cis565/"&gt;CIS 565:  GPU Programming and Architecture&lt;/a&gt;, a graduate-level course on programming GPUs using mostly &lt;a href="http://www.opengl.org/documentation/glsl/"&gt;GLSL&lt;/a&gt; and &lt;a href="http://www.nvidia.com/object/what_is_cuda_new.html"&gt;CUDA&lt;/a&gt;, at the &lt;a href="http://www.upenn.edu/"&gt;University of Pennsylvania&lt;/a&gt;.  Being my first time teaching, I gained a lot of valuable insights, which I will share here.  These ideas are on teaching computer science in general, not necessarily about the GPU.&lt;br /&gt;&lt;br /&gt;For eye candy, I sprinkled screenshots of our student projects throughout this post.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;1. Exams have a hidden agenda.&lt;/h2&gt;&lt;br /&gt;At least my exams.  On the surface, exams are used to evaluate students, and ultimately assign grades.  Historical, this course never had exams.  Given its pragmatic, hands-on material, grades were primarily based on coding assignments and a final project.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-PnUkioVCZSs/TcVLxCVpLcI/AAAAAAAABVw/ObiFaCt8HfA/s1600/MULTIPHASE_0004.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-PnUkioVCZSs/TcVLxCVpLcI/AAAAAAAABVw/ObiFaCt8HfA/s320/MULTIPHASE_0004.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://fastfluids.blogspot.com/"&gt;Screen Space Fluid Rendering -&amp;nbsp;Leftheris Kaleas&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This year I added a final - not because I wanted to evaluate students on their ability to think about the GPU under pressure, but because &lt;em&gt;I wanted them to study for the final&lt;/em&gt;.  It is a valuable exercise to go over material a second time, especially after we've had hands-on experience, to gain new insights.  For example, the performance implications of register pressure will seem trivial once the student has some coding experience, but may have been foreign when first introduced.  Likewise, going back and looking at GLSL after learning CUDA, will lead to a deeper understanding of GLSL.&lt;br /&gt;&lt;br /&gt;In general, one reason people go to grad school is to gain a deeper understanding of topics they already have some exposure to.  Studying for a final has the same effect on a more local scale.&lt;br /&gt;&lt;br /&gt;So if I am only interested in students studying for a final, but not so much in how they do, what did I do?  Two things.  First, I made the final only worth 10% of the semester grade.  That is not enough to ruin someone's grade if they perform poorly, but it can be the difference between an A and a B.  The second technique I use is a bit more interesting...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;2. Crowdsourcing the final is fun.&lt;/h2&gt;&lt;br /&gt;To help students study, I requested they make a ten question exam (and answer it!) with questions of different types, e.g., short answer, coding, etc., and of different difficulties, e.g., easy, medium, hard, and challenge.  I made this "take-home" portion of their final worth 10%.  It is a good studying technique to get in the instructor's head and think about what they are going to ask.  I also joked that I might take all of their exams in the time they take my final.&lt;br /&gt;&lt;br /&gt;After I handed out the final, I told the class that their exams were so good and hard that I wouldn't be able to take them while they took my final.  In fact, &lt;i&gt;I didn't even make their final - they did&lt;/i&gt;.  Every single question on their final was from one of their exams.  The class got a big kick out of it.&lt;br /&gt;&lt;br /&gt;When looking through the student-made exams, I was simply amazed at the collective breadth and depth of knowledge of the class.  It was also interesting to see different students with different specialties - each exam covered diverse topics, but some where biased towards GPU architecture, while others were heavy on GPU compute, while others favored rendering.  Overall, the quality of their questions were quite good.  Some of the exams were really hard too - harder than I made the final.&lt;br /&gt;&lt;br /&gt;Am I nervous that a student taking this course in the future will read this post or hear from previous students how the final is made?  Maybe the entire class will self-organize and send their exams to each other before the final.  If a student reviewed every exam, they would know every question that will be on the final.  Is that cheating?  I don't know, but students rigorously studying for a final sounds like a great problem to have.  After all, the main point of my final is to have them revisit the material.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jgrx-_eHNmo/TcVQA6A3f4I/AAAAAAAABV4/igBYbYGXHjs/s1600/cis565_poster.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-jgrx-_eHNmo/TcVQA6A3f4I/AAAAAAAABV4/igBYbYGXHjs/s400/cis565_poster.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://hanli22nd.blogspot.com/"&gt;Mobile Depth of Field as Post-Processing using &lt;br /&gt;OpenGL ES 2.0 - Han Li and Qing Sun&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;3. Student confidence is important.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perhaps this is my most controversial idea...&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DYrY4mql274/TcVQx9UtN4I/AAAAAAAABV8/2b9nXJBQsAw/s1600/e001c4%255B2%255D.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="241" src="http://2.bp.blogspot.com/-DYrY4mql274/TcVQx9UtN4I/AAAAAAAABV8/2b9nXJBQsAw/s320/e001c4%255B2%255D.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://spevis.blogspot.com/"&gt;Fast Human Detection on GPU -&amp;nbsp;Fan Deng&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Some courses have notoriously difficult exams and homeworks.  The mean score may be in the 50s, 40s, or even lower, and the standard deviation is large indicating that some students get it, or at least can handle difficult problems, and some students don't.  This is common in algorithms courses across universities.&lt;br /&gt;&lt;br /&gt;I believe the rational is challenging students to push their limits and think rigorously ultimately leads to a deeper understanding of the material.  At the least, it leads to a certain respect for the subject.&lt;br /&gt;&lt;br /&gt;I think this approach has some merit, but I am on the other end of the extreme.  I want to see a mean around 90% with a tight standard deviation, indicating that everyone is getting it for the most part.  In practice, I saw means from 75 to 94 and standard deviations from 4 to 33.&lt;br /&gt;&lt;br /&gt;A higher mean and tighter standard deviations means I didn't make every question incredibly difficult.  &lt;em&gt;I like to build the student's confidence&lt;/em&gt; by allowing them to answer most questions if they have a solid understanding of the material.  I want them to finish the course and feel that they can program CUDA in a production environment.  I don't want them to think "I couldn't do the CUDA assignments in class; there is no way I can program GPUs in the real world."&lt;br /&gt;&lt;br /&gt;With that said, this doesn't imply that I make homework problems trivial.  Have a &lt;a href="http://www.seas.upenn.edu/~cis565/Homework.htm"&gt;look&lt;/a&gt; for yourself.  In future semesters, I will continue to add harder questions, but perhaps weight them lower.&lt;br /&gt;&lt;br /&gt;Regardless of difficulty, it is actually hard to answer most of my questions by looking at the slides alone, which leads to our next topic...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;4.  Build an interactive classroom.&lt;/h2&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Z5xepkbOEkI/TcVRwtgkZCI/AAAAAAAABWA/WsF3wG91lio/s1600/deferredshader-20110419-1739168.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-Z5xepkbOEkI/TcVRwtgkZCI/AAAAAAAABWA/WsF3wG91lio/s320/deferredshader-20110419-1739168.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://smt565.blogspot.com/"&gt;Tile-based Techniques in Deferred Shading - Sean Thomas&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;With only 12 registered students, plus some lurkers as they are called, we were very successful in building an interactive culture in the classroom.  In an average 80 minute lecture, there might be 20-60 student comment/questions.  The best situation is when students start talking to each other and I largely remove myself from the discussion and just facilitate.&lt;br /&gt;&lt;br /&gt;To create an interactive culture, &lt;em&gt;my slides rarely have answers, but often have questions&lt;/em&gt;.  I start each topic with a question.  For example, when introducing memory coalescing, I ask if given a matrix in row-major order, is it better for a thread to access elements column by column or row by row?  Some questions are quite fun because the answer for a CPU and GPU are different.&lt;br /&gt;&lt;br /&gt;I think I got lucky with an interactive classroom.  I didn't realize it until &lt;a href="http://www.cis.upenn.edu/~milom/"&gt;Milo&lt;/a&gt; pointed it out, but students in my class self-selected; they were there because they wanted to learn about the GPU, not because it was a required course.  They could have taken any number of courses instead.  The other thing that helped with interaction was the class size.  With 12 students, I knew all of them reasonably well, and many of them knew each other.  I imagine it is a significant challenge to maintain interaction as class size increases.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;5.  Teaching at the graduate level requires depth of knowledge.&lt;/h2&gt;&lt;br /&gt;There is, of course, a downside to an interactive classroom:  hard questions.  &lt;em&gt;Students are looking for deep discussion beyond the surface of the slides&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jOqTDVwjsP0/TcVSQLlPx2I/AAAAAAAABWE/t5tdQgKCY2s/s1600/Checkpoint.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-jOqTDVwjsP0/TcVSQLlPx2I/AAAAAAAABWE/t5tdQgKCY2s/s320/Checkpoint.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://slstuart.blogspot.com/"&gt;Efﬁcient Real-Time Shadow Rendering -&amp;nbsp;Stuart Summerﬁeld&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;I'm a graphics guy, so I could handle most graphics questions with reasonably deep answers, usually from battle-tested experience.&lt;br /&gt;&lt;br /&gt;I'm also pretty familiar with the compute side of GPU programming, but I don't have the same day-to-day experience with it, so fielding some compute questions was hard.  I'm embarrassed to admit that one lecture early in the semester I was asked if the warp size is 32 threads and an SM (streaming multiprocessor) only has 8 SPs (stream processor) on the G80, how is the warp executed?  Good question.  Actually, great question.  It even appeared on our final.  At the time I didn't know.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;I suggest two ways to handle questions you don't know. &amp;nbsp;First, say you don't know and turn the question back to the class.  Sometimes someone will know.  Second, write it down and cover it at the start of the next lecture.  That is what I did for the above question and a handful of other questions throughout the semester.&lt;br /&gt;&lt;br /&gt;The wrong way to answer these questions is to make something up.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;6.  Reusing other instructor's material is hard.&lt;/h2&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-EEbbt-08jeI/TcVS_aqIc0I/AAAAAAAABWI/bPNnpTSOCSk/s1600/fluid.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-EEbbt-08jeI/TcVS_aqIc0I/AAAAAAAABWI/bPNnpTSOCSk/s1600/fluid.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://kgochev.blogspot.com/"&gt;GPU-Accelerated Fluid Simulation -&amp;nbsp;Kalin Gochev&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;I have a minor case of &lt;a href="http://www.joelonsoftware.com/articles/fog0000000007.html"&gt;Not-Invented-Here Syndrome&lt;/a&gt; when it comes to code, but I have a major case when it comes to course material, particularly slides.  I find it very difficult to teach off other people's slides.  &lt;em&gt;I want to present topics in a certain order, in a certain manner (usually with lots of questions), and I want certain examples (usually from my real-world experience)&lt;/em&gt;.  I want slides with lots of images and not a lot of text.&lt;br /&gt;&lt;br /&gt;Even though this course was taught for five years prior, the vast majority of my lectures were new or changed significantly - not because the old course material was bad, actually, it was quite good, but because I wanted a certain style.  This came at significant effort.  I found, on average, preparing an 80 minute lecture requires 12 to 15 hours, assuming some background in the material.  For example, even though I am familiar with GLSL, preparing a lecture is time consuming because I need to carefully craft the discussion and double check everything.  Preparing a lecture on topics I know less about, e.g., Fermi, is even more time consuming.&lt;br /&gt;&lt;br /&gt;I did reuse slides in one lecture though.  &lt;a href="http://graphics.stanford.edu/~kayvonf/"&gt;Kayvon Fatahalian&lt;/a&gt;'s presentation, &lt;a href="http://bps10.idav.ucdavis.edu/talks/03-fatahalian_gpuArchTeraflop_BPS_SIGGRAPH2010.pdf"&gt;From Shader Code to a Teraflop: How GPU Shader Cores Work&lt;/a&gt; is the best introduction to GPU architecture that I have ever seen - and it made teaching CUDA afterward much easier.  Reusing the slides was still quite a bit of work; I watched Kayvon's talk on &lt;a href="http://encore.siggraph.org/"&gt;SIGGRAPH Encore&lt;/a&gt; a few times and went over his slides and notes several times before I felt comfortable giving the talk. &amp;nbsp;By the way, Kayvon's slides are from the Beyond Programmable Shading SIGGRAPH course, which is a great resource in general (&lt;a href="http://s08.idav.ucdavis.edu/"&gt;2008&lt;/a&gt;, &lt;a href="http://s09.idav.ucdavis.edu/"&gt;2009&lt;/a&gt;, &lt;a href="http://bps10.idav.ucdavis.edu/"&gt;2010&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;7.  Teaching takes a tremendous amount of time.&lt;/h2&gt;&lt;br /&gt;On the surface, teaching one class doesn't sound like much work.  Teach two 1.5 hour lectures a week, hold another three hours of office hours, prepare lectures, and read and write some email.  What is that?  Maybe 10-20 hours a week?  For me, &lt;em&gt;it was more like 30-40 hours&lt;/em&gt;:  3 hours lecture + 3 office hours + 24-30 hours preparing lectures + 3-8 hours email.&lt;br /&gt;&lt;br /&gt;Email, really?  For this past semester, I have over 500 gmail conversations, each averaging between two and ten emails.  I feel staying on top of email is a huge part of teaching well.&lt;br /&gt;&lt;br /&gt;I'm under the impression that teaching a course for the second time is much less work.  I suspect the 12-15 hour prep time drops to 1-4 hours depending on how much material you change.  Also, as obvious as it sounds, make sure to create the homework/exam answers at the same time you make the questions!&lt;br /&gt;&lt;br /&gt;There were a few weeks were I didn't have to prepare lectures because the student's gave &lt;a href="http://www.seas.upenn.edu/~cis565/StudentWork.htm"&gt;presentations&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;8.  Student presentations are for building experience.&lt;/h2&gt;&lt;br /&gt;A tradition&amp;nbsp;&lt;a href="http://www.seas.upenn.edu/~kiderj/"&gt;Joe Kider&lt;/a&gt;&amp;nbsp;started a few years ago, and I continued, is for each student to use half a lecture to present a GPU-related topic.  The motivation was to help them research their project, &lt;em&gt;give them experience presenting&lt;/em&gt;, and provide the class with exposure to diverse GPU topics.&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GltuQ6TiYUc/TcVTsAaufPI/AAAAAAAABWM/RvHQpxPeRuU/s1600/graph.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="195" src="http://1.bp.blogspot.com/-GltuQ6TiYUc/TcVTsAaufPI/AAAAAAAABWM/RvHQpxPeRuU/s320/graph.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://vsampath.blogspot.com/"&gt;CBench: Analyzing Compute Performance for Modern &lt;br /&gt;NVIDIA and AMD GPUs -&amp;nbsp;Varun Sampath&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;As instructor, I helped provide the presentation's outline and gave the presenter immediate, detailed feedback.  I also tried to ask a lot of questions during their talk.  Depending on the topic, this can be challenging.  If a student presents on a topic I know a lot about, e.g., WebGL, I will have insightful comments and perhaps even thought-provoking questions, but if they present on something I know very little about, e.g., computer vision on the GPU, I have much less interesting things to say, but I still try to absorb as much as I can by asking questions that are probably obvious to them.&lt;br /&gt;&lt;br /&gt;Based on student feedback, their presentations were great for experience, but not necessarily for learning new material.  There are, of course, exceptions like Varun's &lt;a href="http://vsampath.blogspot.com/2011/04/larrabee.html"&gt;Larrabee&amp;nbsp;presentation&lt;/a&gt;; he probably covered the material better than I would have.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;9.  Recruit and empower a killer teaching assistant.&lt;/h2&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-p_W34o8HtS0/TcVOg6mOoVI/AAAAAAAABV0/Oe0GA6EejMI/s1600/city.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="137" src="http://2.bp.blogspot.com/-p_W34o8HtS0/TcVOg6mOoVI/AAAAAAAABV0/Oe0GA6EejMI/s320/city.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://webglexp.blogspot.com/"&gt;Rendering Massive Game Worlds on a WebGL &lt;br /&gt;&amp;nbsp;Based Browser -&amp;nbsp;Krishnan Ramachandran&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;I had the pleasure of working with &lt;a href="http://mccaffreydev.blogspot.com/"&gt;Jon McCaffrey&lt;/a&gt;, a bright masters student who is (by the time you read this) now at NVIDIA writing OpenGL drivers.  As an avid OpenGL developer, it makes me feel good to know that people like Jon are writing the drivers I rely on.&lt;br /&gt;&lt;br /&gt;I would say something like "let's do an assignment on SSAO" or "let's have the class code a globe with a gloss and bump map" to Jon, and suddenly his answer key would be coded over night, shortly followed by the assignment writeup.  I don't think I would have gotten through the semester without his hard work.  It's obvious to me that &lt;em&gt;the TA plays a key role in a course&lt;/em&gt;; having a good one makes a world of difference.  I owe a big thanks to &lt;a href="http://www.seas.upenn.edu/~kiderj/"&gt;Joe&lt;/a&gt; for recruiting Jon, and encouraging me to teach this course in the first place.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;10.  Teaching students with diverse backgrounds is hard.&lt;/h2&gt;&lt;br /&gt;Over the years, GPUs have evolved from fixed-function rasterization pipelines for graphics to fully-programmable massively-parallel processors.  As such, this course covers both the graphics and compute side of GPU programming.  Therefore, the course attracts computer engineering students who don't know the difference between a pixel and a fragment (well, they do now!) and computer graphics students who ask "Cycle?  What's a cycle?" (I think he was joking though).&lt;br /&gt;&lt;br /&gt;It is very hard to serve everyone well.  This is an area I need to improve.  More flexible "choose your own graphics or compute adventure" assignments will help, but ultimately, there needs to be two courses: &lt;em&gt;a rendering course and a programming massively-parallel processors course&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;11.  Embrace openness.&lt;/h2&gt;&lt;br /&gt;I like to do things out in the open, so I encouraged my students to do the same.  The result is &lt;em&gt;many students open sourced their projects and all students had public project &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2011/03/gpu-course-projects.html"&gt;blogs&lt;/a&gt;&lt;/em&gt;. To be fair, the blogs were required for their projects, another excellent tradition&amp;nbsp;&lt;a href="http://www.seas.upenn.edu/~kiderj/"&gt;Joe&lt;/a&gt;&amp;nbsp;started a few years ago. &amp;nbsp;Many students told me they plan to continue their project and/or blog beyond the class.  Great!  The more open source software - the better.  The more bright people sharing ideas via blogs - the better.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Drjp_uoZIps/TcVUSjW31RI/AAAAAAAABWQ/4K-XOrmaBFM/s1600/opt.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-Drjp_uoZIps/TcVUSjW31RI/AAAAAAAABWQ/4K-XOrmaBFM/s320/opt.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://fourieroptics.blogspot.com/"&gt;Radio Propagation Modeling via Fourier Optics -&amp;nbsp;Cem Karan&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h2&gt;12.  Know how to measure your success.&lt;/h2&gt;&lt;br /&gt;I don't have the official university-given survey results yet, but when asked to rate "knowing what I know now, I still would have taken this course" from 1 to 10 on my in-class survey, the average answer was 9.25.  Does this mean I was successful in teaching this course?  On one level, perhaps.&lt;br /&gt;&lt;br /&gt;But I really judge my success by the success of my students.  One student came running into the &lt;a href="http://cg.cis.upenn.edu/facilities.html"&gt;lab&lt;/a&gt; so excited that I thought he won the lottery.  Actually, he just received a job offer.  He went on to tell me that a big part of his interview success was explaining how he could improve the performance of their cloth simulation by running it on the GPU with CUDA.  I'll take that ten to one over an answer on a survey.&lt;br /&gt;&lt;br /&gt;When we ended the semester I reminded students of one way to be successful - &lt;em&gt;by immersing yourself with the best and brightest people you can find&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Full disclaimer:  These are my own opinions and do not necessarily reflect those of the &lt;a href="http://www.upenn.edu/"&gt;University of Pennsylvania&lt;/a&gt; or the &lt;a href="http://www.cis.upenn.edu/"&gt;Department of Computer and Information Science&lt;/a&gt;.  My entire teaching experience is teaching this course once, so you shouldn't consider me an authority or even take me very seriously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1602019594411959753?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1602019594411959753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/05/reflections-on-teaching-gpu-programming.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1602019594411959753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1602019594411959753'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/05/reflections-on-teaching-gpu-programming.html' title='Reflections on Teaching GPU Programming and Architecture'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-PnUkioVCZSs/TcVLxCVpLcI/AAAAAAAABVw/ObiFaCt8HfA/s72-c/MULTIPHASE_0004.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2283022367767315070</id><published>2011-04-04T20:00:00.010-04:00</published><updated>2011-05-30T08:15:54.106-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Under the Hood of Virtual Globes</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-snX0tLNrBzc/TZdhBPVTlpI/AAAAAAAABVU/wvO6zQvYx4E/s1600/underthehood.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;:  We have posted a &lt;a href="http://www.virtualglobebook.com/Under_the_Hood_of_Virtual_Globes.pdf"&gt;pdf&lt;/a&gt; of our slides on our book's &lt;a href="http://www.virtualglobebook.com/"&gt;website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We are teaching a half-day course, &lt;a href="http://www.com-geo.org/prog_courses.htm"&gt;Under the Hood of Virtual Globes&lt;/a&gt;, at &lt;a href="http://www.com-geo.org/"&gt;COM.Geo&lt;/a&gt; this May in Washington D.C.  COM.Geo is a conference on computing for geospatial research and applications.  Looks like a number of interesting &lt;a href="http://www.com-geo.org/prog_full_papers.htm"&gt;papers&lt;/a&gt; were accepted.&lt;br /&gt;&lt;br /&gt;We'll post slides from our course when we are finishing making them; in the meantime, here is the &lt;a href="http://www.com-geo.org/doc/prog/agi_course_pro.pdf"&gt;course outline&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2283022367767315070?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2283022367767315070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/04/under-hood-of-virtual-globes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2283022367767315070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2283022367767315070'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/04/under-hood-of-virtual-globes.html' title='Under the Hood of Virtual Globes'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-snX0tLNrBzc/TZdhBPVTlpI/AAAAAAAABVU/wvO6zQvYx4E/s72-c/underthehood.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7949116804649074756</id><published>2011-03-29T21:00:00.003-04:00</published><updated>2011-03-29T21:00:00.156-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GPU'/><title type='text'>GPU Course Projects</title><content type='html'>This semester I am teaching &lt;a href="http://www.seas.upenn.edu/~cis565/"&gt;GPU Programming and Architecture&lt;/a&gt; at the University of Pennsylvania.  My students have chosen some interesting projects ranging from rendering to simulation to GPU computing and beyond.  Here are their blogs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matthewahn.blogspot.com/"&gt;Modeling and Simulating of a Candle Lifecycle&lt;/a&gt; - Matthew Ahn&lt;/li&gt;&lt;li&gt;&lt;a href="http://spevis.blogspot.com/"&gt;Fast Pedestrian Recognition on the GPU&lt;/a&gt; - Fan Deng&lt;/li&gt;&lt;li&gt;&lt;a href="http://kgochev.blogspot.com/"&gt;Semi-Lagrangian Fluid Simulation&lt;/a&gt; - Kalin Gochev&lt;/li&gt;&lt;li&gt;&lt;a href="http://geepeeyou.wordpress.com/"&gt;Centralized GPU Process Handling&lt;/a&gt; - Arthur G&lt;/li&gt;&lt;li&gt;&lt;a href="http://fastfluids.blogspot.com/"&gt;Screen Space Fluid Rendering&lt;/a&gt; - Terry Kaleas&lt;/li&gt;&lt;li&gt;&lt;a href="http://fourieroptics.blogspot.com/"&gt;Fourier Optics&lt;/a&gt; - Cem Karan&lt;/li&gt;&lt;li&gt;&lt;a href="http://webglexp.blogspot.com/"&gt;Rendering of Massive Game Worlds on a WebGL based Web Browser&lt;/a&gt; - Krishnan Ramachandran&lt;/li&gt;&lt;li&gt;&lt;a href="http://hanli22nd.blogspot.com/"&gt;Depth of Field on Mobile Devices&lt;/a&gt; - Han Li and Qing Sun&lt;/li&gt;&lt;li&gt;&lt;a href="http://vsampath.blogspot.com/"&gt;AMD Radeon HD 69xx and NVIDIA Fermi Benchmarks&lt;/a&gt; - Varun Sampath&lt;/li&gt;&lt;li&gt;&lt;a href="http://slstuart.blogspot.com/"&gt;Efficient Shadow Rendering&lt;/a&gt; - Stuart Summerfield&lt;/li&gt;&lt;li&gt;&lt;a href="http://smt565.blogspot.com/"&gt;Deferred Shader with Screen Space Classification&lt;/a&gt; - Sean Thomas&lt;/li&gt;&lt;/ul&gt;I'm sure they would love to hear ideas from outsiders so don't be shy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7949116804649074756?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7949116804649074756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/03/gpu-course-projects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7949116804649074756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7949116804649074756'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/03/gpu-course-projects.html' title='GPU Course Projects'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-158922629937599044</id><published>2011-03-09T19:00:00.003-05:00</published><updated>2011-03-09T19:00:05.543-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Our Book Cover</title><content type='html'>We are pumped that the cover for our book is ready:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="493" width="400" src="http://2.bp.blogspot.com/-QEA50o1fVfE/TXgH3HJPtqI/AAAAAAAABVI/I5R7nzVnq-c/s400/cover.png" /&gt;&lt;/div&gt;&lt;br /&gt;When you work out a book contract, one thing you can negotiate is say on the cover.  We did not negotiate for this - thankfully, we didn't need to.  Our publisher was nice enough to take our suggested cover pretty much as is.  We, of course, can't take credit for the work; I would be quite embarrassed to reveal the original artwork I created.  Instead, two of our fellow &lt;a href="http://www.agi.com/"&gt;AGI&lt;/a&gt;er's, Fran Kelly and Jason Martin, did a bang up job designing the cover and creating the artwork.  Even cooler, they used a product we work on, &lt;a href="http://en.wikipedia.org/wiki/Satellite_Tool_Kit"&gt;STK&lt;/a&gt;, to create the visuals.  Total overkill perhaps, but cool nonetheless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-158922629937599044?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/158922629937599044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/03/our-book-cover.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/158922629937599044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/158922629937599044'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/03/our-book-cover.html' title='Our Book Cover'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QEA50o1fVfE/TXgH3HJPtqI/AAAAAAAABVI/I5R7nzVnq-c/s72-c/cover.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6117569283648923440</id><published>2011-03-04T18:45:00.000-05:00</published><updated>2011-03-04T18:45:00.709-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>GLSL Engine Uniforms Revisited</title><content type='html'>&lt;a href="http://www.amazon.com/Game-Engine-Gems-Eric-Lengyel/dp/1568814372?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=bil&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"&gt;&lt;img alt="Game Engine Gems 2" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;Format=_SL160_&amp;amp;ASIN=1568814372&amp;amp;tag=virtua06a-20" /&gt;&lt;/a&gt;&lt;br /&gt;A few months back, I &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/10/game-engine-gems-volume-2.html"&gt;mentioned&lt;/a&gt; my two articles in &lt;a href="http://www.amazon.com/Game-Engine-Gems-Eric-Lengyel/dp/1568814372?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Game Engine Gems 2&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814372" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;.  Now that the book is available, I want to revisit a piece of advice in one article, &lt;em&gt;A Framework for GLSL Engine Uniforms&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;This article is about implementing a framework for GLSL uniforms that are automatically set by the engine.  A shader author simply declares the uniform to use it.  Since the engine has a list of names for all engine uniforms, it can identify what engine uniforms a shader uses, and track them accordingly.  A shader author is ensured that the engine will update a uniform to the appropriate value before the shader is invoked.  In addition to standard stuff like transformation matrices, these uniforms are also used for more engine-specific values, e.g., time, sun position, etc.&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;amp;l=bil&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=1568814372" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&lt;/div&gt;At the end of the article I suggest:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you are up for parsing GLSL code, you could also eliminate the need for &lt;br /&gt;shader authors to declare engine uniforms by carefully searching the shader's &lt;br /&gt;source for them. This task in nontrivial considering preprocessor transformations, &lt;br /&gt;multiline comments, strings, and compiler optimizations that could eliminate &lt;br /&gt;uniforms altogether&lt;/blockquote&gt;&lt;br /&gt;Well, I should have thought more about this because you do not need to parse GLSL for uniform names to eliminate the need to declare engine uniforms.  Foruntently, it is much easier; since &lt;a href="http://www.opengl.org/sdk/docs/man/xhtml/glShaderSource.xml"&gt;glShaderSource&lt;/a&gt; takes an array of strings, just have one string contain the declarations for &lt;em&gt;all&lt;/em&gt; the engine uniforms and let the compiler throw out the unused ones.&lt;br /&gt;&lt;br /&gt;I've used this approach for a few months now and am quite happy with it.  At first, I was not sure about how useful it would be, but I've found it makes copying and pasting code among shaders much easier because I don't have to remember to declare engine uniforms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6117569283648923440?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6117569283648923440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/03/glsl-engine-uniforms-revisited.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6117569283648923440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6117569283648923440'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/03/glsl-engine-uniforms-revisited.html' title='GLSL Engine Uniforms Revisited'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-8383756451505470382</id><published>2011-02-03T19:04:00.017-05:00</published><updated>2011-05-27T19:56:38.856-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Writing Tips'/><title type='text'>Syntax highlighting C# and GLSL source code with LaTeX and the 'Listings' package</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-aBTlP-N-wSs/TeA5mpy3umI/AAAAAAAAAE4/skQStscEDc0/s1600/listingidentifiers.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_d5C3_Dbd94k/TUtdjhYnWyI/AAAAAAAAAEk/wezybtfzg44/s1600/After.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 202px;" src="http://3.bp.blogspot.com/_d5C3_Dbd94k/TUtdjhYnWyI/AAAAAAAAAEk/wezybtfzg44/s400/After.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569648229012167458" /&gt;&lt;/a&gt;We wanted to syntax highlight the source code listings in &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/about.html"&gt;our book&lt;/a&gt; in order to make them easier to read.  Unfortunately, the languages used for most of the listings, C# and GLSL, are not supported out of the box by the LaTeX &lt;b&gt;Listings&lt;/b&gt; package.  What to do?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, C# and GLSL both have roots in the C language, so we started out tagging  our code listings as C++ in order to get some minimal highlighting.  The results aren't very good with that approach.  Keywords that are shared with C++, like &lt;i&gt;float&lt;/i&gt; and &lt;i&gt;return&lt;/i&gt;, are nicely highlighted, but not so with&lt;/div&gt;GLSL-specific keywords like &lt;i&gt;vec3&lt;/i&gt;.  And wouldn't it be nice if built-in GLSL functions like &lt;i&gt;sqrt&lt;/i&gt;&lt;img src="http://4.bp.blogspot.com/_d5C3_Dbd94k/TUtdrTGhyQI/AAAAAAAAAEs/iBPSvZtFG4s/s400/MoreHighlightedCSharp.png" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 86px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5569648362617161986" /&gt;&lt;div&gt;and &lt;i&gt;cos &lt;/i&gt;were highlighted, like they are in &lt;a href="http://nshader.codeplex.com/"&gt;NShader&lt;/a&gt;?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I should mention before I get too far that I'm far from a LaTeX expert.&lt;/div&gt;&lt;div&gt; What I'm about to describe worked for me, but please let me know if I'm doing something odd.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;C# and GLSL language definitions&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Listings &lt;/b&gt;LaTeX&lt;b&gt; &lt;/b&gt;package makes it fairly easy to define new languages.  Several language definitions for C# can be found around the web.  Here's ours:&lt;/div&gt;&lt;pre&gt;\lstdefinelanguage{CSharp}&lt;br /&gt;{&lt;br /&gt;sensitive=true,&lt;br /&gt;morekeywords=[1]{&lt;br /&gt;abstract, as, base, break, case,&lt;br /&gt;catch, checked, class, const, continue,&lt;br /&gt;default, delegate, do, else, enum,&lt;br /&gt;event, explicit, extern, false,&lt;br /&gt;finally, fixed, for, foreach, goto, if,&lt;br /&gt;implicit, in, interface, internal, is,&lt;br /&gt;lock, namespace, new, null, operator,&lt;br /&gt;out, override, params, private,&lt;br /&gt;protected, public, readonly, ref,&lt;br /&gt;return, sealed, sizeof, stackalloc,&lt;br /&gt;static, struct, switch, this, throw,&lt;br /&gt;true, try, typeof, unchecked, unsafe,&lt;br /&gt;using, virtual, volatile, while, bool,&lt;br /&gt;byte, char, decimal, double, float,&lt;br /&gt;int, lock, object, sbyte, short, string,&lt;br /&gt;uint, ulong, ushort, void},&lt;br /&gt;morecomment=[l]{//},&lt;br /&gt;morecomment=[s]{/*}{*/},&lt;br /&gt;morecomment=[l][keywordstyle4]{\#},&lt;br /&gt;morestring=[b]",&lt;br /&gt;morestring=[b]',&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Surprisingly, we weren't able to find a language definition for GLSL.  It was pretty easy to put one together based on the GLSL spec, though:&lt;/div&gt;&lt;pre&gt;\lstdefinelanguage{GLSL}&lt;br /&gt;{&lt;br /&gt;sensitive=true,&lt;br /&gt;morekeywords=[1]{&lt;br /&gt;attribute, const, uniform, varying,&lt;br /&gt;layout, centroid, flat, smooth,&lt;br /&gt;noperspective, break, continue, do,&lt;br /&gt;for, while, switch, case, default, if,&lt;br /&gt;else, in, out, inout, float, int, void,&lt;br /&gt;bool, true, false, invariant, discard,&lt;br /&gt;return, mat2, mat3, mat4, mat2x2, mat2x3,&lt;br /&gt;mat2x4, mat3x2, mat3x3, mat3x4, mat4x2,&lt;br /&gt;mat4x3, mat4x4, vec2, vec3, vec4, ivec2,&lt;br /&gt;ivec3, ivec4, bvec2, bvec3, bvec4, uint,&lt;br /&gt;uvec2, uvec3, uvec4, lowp, mediump, highp,&lt;br /&gt;precision, sampler1D, sampler2D, sampler3D,&lt;br /&gt;samplerCube, sampler1DShadow,&lt;br /&gt;sampler2DShadow, samplerCubeShadow,&lt;br /&gt;sampler1DArray, sampler2DArray,&lt;br /&gt;sampler1DArrayShadow, sampler2DArrayShadow,&lt;br /&gt;isampler1D, isampler2D, isampler3D,&lt;br /&gt;isamplerCube, isampler1DArray,&lt;br /&gt;isampler2DArray, usampler1D, usampler2D,&lt;br /&gt;usampler3D, usamplerCube, usampler1DArray,&lt;br /&gt;usampler2DArray, sampler2DRect,&lt;br /&gt;sampler2DRectShadow, isampler2DRect,&lt;br /&gt;usampler2DRect, samplerBuffer,&lt;br /&gt;isamplerBuffer, usamplerBuffer, sampler2DMS,&lt;br /&gt;isampler2DMS, usampler2DMS,&lt;br /&gt;sampler2DMSArray, isampler2DMSArray,&lt;br /&gt;usampler2DMSArray, struct},&lt;br /&gt;morekeywords=[2]{&lt;br /&gt;radians,degrees,sin,cos,tan,asin,acos,atan,&lt;br /&gt;atan,sinh,cosh,tanh,asinh,acosh,atanh,pow,&lt;br /&gt;exp,log,exp2,log2,sqrt,inversesqrt,abs,sign,&lt;br /&gt;floor,trunc,round,roundEven,ceil,fract,mod,modf,&lt;br /&gt;min,max,clamp,mix,step,smoothstep,isnan,isinf,&lt;br /&gt;floatBitsToInt,floatBitsToUint,intBitsToFloat,&lt;br /&gt;uintBitsToFloat,length,distance,dot,cross,&lt;br /&gt;normalize,faceforward,reflect,refract,&lt;br /&gt;matrixCompMult,outerProduct,transpose,&lt;br /&gt;determinant,inverse,lessThan,lessThanEqual,&lt;br /&gt;greaterThan,greaterThanEqual,equal,notEqual,&lt;br /&gt;any,all,not,textureSize,texture,textureProj,&lt;br /&gt;textureLod,textureOffset,texelFetch,&lt;br /&gt;texelFetchOffset,textureProjOffset,&lt;br /&gt;textureLodOffset,textureProjLod,&lt;br /&gt;textureProjLodOffset,textureGrad,&lt;br /&gt;textureGradOffset,textureProjGrad,&lt;br /&gt;textureProjGradOffset,texture1D,texture1DProj,&lt;br /&gt;texture1DProjLod,texture2D,texture2DProj,&lt;br /&gt;texture2DLod,texture2DProjLod,texture3D,&lt;br /&gt;texture3DProj,texture3DLod,texture3DProjLod,&lt;br /&gt;textureCube,textureCubeLod,shadow1D,shadow2D,&lt;br /&gt;shadow1DProj,shadow2DProj,shadow1DLod,&lt;br /&gt;shadow2DLod,shadow1DProjLod,shadow2DProjLod,&lt;br /&gt;dFdx,dFdy,fwidth,noise1,noise2,noise3,noise4,&lt;br /&gt;EmitVertex,EndPrimitive},&lt;br /&gt;morekeywords=[3]{&lt;br /&gt;gl_VertexID,gl_InstanceID,gl_Position,&lt;br /&gt;gl_PointSize,gl_ClipDistance,gl_PerVertex,&lt;br /&gt;gl_Layer,gl_ClipVertex,gl_FragCoord,&lt;br /&gt;gl_FrontFacing,gl_ClipDistance,gl_FragColor,&lt;br /&gt;gl_FragData,gl_MaxDrawBuffers,gl_FragDepth,&lt;br /&gt;gl_PointCoord,gl_PrimitiveID,&lt;br /&gt;gl_MaxVertexAttribs,gl_MaxVertexUniformComponents,&lt;br /&gt;gl_MaxVaryingFloats,gl_MaxVaryingComponents,&lt;br /&gt;gl_MaxVertexOutputComponents,&lt;br /&gt;gl_MaxGeometryInputComponents,&lt;br /&gt;gl_MaxGeometryOutputComponents,&lt;br /&gt;gl_MaxFragmentInputComponents,&lt;br /&gt;gl_MaxVertexTextureImageUnits,&lt;br /&gt;gl_MaxCombinedTextureImageUnits,&lt;br /&gt;gl_MaxTextureImageUnits,&lt;br /&gt;gl_MaxFragmentUniformComponents,&lt;br /&gt;gl_MaxDrawBuffers,gl_MaxClipDistances,&lt;br /&gt;gl_MaxGeometryTextureImageUnits,&lt;br /&gt;gl_MaxGeometryOutputVertices,&lt;br /&gt;gl_MaxGeometryOutputVertices,&lt;br /&gt;gl_MaxGeometryTotalOutputComponents,&lt;br /&gt;gl_MaxGeometryUniformComponents,&lt;br /&gt;gl_MaxGeometryVaryingComponents,gl_DepthRange},&lt;br /&gt;morecomment=[l]{//},&lt;br /&gt;morecomment=[s]{/*}{*/},&lt;br /&gt;morecomment=[l][keywordstyle4]{\#},&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;GLSL has a ton of keywords, especially since we've included the built-in functions and variables in separate keyword lists so that they can be highlighted separately.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Coloring the source code&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now that the languages are defined, we can specify how they are highlighted.  The color scheme presented here is loosely based on Visual Studio and NShader:&lt;br /&gt;&lt;pre&gt;\lstset{&lt;br /&gt;backgroundcolor=\color[rgb]{0.95, 0.95, 0.95},&lt;br /&gt;tabsize=2,&lt;br /&gt;rulecolor=,&lt;br /&gt;basicstyle=\scriptsize,&lt;br /&gt;upquote=true,&lt;br /&gt;aboveskip={1.5\baselineskip},&lt;br /&gt;columns=fixed,&lt;br /&gt;showstringspaces=false,&lt;br /&gt;extendedchars=true,&lt;br /&gt;breaklines=true,&lt;br /&gt;prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},&lt;br /&gt;frame=single,&lt;br /&gt;showtabs=false,&lt;br /&gt;showspaces=false,&lt;br /&gt;showstringspaces=false,&lt;br /&gt;identifierstyle=\ttfamily,&lt;br /&gt;keywordstyle=\color[rgb]{1.0,0,0},&lt;br /&gt;keywordstyle=[1]\color[rgb]{0,0,0.75},&lt;br /&gt;keywordstyle=[2]\color[rgb]{0.5,0.0,0.0},&lt;br /&gt;keywordstyle=[3]\color[rgb]{0.127,0.427,0.514},&lt;br /&gt;keywordstyle=[4]\color[rgb]{0.4,0.4,0.4},&lt;br /&gt;commentstyle=\color[rgb]{0.133,0.545,0.133},&lt;br /&gt;stringstyle=\color[rgb]{0.639,0.082,0.082},&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;I was surprised to learn that the &lt;b&gt;Listings &lt;/b&gt;package does not allow styles be defined per language; a single style is applied to all languages.  This is not as limiting as it at first appears, however, because we can define multiple groups of keywords and specify a style for each group individually.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the languages and style defined, we can write LaTeX code like this:&lt;/div&gt;&lt;pre&gt;\begin{lstlisting}[language=GLSL]&lt;br /&gt;// Vertex shader&lt;br /&gt;in vec4 position;&lt;br /&gt;uniform mat4 og_modelViewPerspectiveMatrix;&lt;br /&gt;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt;gl_Position = og_modelViewPerspectiveMatrix * position;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Fragment shader&lt;br /&gt;out vec3 fragmentColor;&lt;br /&gt;void main() { fragmentColor = vec3(0.0, 0.0, 0.0); }&lt;br /&gt;\end{lstlisting}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;To generate a nice listing like this:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_d5C3_Dbd94k/TUtUARgJlsI/AAAAAAAAAEE/v8CF1llfshA/s400/HighlightedGLSL.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569637727848732354" style="cursor: pointer; width: 400px; height: 124px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Highlighting type names&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;You may have noticed that the Visual Studio editor highlights the names of classes, structs, interfaces, and enums.  How can we do that with LaTeX?  LaTeX, of course, has no idea which identifiers in our source listings are class names and which are the names of variables, methods, etc., so we have to tell it.  We can do that by specifying, for each listing, the identifiers that belong to a keyword group:&lt;/div&gt;&lt;pre&gt;\begin{lstlisting}[language=CSharp,classoffset=2,morekeywords={GL,EnableCap}]&lt;br /&gt;GL.Enable(EnableCap.DepthTest);&lt;br /&gt;// ... Set other states&lt;br /&gt;Render();&lt;br /&gt;\end{lstlisting}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Which produces the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://4.bp.blogspot.com/_d5C3_Dbd94k/TUtWwOJiPqI/AAAAAAAAAEM/FQ0TLN0tebA/s400/HighlightedCSharp.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5569640750605549218" style="cursor: pointer; width: 400px; height: 38px; " /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice that &lt;i&gt;GL &lt;/i&gt;and &lt;i&gt;EnableCap&lt;/i&gt; are highlighted because they have been explicitly listed, using &lt;i&gt;classoffset&lt;/i&gt; and &lt;i&gt;morekeywords&lt;/i&gt;, as belonging to keyword group 3 - an offset of 2 from the base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Limitations&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Listings&lt;/b&gt; package has a couple of limitations that we were unable to work around:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Highlighting is entirely keyword based and cannot take context into account.  It's fairly common in C# to have a single identifier that is a class name in one context and a property name in another context.  If both usages of the identifier occur in a single listing, there does not appear to be any way to highlight the identifier &lt;i&gt;only&lt;/i&gt; where it refers to a class name.  Either it's highlighted everywhere, or nowhere.  &lt;i&gt;Update 2011/05/27: I found a way to do this after all.  See below.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;The &lt;b&gt;Listings&lt;/b&gt; package allows us to specify a keyword prefix so that all keywords starting with a character sequence are highlighted.  Unfortunately, only a single prefix can be specified.  It would have been helpful to highlight all identifiers in GLSL listings that start with &lt;i&gt;gl&lt;/i&gt; or &lt;i&gt;og&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;There does not appear to be a way to highlight numeric literals (such as 1.23) or operators (such as ==).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt; If you know a solution to any of these problems, please let me know!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;Update 2011/05/27&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;I wrote above that I was unable to find a way to highlight some occurrences of an identifier but not others within a single listing.  It turns out there is a way after all.  The trick is to insert a do-nothing "escape to LaTeX" somewhere in the middle of the occurrence of the identifier that you don't want highlighted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, define an &lt;i&gt;escapechar&lt;/i&gt;.  It can be any character you want, so long as the character will not otherwise occur in your listings.  Here I've used backtick (`) as my &lt;i&gt;escapechar&lt;/i&gt;:&lt;/div&gt;&lt;pre&gt;\lstset{&lt;br /&gt;...&lt;br /&gt;escapechar=`,&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Then write your listing like this:&lt;/div&gt;&lt;pre&gt;\begin{lstlisting}[language=CSharp, caption={RenderState Properties.},classoffset=2,morekeywords={RenderState,PrimitiveRestart,FacetCulling,RasterizationMode,ScissorTest,StencilTest,DepthTest,DepthRange,Blending,ColorMask}]&lt;br /&gt;public class RenderState&lt;br /&gt;{&lt;br /&gt;public PrimitiveRestart P``rimitiveRestart { get; set; }&lt;br /&gt;public FacetCulling F``acetCulling { get; set; }&lt;br /&gt;public RasterizationMode R``asterizationMode { get; set; }&lt;br /&gt;public ScissorTest S``cissorTest { get; set; }&lt;br /&gt;public StencilTest S``tencilTest { get; set; }&lt;br /&gt;public DepthTest D``epthTest { get; set; }&lt;br /&gt;public DepthRange D``epthRange { get; set; }&lt;br /&gt;public Blending B``lending { get; set; }&lt;br /&gt;public ColorMask C``olorMask { get; set; }&lt;br /&gt;public bool DepthMask { get; set; }&lt;br /&gt;}&lt;br /&gt;\end{lstlisting}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Notice the double backticks (``) in the names of the properties.  The first backtick escapes to LaTeX mode, and the second returns to listing mode.  You could include LaTeX commands between the backticks, but there's no need; the interruption alone is enough to cause the identifier to not be highlighted.  LaTeX will render the listing above like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/-aBTlP-N-wSs/TeA5mpy3umI/AAAAAAAAAE4/skQStscEDc0/s400/listingidentifiers.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5611548471920671330" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 400px; height: 135px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-8383756451505470382?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/8383756451505470382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/02/syntax-highlighting-c-and-glsl-source.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/8383756451505470382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/8383756451505470382'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/02/syntax-highlighting-c-and-glsl-source.html' title='Syntax highlighting C# and GLSL source code with LaTeX and the &apos;Listings&apos; package'/><author><name>Kevin Ring</name><uri>http://www.blogger.com/profile/06646223287468895533</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='24' src='http://3.bp.blogspot.com/_d5C3_Dbd94k/TLZdMKuGiAI/AAAAAAAAACg/JoOhQyXMhNE/S220/Blogger.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_d5C3_Dbd94k/TUtdjhYnWyI/AAAAAAAAAEk/wezybtfzg44/s72-c/After.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-222355458578366602</id><published>2011-01-02T14:00:00.000-05:00</published><updated>2011-01-02T14:00:01.077-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><title type='text'>Manuscript Submitted</title><content type='html'>Kevin and I submitted our manuscript today.  Writing this book was even harder than I thought.  It was particularly time consuming because of the amount of &lt;a href="http://sourceforge.net/projects/miniglobe/"&gt;code&lt;/a&gt; we also wrote.  It was great fun though, and all the reviewers kept us engaged.&lt;br /&gt;&lt;br /&gt;We'd like to post some samples in the next month or two.  Check out the&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;a href="https://sites.google.com/a/virtualglobebook.com/virtual-globe-book/blog-attachments/VirtualGlobeBookTableOfContents.pdf"&gt;Table of contents&lt;/a&gt; [pdf]&lt;br /&gt;&lt;br /&gt;and let us know what we should post by leaving a comment or emailing us:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;authors@virtualglobebook.com&lt;br /&gt;&lt;br /&gt;Also, those readers subscribed to our blog may have noticed a draft of this post in your reader a week ago.  Sorry, I scheduled the post for 2010 instead of 2011!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-222355458578366602?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/222355458578366602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2011/01/manuscript-submitted.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/222355458578366602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/222355458578366602'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2011/01/manuscript-submitted.html' title='Manuscript Submitted'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2522677110909343196</id><published>2010-12-20T20:00:00.007-05:00</published><updated>2010-12-20T20:00:01.808-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Book Title and OpenGlobe Update</title><content type='html'>Previously, I &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/11/k-peters-catalog-amazon-and-more.html"&gt;mentioned&lt;/a&gt; we were working on finalizing our book's title.  Now it's finalized:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;3D Engine Design for Virtual Globes&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I think the "3D Engine Design" branding will help get the book more attention by developers who might not initially think they are interested in virtual globes.  Many book's have nicknames, so we're calling ours the &lt;i&gt;Virtual Globe Book&lt;/i&gt; for short.  Let's see if it sticks.&lt;br /&gt;&lt;br /&gt;This blog still remains as &lt;i&gt;Virtual Globe and Terrain Rendering&lt;/i&gt;.  Since it is about more than just our book (or at least it will be), it doesn't need to stay in sync with the book's title.  The url will not change either.&lt;br /&gt;&lt;br /&gt;In other news, all of our example code now runs on Linux.  After our &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/11/openglobe-on-linux.html"&gt;first port&lt;/a&gt;, two examples needed more work.&lt;br /&gt;&lt;br /&gt;Finally, we changed the license for the example code from the &lt;a href="http://www.boost.org/users/license.html"&gt;boost license&lt;/a&gt; to the &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;MIT license&lt;/a&gt;, mainly because the MIT license is more popular.  All we care about is that readers, and random people that stumble upon our &lt;a href="http://sourceforge.net/projects/miniglobe/"&gt;code&lt;/a&gt;, can use it unrestricted, including in commercial applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2522677110909343196?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2522677110909343196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/12/book-title-and-openglobe-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2522677110909343196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2522677110909343196'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/12/book-title-and-openglobe-update.html' title='Book Title and OpenGlobe Update'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7294786417098752588</id><published>2010-12-18T11:00:00.000-05:00</published><updated>2010-12-18T11:00:06.333-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><title type='text'>Math Foundations</title><content type='html'>We haven't been writing chapters in the order they will appear in our book.  The most recent chapter, &lt;i&gt;Math Foundations&lt;/i&gt;, is no exception.  It will be Chapter 2, but is basically the last chapter I am writing.  After this, I only have to finish the introduction and smooth out a few other sections.  Kevin has a &lt;i&gt;similar&lt;/i&gt; amount of work left, so we are on schedule!&lt;br /&gt;&lt;br /&gt;This chapter is not on math foundations for general 3D graphics; rather, it is on useful mathematics for virtual globes, with a focus on &lt;a href="http://en.wikipedia.org/wiki/Ellipsoid"&gt;ellipsoids&lt;/a&gt;.  This chapter is unique in that it contains some derivations, but we are computer science practitioners, not mathematicians, so it also provides working code in a handy &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Geometry/Ellipsoid.cs"&gt;Ellipsoid&lt;/a&gt; class.  Our colleague, &lt;a href="http://www.linkedin.com/in/jimwoodburn"&gt;Jim Woodburn&lt;/a&gt;, helped significantly with the derivations.&lt;br /&gt;&lt;br /&gt;This chapter covers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Geographic (longitude, latitude, height) and WGS84 (x, y, z) coordinates.&lt;/li&gt;&lt;li&gt;Ellipsoids&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Oblate spheroids (Earth's shape).&lt;/li&gt;&lt;li&gt;Surface normals:  geodetic vs. geocentric.&lt;/li&gt;&lt;li&gt;Conversion between geographic and WGS84 coordinates.&lt;/li&gt;&lt;li&gt;Scaling a arbitrary point in space to the ellipsoid surface.&lt;/li&gt;&lt;li&gt;Curves on ellipsoids.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;I also wrote two related examples applications, &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter02/EllipsoidSurfaceNormals/"&gt;one&lt;/a&gt; demonstrating geodetic and geocentric surface normals, and &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter02/Curves/"&gt;another&lt;/a&gt; for computing curves on an ellipsoid by slicing a plane through it.  Here's a video of the later:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/woYwg5TgqQA?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/woYwg5TgqQA?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&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/935410731531028523-7294786417098752588?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7294786417098752588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/12/math-foundations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7294786417098752588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7294786417098752588'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/12/math-foundations.html' title='Math Foundations'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1102012295059774653</id><published>2010-11-29T19:00:00.075-05:00</published><updated>2010-11-29T19:00:00.947-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Writing Tips'/><title type='text'>A Tip for Finishing Chapters</title><content type='html'>It's always fun to start writing a chapter, especially if it is on a particularly interesting topic.  Finishing the chapter can be a bit harder - sounds like a software project, right?&lt;br /&gt;&lt;br /&gt;Finishing involves lots of details:  rewording, double checking equations, actually doing TODOs (or &lt;i&gt;sometimes&lt;/i&gt; just removing them), etc.  After reading and writing so much about a topic, I want to move on to the next chapter - but I can't, not until I finish what I started.&lt;br /&gt;&lt;br /&gt;A tip that helps me finish a chapter is I tell people when I'm going to finish it.  In particular, I email potential reviewers asking them if they are interested in reviewing it, and telling them when I expect to be done.  I have to finish it now; I can't ask these kind people to do me a favor, and not follow through.&lt;br /&gt;&lt;br /&gt;This tip doesn't work magic, but it helps keep me on track.  I can't expect to write 30 pages overnight just because I told someone I would.  But if I'm 2/3 through a chapter, I can predict how long it will take to finish at a reasonable pace, and tell reviewers to help ensure I keep that pace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1102012295059774653?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1102012295059774653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/11/tip-for-finishing-chapters.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1102012295059774653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1102012295059774653'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/11/tip-for-finishing-chapters.html' title='A Tip for Finishing Chapters'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6719978263391866370</id><published>2010-11-24T17:00:00.075-05:00</published><updated>2010-12-07T08:57:00.716-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>OpenGlobe on Linux</title><content type='html'>We develop the &lt;a href="http://sourceforge.net/projects/miniglobe/"&gt;example code&lt;/a&gt; for our book using Windows, but we realize not all readers use Windows.  The good news for them is, over the past few days, we got the vast majority of our code to build and run on Linux using &lt;a href="http://www.mono-project.com/Main_Page"&gt;Mono&lt;/a&gt;.  Here's a screen shot of &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter04/LatitudeLongitudeGrid/"&gt;one example&lt;/a&gt; from the globe rendering chapter:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img border="0" height="354" src="http://1.bp.blogspot.com/_wUfqk3kFyG4/TO1_FaFjGAI/AAAAAAAABTo/M8VL56lJ3QI/s1600/Grid.png" width="443" /&gt;&lt;/div&gt;&lt;br /&gt;We tested using &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 10.04, which comes prepackaged with &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; 2.2 and Mono 2.4.4.  Our code builds cleanly with no warnings, and, thankfully, all of our unit tests pass:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img border="0" height="344" src="http://4.bp.blogspot.com/_wUfqk3kFyG4/TO1_mqYYBdI/AAAAAAAABTs/VX6eKhohUTI/s1600/NUnit.png" width="594" /&gt;&lt;/div&gt;&lt;br /&gt;(Yes, we actually write unit tests for the book code.)  We need to investigate our examples that use a third party &lt;a href="http://en.wikipedia.org/wiki/Shapefile"&gt;Shapefile&lt;/a&gt; reader a bit more, but we may wind up writing our own Shapefile reader when the manuscript is done.&lt;br /&gt;&lt;br /&gt;I have to say that I am quite impressed with Mono, MonoDevelop, &lt;a href="http://www.opentk.com/"&gt;OpenTK&lt;/a&gt;, and NVIDIA's Linux drivers.  Porting to Linux was even easier than I hoped.&lt;br /&gt;&lt;br /&gt;We also plan to test on Mac when Apple releases OpenGL 3.3 drivers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6719978263391866370?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6719978263391866370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/11/openglobe-on-linux.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6719978263391866370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6719978263391866370'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/11/openglobe-on-linux.html' title='OpenGlobe on Linux'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wUfqk3kFyG4/TO1_FaFjGAI/AAAAAAAABTo/M8VL56lJ3QI/s72-c/Grid.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2753351695777107963</id><published>2010-11-21T14:00:00.001-05:00</published><updated>2010-12-07T08:49:21.977-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><category scheme='http://www.blogger.com/atom/ns#' term='Precision'/><title type='text'>Vertex Transform Precision</title><content type='html'>I just finished writing a chapter on a rendering artifact that many people don't even know exists until they try to use massive world coordinates, and suddenly objects start to bounce or jitter as shown in this video:&lt;br /&gt;&lt;br /&gt;&lt;object align="center" width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/Zgc7QAMSZgI?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/Zgc7QAMSZgI?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Eliminating jitter is important for high precision rendering in virtual globes, and in massive-world games, like &lt;a href="http://www.microsoft.com/Products/Games/FSInsider/developers/Pages/GlobalTerrain.aspx"&gt;flight simulators&lt;/a&gt;.  When world coordinates are large, yet users can zoom in very close to objects, floating point round-off errors manifest themselves as jitter.&lt;br /&gt;&lt;br /&gt;This chapter is on techniques for eliminating jitter.  Major topics include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Why exactly jitter artifacts occur.&lt;/li&gt;&lt;li&gt;Eliminating jitter by rendering relative to center, i.e., using a &lt;a href="http://www.floatingorigin.com/"&gt;floating origin&lt;/a&gt; [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter05/Jitter/RelativeToCenter/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Rendering relative to eye.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;A slow CPU implementation that I only recommend for certain cases [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter05/Jitter/CPURelativeToEye/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;A fast GPU implementation we use in &lt;a href="http://www.insight3d.com/"&gt;Insight3D&lt;/a&gt; [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter05/Jitter/GPURelativeToEye/"&gt;code&lt;/a&gt;], an even more precise GPU implementation [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/"&gt;code&lt;/a&gt;], and a technique I've called &lt;i&gt;Precision LOD&lt;/i&gt; [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter05/Jitter/GPURelativeToEyeLOD/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Lots of details on the trade-offs between approaches.&lt;/li&gt;&lt;/ul&gt;If you love (or hate) jitter like I do, also read our coworker's &lt;a href="http://blogs.agi.com/insight3d/index.php/2008/09/03/precisions-precisions/"&gt;article&lt;/a&gt;, which served as the primary reference for this chapter.  Also see the &lt;a href="http://crd.lbl.gov/~dhbailey/mpdist/"&gt;DSFUN90&lt;/a&gt; Fortran library, which contains routines for performing double-single arithmetic, i.e., emulating doubles in software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2753351695777107963?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2753351695777107963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/11/vertex-transform-precision.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2753351695777107963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2753351695777107963'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/11/vertex-transform-precision.html' title='Vertex Transform Precision'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7704774821012471562</id><published>2010-11-16T18:00:00.061-05:00</published><updated>2010-11-16T18:11:18.087-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>A K Peters Catalog, Amazon, and More</title><content type='html'>I just received a hard copy of &lt;a href="http://www.akpeters.com/"&gt;A K Peter's&lt;/a&gt; 2010-2011 catalog in the mail.  Exciting.  What's even more exciting is our book is listed - with an ISBN and all!&lt;br /&gt;&lt;br /&gt;To add to the excitement, I just found our book on &lt;a href="http://www.amazon.com/3D-Engine-Design-Virtual-Globes/dp/1568817118?ie=UTF8&amp;tag=virtua06a-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Amazon&lt;/a&gt;.  It is also on the &lt;a href="http://www.crcpress.com/product/isbn/9781568817118"&gt;CRC Press&lt;/a&gt; website.  (A K Peters is now &lt;a href="http://www.akpeters.com/index.jsf?contentPath=/home/about"&gt;part of&lt;/a&gt; CRC Press.)&lt;br /&gt;&lt;br /&gt;If you visit the Amazon or CRC Press page, you may wonder why the title is &lt;i&gt;3D Engine Design for Virtual Globes&lt;/i&gt;, not &lt;i&gt;Virtual Globe and Terrain Rendering&lt;/i&gt;, which is listed in A K Peter's catalog and our blog.  They are actually the same book (check the ISBN).&lt;br /&gt;&lt;br /&gt;In the original book proposal, I suggested the title &lt;i&gt;3D Engine Design for Virtual Globes&lt;/i&gt;.  After a few months of writing, I suggested a title change to &lt;i&gt;Virtual Globe and Terrain Rendering&lt;/i&gt; since there is more content on rendering algorithms than engine design, and I wanted to stress our coverage of terrain.  The title still isn't final though.  Once we firm it up, we'll let everyone know.  Of course, the &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/about.html"&gt;content&lt;/a&gt; remains unchanged.&lt;br /&gt;&lt;br /&gt;I also wanted to supplement the description of our book in the AK Peter's catalog.  I am listed as the only author, but I assure you, &lt;a href="http://www.blogger.com/profile/06646223287468895533"&gt;Kevin&lt;/a&gt; is the coauthor.  The catalog must have went to press before Kevin came on board.  Our book is listed as approximately 350 pages.  We actually already surpassed that, and Kevin and I will still be writing furiously for another six weeks.  The page count could climb as high as 450 in our draft, but once it goes through copyediting, layout, etc., I can see it becoming shorter as figures are organized, fonts are selected, etc.&lt;br /&gt;&lt;br /&gt;Finally, we plan on posting some sample content in February or March, after the manuscript goes through copyediting.  In the meantime, we'll continue writing posts on chapters as we finish them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7704774821012471562?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7704774821012471562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/11/k-peters-catalog-amazon-and-more.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7704774821012471562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7704774821012471562'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/11/k-peters-catalog-amazon-and-more.html' title='A K Peters Catalog, Amazon, and More'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-4873289357188235582</id><published>2010-11-02T22:00:00.022-04:00</published><updated>2010-11-02T22:00:02.664-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Twitter</title><content type='html'>Short version:  I'm on twitter now: &lt;a href="http://twitter.com/pjcozzi"&gt;pjcozzi&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Longer version:&lt;br /&gt;&lt;br /&gt;I remember when I first learned what a blog was back in 2000.  I was an intern at Intel, and stumbled across Joel's now famous &lt;a href="http://www.joelonsoftware.com/"&gt;blog&lt;/a&gt;.  The first post I read was &lt;a href="http://www.joelonsoftware.com/articles/fog0000000073.html"&gt;The Guerrilla Guide to Interviewing&lt;/a&gt;.  After that I was hooked, and followed Joel almost religiously until 2006 or so.  I kept following after that, but not as frequently (maybe grad school had something to do with it).  At the start of 2008, &lt;a href="http://www.agi.com/"&gt;AGI&lt;/a&gt; launched a blog for &lt;a href="http://www.insight3d.com/"&gt;Insight3D&lt;/a&gt;, and I wrote my first &lt;a href="http://blogs.agi.com/insight3d/index.php/2008/01/18/introducing-primitives/"&gt;blog post&lt;/a&gt;.  I also started reading dozens of graphics blogs, many of which are in our blogroll.&lt;br /&gt;&lt;br /&gt;Since then, I've gotten use to the idea of writing blogs to share technical ideas or products news, so it was natural to launch this blog for our book.  During all this blogging, I somehow managed to ignore twitter.  Clearly, I was missing out, so I'm on twitter now: &lt;a href="http://twitter.com/pjcozzi"&gt;pjcozzi&lt;/a&gt;.  All I need to do now is make a &lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt; page and I'll be completely connected!  Maybe once the manuscript is done...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-4873289357188235582?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/4873289357188235582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/11/twitter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4873289357188235582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4873289357188235582'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/11/twitter.html' title='Twitter'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-3001134900004253291</id><published>2010-10-31T12:00:00.003-04:00</published><updated>2010-12-07T08:59:00.496-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>Renderer Design</title><content type='html'>With about two months left to complete the manuscript, Kevin and I are in overdrive.  I suppose it helps that I wrote the &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/"&gt;example code&lt;/a&gt; for the latest chapter almost a year ago, so writing the chapter was just writing, selecting code snippets, and creating figures - in theory anyway.  Since this chapter is code-heavy, I went back and fine-tuned a lot of code.&lt;br /&gt;&lt;br /&gt;This chapter is on renderer design, that is, designing the layer of a 3D engine that sits between the underlying rendering API, like &lt;a href="http://www.opengl.org/"&gt;OpenGL&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/directx/default.aspx"&gt;Direct3D&lt;/a&gt;, and the rest of the engine.  Since my experience is largely with OpenGL, the chapter focuses on OpenGL, but it still mentions Direct3D in many places for comparison.  Although I'd love to fill an entire book on the topic (hmm), the chapter is &lt;i&gt;only&lt;/i&gt; 70 pages, so it requires some previous experience with OpenGL or Direct3D, as does our book in general.&lt;br /&gt;&lt;br /&gt;As I &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/06/gpu-pro-review-3d-engine-design-section.html"&gt;said&lt;/a&gt; a while back, this is the third time I've designed such an abstraction layer, so much of my advice is battle tested.  I've learned to favorite ease of use and flexibility over performance, although I mention where performance can be improved, perhaps only marginally in the grand scheme of things, at the cost of something else.&lt;br /&gt;&lt;br /&gt;The major components of our renderer are shown here:&lt;br /&gt;&lt;br /&gt;&lt;img width="634" height="138" src="http://2.bp.blogspot.com/_wUfqk3kFyG4/TMyeWU_3VtI/AAAAAAAABTc/Uqpot7ZOLzQ/s1600/Components.png" /&gt;&lt;br /&gt;&lt;br /&gt;The highlights of this chapter include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Motivation for a renderer layer&lt;/i&gt;:  ease of development, portability, flexibility, robustness, performance, additional functionality.  I can't come up with a reason not to do it except for "hack something together as fast as possible."&lt;/li&gt;&lt;li&gt;&lt;i&gt;Big picture&lt;/i&gt;:  the device [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Device.cs"&gt;code&lt;/a&gt;] and contexts [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/ContextGL3x.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;&lt;i&gt;State management&lt;/i&gt;:  global render state vs. state objects [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/RenderState/"&gt;code&lt;/a&gt;], draw state [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/DrawState.cs"&gt;code&lt;/a&gt;], clear state [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/ClearState.cs"&gt;code&lt;/a&gt;], sorting by state.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Shaders&lt;/i&gt;:  compiling and linking [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Shaders/ShaderProgramGL3x.cs"&gt;code&lt;/a&gt;], built-in constants [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Shaders/ShaderObjectGL3x.cs"&gt;code&lt;/a&gt;], vertex attributes [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Shaders/ShaderVertexAttribute.cs"&gt;code&lt;/a&gt;], uniforms [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Shaders/"&gt;code&lt;/a&gt;], automatic uniforms [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Shaders/DrawAutomaticUniforms/"&gt;code&lt;/a&gt;], and shader caching [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Shaders/Cache/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;&lt;i&gt;Vertex data&lt;/i&gt;:  vertex buffers [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Buffers/VertexBufferGL3x.cs"&gt;code&lt;/a&gt;], index buffers [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Buffers/IndexBufferGL3x.cs"&gt;code&lt;/a&gt;], vertex arrays [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/VertexArray/"&gt;code&lt;/a&gt;], meshes [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Geometry/Mesh.cs"&gt;code&lt;/a&gt;], creating vertex arrays from meshes [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Device.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;&lt;i&gt;Textures&lt;/i&gt;:  read and write pixel buffers [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Buffers/"&gt;code&lt;/a&gt;],  2D textures [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Textures/Texture2DGL3x.cs"&gt;code&lt;/a&gt;], samplers [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Textures/TextureSamplerGL3x.cs"&gt;code&lt;/a&gt;], texture units [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Textures/TextureUnitGL3x.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;&lt;i&gt;Framebuffers&lt;/i&gt; [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Framebuffer/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-3001134900004253291?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/3001134900004253291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/10/renderer-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3001134900004253291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3001134900004253291'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/10/renderer-design.html' title='Renderer Design'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wUfqk3kFyG4/TMyeWU_3VtI/AAAAAAAABTc/Uqpot7ZOLzQ/s72-c/Components.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-4560298076787635475</id><published>2010-10-24T10:00:00.072-04:00</published><updated>2010-10-24T10:00:01.809-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Game Engine Gems, Volume 2</title><content type='html'>I'm excited that the &lt;a href="http://www.gameenginegems.net/geg2.php"&gt;table of contents&lt;/a&gt; for &lt;a href="http://www.gameenginegems.net/"&gt;Game Engine Gems, Volume 2&lt;/a&gt; is now available.  The book is scheduled to be released at &lt;a href="http://www.gdconf.com/"&gt;GDC&lt;/a&gt; 2011, this coming March.&lt;br /&gt;&lt;br /&gt;Although I don't know anything beyond the titles and authors, I am looking forward to many of the articles.&lt;br /&gt;&lt;br /&gt;Rémi Arnaud's &lt;i&gt;3D in a Web Browser&lt;/i&gt; sound timely and is always a hot topic where I work.  Recently, I've played with &lt;a href="http://jogamp.org/jogl/www/"&gt;JOGL&lt;/a&gt; Java Applets, but I'd also like to look at &lt;a href="http://www.khronos.org/webgl/"&gt;WebGL&lt;/a&gt;.  I'm curious to read what Rémi has to say.&lt;br /&gt;&lt;br /&gt;Noel Llopis's &lt;i&gt;High-Performance Programming with Data-Oriented Design&lt;/i&gt; also sounds worthwhile.  I feel my design skills have plateaued over the past year or two; I couldn't even give you a completely legit definition of "Data-Oriented Design."  Some reading in this area will be good for me.&lt;br /&gt;&lt;br /&gt;I'm happy to see that the &lt;i&gt;Systems Programming&lt;/i&gt; part has a good bit of threading coverage, including Julien Hamaide's &lt;i&gt;Thread Communication Techniques&lt;/i&gt;, Martin Fleisz's &lt;i&gt;A Cross-Platform Multithreading Framework&lt;/i&gt;, and Matthew Johnson's &lt;i&gt;Producer-Consumer Queues&lt;/i&gt;.  I can't imagine that anyone is writing a new engine without at least some multithreading support.  I'm curious to read about communication between threads.  I have to admit to being a big fan of message queues but I'm sure they are not the be all end all.  (P.S. Our book also has a &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/09/multithreaded-resource-preparation.html"&gt;chapter on multithreading&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Finally, I contributed two articles on OpenGL techniques.  Here are their abstracts:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Delaying OpenGL Calls&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;It is a well known best practice to write an abstraction layer over a rendering API such as OpenGL. Doing so has numerous benefits that include improving portability, flexibility, performance, and above all, ease of development. Given OpenGL’ s use of global state and selectors, it can be difficult to implement clean abstractions for things like shader uniforms and frame buffer objects. This chapter presents a flexible and efficient technique for implementing OpenGL abstractions using a mechanism that delays OpenGL calls until they are finally needed at draw time.&lt;br /&gt;&lt;/blockquote&gt;&lt;i&gt;A Framework for GLSL Engine Uniforms&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;The OpenGL 3.x and 4.x core profiles present a clean, shader-centric API. Many veteran developers are pleased to say goodbye to the fixed function pipeline and the related API entry points. The core profile also says goodbye to the vast majority of GLSL built-in uniforms, such as gl_ModelViewMatrix and gl_ProjectionMatrix. This chapter addresses the obvious question: what to use in place of GLSL built-in uniforms.&lt;br /&gt;&lt;/blockquote&gt;I'll write an actual review when the book comes out (excluding my articles, of course, and with the disclaimer that, as a contributor, I am biased) and I am going to finishing reading and reviewing &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/06/gpu-pro-review-3d-engine-design-section.html"&gt;GPU Pro 2&lt;/a&gt; as soon as I am done writing the manuscript for my own book!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-4560298076787635475?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/4560298076787635475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/10/game-engine-gems-volume-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4560298076787635475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4560298076787635475'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/10/game-engine-gems-volume-2.html' title='Game Engine Gems, Volume 2'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-3831105245630576025</id><published>2010-10-12T23:00:00.002-04:00</published><updated>2010-12-07T09:00:55.598-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Welcome Kevin</title><content type='html'>My coworker, &lt;a href="http://www.blogger.com/profile/06646223287468895533"&gt;Kevin Ring&lt;/a&gt;, has joined me as a coauthor to write a few of the final, but core, chapters.  Kevin has served as a reviewer for many of the chapters I already wrote, has contributed quite a bit to the book's &lt;a href="http://sourceforge.net/projects/miniglobe/"&gt;example code&lt;/a&gt; (including the &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/MessageQueue.cs"&gt;message queue&lt;/a&gt; and administering the &lt;a href="http://fuzz.homeserver.com:40/"&gt;continuous integration server&lt;/a&gt;).  He even contributed some book content to the section on implementing a message queue.  At this point, he is practically a coauthor anyway.&lt;br /&gt;&lt;br /&gt;He will be writing about terrain LOD and imagery tiling, while I finish up chapters on renderer design and precision.  We have plenty to do by the end of the year but I think we are in good shape, and I am not one to wait until the last minute to panic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-3831105245630576025?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/3831105245630576025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/10/welcome-kevin.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3831105245630576025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/3831105245630576025'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/10/welcome-kevin.html' title='Welcome Kevin'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7616588129351114760</id><published>2010-09-21T20:00:00.004-04:00</published><updated>2010-09-21T20:00:01.481-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Writing Tips'/><title type='text'>Writing Captions for Figures</title><content type='html'>Before reading a book or paper, I always browse its figures and read their captions.  If it seems the content will interest me, I go back and actually read it.  I suspect almost everyone does this.&lt;br /&gt;&lt;br /&gt;Jim Kajiya makes an excellent point about this in &lt;a href="http://www.siggraph.org/publications/kajiya.pdf"&gt;How to Get Your SIGGRAPH Paper Rejected&lt;/a&gt;, which I believe applies equally to books:&lt;br /&gt;&lt;blockquote&gt;Ivan Sutherland once told me that Scientific American articles are constructed so that you can get the point of the article just by reading the captions to the illustrations. Now, I'm not suggesting that you write a technical comic book; but you should take a look at those SIGGRAPH papers you were initially attracted to and see how they went about getting their point across.&lt;/blockquote&gt;Given that a reader is likely to read captions for figures before reading the main text, it is important to write good captions!  A trick I use is to write the captions before writing the main text.  This has worked pretty well so far.  You need to be careful that you don't include too much in the caption but a little redundancy isn't bad:  I like captions to reiterate a key point from the main text.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7616588129351114760?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7616588129351114760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/09/writing-captions-for-figures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7616588129351114760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7616588129351114760'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/09/writing-captions-for-figures.html' title='Writing Captions for Figures'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1640594786207719678</id><published>2010-09-12T20:00:00.008-04:00</published><updated>2010-12-07T09:01:49.696-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><category scheme='http://www.blogger.com/atom/ns#' term='Multithreading'/><title type='text'>Multithreaded Resource Preparation</title><content type='html'>I gave myself three weeks to write our chapter on multithreaded resource preparation.  I manged to come in right on time even with Labor Day weekend in the mix.  I am exhausted.&lt;br /&gt;&lt;br /&gt;This is not an introduction to multithreading but rather how to apply multithreading to improve the performance and responsiveness of a 3D engine by moving I/O, CPU intensive algorithms (think triangulation, vertex cache optimization, etc), and renderer resource creation to worker threads.&lt;br /&gt;&lt;br /&gt;The chapter highlights include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Brief review of hardware parallelism&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;CPU:  Pipelining, superscalar, SIMD, multithreading, Hyper-Threading, multi-core.&lt;/li&gt;&lt;li&gt;GPU:  Pipelining, shaders, CPU/GPU parallelism.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;Architectures for multithreaded resource preparation&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Using message queues to communicate between threads [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/MessageQueue.cs"&gt;code&lt;/a&gt; contributed by &lt;a href="http://blogs.agi.com/dynamicGeometry/"&gt;Kevin Ring&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Coarse grain threads [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Examples/Chapter10/Multithreading/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Pipeline of fine grain threads.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;Multithreading with OpenGL&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;One GL thread, multiple worker threads.&lt;/li&gt;&lt;li&gt;Multiple threads, one context.&lt;/li&gt;&lt;li&gt;Multiple threads, multiple contexts.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Shared contexts.&lt;/li&gt;&lt;li&gt;CPU vs GL synchronization.  Fences [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/GL3x/Synchronization/FenceGL3x.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;Also, here's a list of resources on OpenGL multithreading that I found useful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Appendix D of the &lt;a href="http://www.opengl.org/registry/doc/glspec33.core.20100311.pdf"&gt;OpenGL spec&lt;/a&gt; is on shared objects and multiple contexts.&lt;/li&gt;&lt;li&gt;&lt;a href="http://veelck.wordpress.com/2008/11/28/multithread-texture-loading-in-opengl/"&gt;Multithread texture loading using OpenGL and WGL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/"&gt;The Hacks of Life&lt;/a&gt; blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/2009/08/updating-textures-on-fly-with-threads.html"&gt;Updating Textures On The Fly With Threads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/2009/08/atomics-and-threaded-opengl.html"&gt;Atomics and Threaded OpenGL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/2009/08/creating-opengl-textures-or-vbos-on.html"&gt;Creating OpenGL Textures or VBOs On A Second Thread&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/2008/02/creating-opengl-objects-in-second.html"&gt;Creating OpenGL Objects in a Second Thread - Mac, Linux, Windows&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hacksoflife.blogspot.com/2008/01/opengl-and-threads-whats-wrong.html"&gt;OpenGL and Threads: What's Wrong&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/"&gt;opengl.org forum&lt;/a&gt; posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=172448"&gt;Threads rendering to different contexts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=234543"&gt;Specific Multi Threading usage in OpenGL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=282766"&gt;OpenGL thread loading&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=112536&amp;page=1"&gt;multithreaded OpenGL WTF?&lt;/a&gt; - on threading in the driver, not application level threading.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=279118#Post279118"&gt;glFlush or glFinish with mulithreading?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Main=54569&amp;Number=282419#Post282419"&gt;Compiling/linking shaders on a thread on NVIDIA&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gamedev.net/community/forums/"&gt;GameDev.Net forums&lt;/a&gt; posts&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=424705"&gt;Multithreading and OpenGL contexts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=395910&amp;whichpage=1%EF%BF%BD"&gt;VBO and Multithreading&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff476884.aspx"&gt;Direct3D 11 Multithreading&lt;/a&gt; - not OpenGL but still nice to know.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1640594786207719678?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1640594786207719678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/09/multithreaded-resource-preparation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1640594786207719678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1640594786207719678'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/09/multithreaded-resource-preparation.html' title='Multithreaded Resource Preparation'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1900962965991177332</id><published>2010-09-01T19:00:00.002-04:00</published><updated>2010-09-01T19:00:03.313-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Writing Tips'/><title type='text'>Proofreading your own Writing</title><content type='html'>Proofreading our own writing is hard because, well, we wrote it.  We tend to read what we think we wrote and not what we actually wrote.&lt;br /&gt;&lt;br /&gt;When I first write something, it usually isn't that great.  That doesn't worry me, I want to get ideas down and avoid staring at a blank screen.  I write a few pages, create a pdf, proofread it, and immediately rewrite the parts I don't like or that have blatant grammar errors.&lt;br /&gt;&lt;br /&gt;This type of proofreading isn't enough though.&lt;br /&gt;&lt;br /&gt;The next day I work on the book, I reread what I wrote the previous day, hopefully after forgetting most of it.  I'm able to improve the quality to the point where I'm not ashamed, or perhaps even proud, to show it to reviewers.&lt;br /&gt;&lt;br /&gt;This second proofreading also helps me get back into the zone for writing the next section and helps each section flow into the next one.  I find getting into the zone for writing much hard than getting into the zone for coding so I feel this trick goes a long way.&lt;br /&gt;&lt;br /&gt;I always proofread my previous day's work before writing.  Sometimes, I even proofread previous work from a few days.  By the time I "finish" a chapter, I've probably read it five times - and reviewers still find things!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1900962965991177332?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1900962965991177332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/09/proofreading-your-own-writing.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1900962965991177332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1900962965991177332'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/09/proofreading-your-own-writing.html' title='Proofreading your own Writing'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-4291624106401183099</id><published>2010-08-22T14:15:00.005-04:00</published><updated>2010-12-07T09:06:02.243-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vector Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Contents'/><title type='text'>Rendering Vector Data</title><content type='html'>I just finished writing our chapter on rendering vector data on a globe.  Leave it to me to write 60 pages on something as simple as rendering polylines, polygons, and points!  Of course, it is not quite as simple as it sounds.  I'd like to share an overview of the content and screen shots of the example code, which you can download now:  &lt;i&gt;Chapter07VectorData&lt;/i&gt; in &lt;a href="http://sourceforge.net/projects/miniglobe/"&gt;OpenGlobe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="0" align=center&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td&gt;&lt;a href="http://4.bp.blogspot.com/_wUfqk3kFyG4/THFgDGY890I/AAAAAAAABSs/pWAw6qaUIXk/s1600/two.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wUfqk3kFyG4/THFgDGY890I/AAAAAAAABSs/pWAw6qaUIXk/s320/two.png" /&gt;&lt;/a&gt;&lt;/td&gt;   &lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_wUfqk3kFyG4/THFf8UBiuiI/AAAAAAAABSk/pkfDiB20sVs/s1600/one.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/_wUfqk3kFyG4/THFf8UBiuiI/AAAAAAAABSk/pkfDiB20sVs/s320/one.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td align=center&gt;Country polygons, state and&lt;br /&gt;river polylines, and city points (billboards)&lt;/td&gt;   &lt;td align=center&gt;Country polygons and river polylines&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This chapter begins with two short sections on sources of vector data and on avoiding z-fighting between vector data and the globe it is drawn on.  The bulk of the chapter is then in these three sections:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Polylines&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Layouts:  strips, loops, and indexed lines.&lt;/li&gt;&lt;li&gt;Batching and static vertex buffers.&lt;/li&gt;&lt;li&gt;Rendering wide lines using a geometry shader [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Scene/Renderables/Polyline/Polyline/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Shaders for rendering outlined (two color) lines [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Scene/Renderables/Polyline/OutlinedPolylineTexture/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;Polygons&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Overview of raster techniques for polygon rendering.&lt;/li&gt;&lt;li&gt;A pipeline for geometry-based polygon rendering, including:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Triangulation:  ear clipping [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Polygons/EarClipping.cs"&gt;code&lt;/a&gt;], including a nifty way to ear clip polygons on an ellipsoid without projecting to a tangent plane [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Polygons/EarClippingOnEllipsoid.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Subdivision to make a polygon's triangulation better approximate the ellipsoid [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Polygons/TriangleMeshSubdivision.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;Billboards&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Rendering billboards with a geometry shader [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Scene/Renderables/BillboardCollection/"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Using and packing texture atlases [&lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Renderer/Tools/TextureAtlas.cs"&gt;code&lt;/a&gt;].&lt;/li&gt;&lt;li&gt;Text rendering.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;The example code also includes a partial ESRI &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Core/Shapefile/"&gt;Shapefile reader&lt;/a&gt;.  The vector, raster, and icon data used is included in the example and can be downloaded from our &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/data-for-virtual-globe-developers.html"&gt;data&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;Of course, the chapter contains much more than the above bullets but these are the highlights.  Now, I'm off to write the chapter on moving much of this work (disk/network access, triangulation, texture atlas packing, GL resource creation) off the main thread.  Since most the code for this is already done, I'm hoping this is a pretty easy chapter to write.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-4291624106401183099?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/4291624106401183099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/08/i-just-finishing-writing-our-chapter-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4291624106401183099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/4291624106401183099'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/08/i-just-finishing-writing-our-chapter-on.html' title='Rendering Vector Data'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wUfqk3kFyG4/THFgDGY890I/AAAAAAAABSs/pWAw6qaUIXk/s72-c/two.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-6976963841590816824</id><published>2010-08-02T20:00:00.181-04:00</published><updated>2010-08-02T20:00:02.730-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><title type='text'>SIGGRAPH Notes</title><content type='html'>I'd like to share some of my notes from &lt;a href="http://www.siggraph.org/s2010/"&gt;SIGGRAPH&lt;/a&gt;.  I promise this will be my last SIGGRAPH post, then I will return to directly book-related things.&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;i&gt;Courses&lt;/i&gt;:  &lt;a href="http://www.cs.williams.edu/~morgan/"&gt;Morgan McGuire&lt;/a&gt; organized an excellent course:  &lt;a href="http://graphics.cs.williams.edu/courses/SRG10/"&gt;Stylized Rendering in Games&lt;/a&gt;.  There was lots of talk on rendering silhouettes, where, like a lot of things, "the devil is in the details."  I liked how the Borderlands talk went into almost painful detail on using a &lt;a href="http://en.wikipedia.org/wiki/Sobel_operator"&gt;Sobel filter&lt;/a&gt; for silhouette rendering.  BTW, a Sobel filter is also useful for computing terrain normals.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bps10.idav.ucdavis.edu/"&gt;Beyond Programmable Shading&lt;/a&gt; was a hit as always.  I go to this course ever year and it always has new content.  In particular, &lt;a href="Jonathan Ragan-Kelley"&gt;Jonathan Ragan-Kelley&lt;/a&gt; gave a great talk on &lt;a href="http://bps10.idav.ucdavis.edu/talks/09-raganKelley_SchedulingRenderingPipeline_BPS_SIGGRAPH2010.pdf"&gt;scheduling the graphics pipeline&lt;/a&gt;.  It's rare to find good information on this kind of stuff.  The course ended with a panel on programmable vs fixed function hardware.  For me, the takeaway was fixed function hardware is fast and uses very little power so it will remain for algorithms that are unlikely to change (e.g. video decode, rasterization, etc.).  My opinion from a developer's perspective is:  fixed function is fine for things I have no interest in changing but I want everything else to be programmable.&lt;/li&gt;&lt;p /&gt;   &lt;li&gt;&lt;i&gt;Panels&lt;/i&gt;:  There was a really unique panel called "CS 292: The Lost Lecture."  In which, Richard Chuang, co-founder of PDI, and Ed Catmull, president of Pixar and Disney Animation Studios, reflected on a graphics course Ed Catmull and Jim Blinn taught at Berkley in 1980, which Richard Chuang attended.  The panel included video clips from the course and several memoriable quotes (disclaimer:  I &lt;i&gt;tried&lt;/i&gt; to write these down word for word but no promises):&lt;br /&gt;&lt;br /&gt;      &lt;ul&gt;         &lt;li&gt;"It's the kind of thing where you understand it and it is still hard." - Ed Catmull on visible surfaces in 1980.&lt;/li&gt;         &lt;li&gt;"It would be nice if this thing could do a little more.  In fact, it would be good if it were programmable." - Ed Catmull on the GPU in 1980.&lt;/li&gt;         &lt;li&gt;"Because we didn't know any better, we were on the forefront of a brand new field." - Richard Chuang.&lt;/li&gt;         &lt;li&gt;"The result of teaching these two classes created our biggest competitor" - Ed Catmull speaking about PDI/Dreamworks.&lt;/li&gt;         &lt;li&gt;"If we don't have any major surprises then we are becoming too conservative." - Ed Catmull.&lt;/li&gt;      &lt;/ul&gt;&lt;br /&gt;When asked during the panel, Ed Catmull did not object to having the videos of his 1980 course released.  It would be great to have such historic videos available.&lt;/li&gt;&lt;p /&gt;   &lt;li&gt;&lt;i&gt;Books&lt;/i&gt;:  One of my favorite things about SIGGRAPH is all the new books.  I'm happy to see the fifth edition of the &lt;a target="_blank"  href="http://www.amazon.com/OpenGL-SuperBible-Comprehensive-Tutorial-Reference/dp/0321712617?ie=UTF8&amp;tag=virtua06a-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;OpenGL SuperBible&lt;/a&gt; is out, and it only covers the core profile!  It's about time we got a book covering just "modern" OpenGL.  Another book that looks interesting is &lt;a target="_blank"  href="http://www.amazon.com/Writing-Computer-Science-Justin-Zobel/dp/1852338024?ie=UTF8&amp;tag=virtua06a-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Writing for Computer Science&lt;/a&gt;.  Its been out since 2004 so I'm surprised that I haven't ran into it before.  I probably should have read it before starting on my own book!&lt;/li&gt;&lt;p /&gt;   &lt;li&gt;&lt;i&gt;Posters&lt;/i&gt;:  Stefan Elsen had an interesting poster on real-time procedural generation of planets using fractals:  "WorldSeed:  Fractal Worlds in Realtime."  His &lt;a href="http://syssoft.uni-trier.de/worldseed/"&gt;website&lt;/a&gt; has much more information including an impressive video.  Our poster, &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/papers-and-presentations.html#GPURayCastingOfVirtualGlobes"&gt;GPU Ray Casting of Virtual Globes&lt;/a&gt;, was also well received.  I actually ran out of hard copies of the abstract!&lt;/li&gt;&lt;p /&gt;   &lt;li&gt;&lt;i&gt;OpenGL&lt;/i&gt;:  Those notes are in my &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/2010/07/opengl-41-and-more-at-siggraph.html"&gt;previous post&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;There was a whole lot more to see at SIGGRAPH but these were the highlights for me.  Now that all the SIGGRAPH fun is behind us, I need to lock myself in my house and finish this manuscript!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-6976963841590816824?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/6976963841590816824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/08/siggraph-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6976963841590816824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/6976963841590816824'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/08/siggraph-notes.html' title='SIGGRAPH Notes'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-922140241609169621</id><published>2010-07-31T15:00:00.108-04:00</published><updated>2010-07-31T15:53:57.968-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL 4.1 and more at SIGGRAPH</title><content type='html'>After attending &lt;a href="http://www.siggraph.org/s2010/"&gt;SIGGRAPH&lt;/a&gt;, I am convinced now, more than ever, is a great time to be using OpenGL.  There was lots of exciting news:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href="http://www.opengl.org/registry/doc/glspec41.core.20100725.pdf"&gt;OpenGL 4.1&lt;/a&gt; and &lt;a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.10.6.clean.pdf"&gt;GLSL 4.1&lt;/a&gt; specs were released, very shortly followed by &lt;a href="http://developer.nvidia.com/object/opengl_driver.html"&gt;NVIDIA drivers&lt;/a&gt;.  This includes long requested features such as &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_ARB_separate_shader_objects.txt"&gt;ARB_separate_shader_objects&lt;/a&gt; and &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_ARB_get_program_binary.txt"&gt;ARB_get_program_binary&lt;/a&gt;.  I was pleasantly surprised to see the extra debugging information now available with &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_ARB_debug_output.txt"&gt;ARB_debug_output&lt;/a&gt;.  This will be the first thing I try out.&lt;br /&gt;&lt;p /&gt;Of particular interest to virtual globe developers is &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_ARB_vertex_attrib_64bit.txt"&gt;ARB_vertex_attrib_64bit&lt;/a&gt; which will help the common "jitter" problem on machines with GL 4.x hardware.  Dealing with this problem on pre-4.x hardware is a topic in our book.  Until it comes out, check out Deron's &lt;a href="http://blogs.agi.com/insight3d/index.php/2008/09/03/precisions-precisions/"&gt;Precisions, Precisions&lt;/a&gt; article.&lt;br /&gt;&lt;li&gt;The OpenGL SDK reference pages were updated for &lt;a href="http://www.opengl.org/sdk/docs/man3/"&gt;3.3&lt;/a&gt; and &lt;a href="http://www.opengl.org/sdk/docs/man4/"&gt;4.1&lt;/a&gt; core profiles!  You no longer have to dig through the spec to find reference material for the latest GL features (not that it was that bad).  The &lt;a href="http://www.opengl.org/sdk/docs/man/"&gt;2.1&lt;/a&gt; reference pages are still around if you need to look up deprecated functions.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you didn't get to attend the OpenGL BOF (or even if you did), I recommend reading through the &lt;a href="http://www.khronos.org/library/detail/2010-siggraph-opengl-bof/"&gt;slides&lt;/a&gt;.  There's lots of exciting news, including a lightweight texture file format, &lt;a href="http://www.khronos.org/opengles/sdk/tools/KTX/"&gt;KTX&lt;/a&gt;, for OpenGL and OpenGL ES, a 0.9 version of a modern GLU:  &lt;a href="http://dri.freedesktop.org/glu3/"&gt;GLU3&lt;/a&gt;, and progress towards OpenGL conformance tests.&lt;br /&gt;&lt;p /&gt;As lame as it sounds, I am pumped about the conformance tests.  They should really improve the quality of OpenGL drivers, which have already been increasingly stable on recent hardware and operating systems.&lt;/li&gt;&lt;br /&gt;&lt;p /&gt;&lt;li&gt;NVIDIA's &lt;a href="http://nvidia.fullviewmedia.com/siggraph2010/02-dev-barthold-lichtenbelt-mark-kilgard.html"&gt;OpenGL 4.0 for 2010&lt;/a&gt; presentation is also worth a look.  I was glad to see how crowded this session and the BOF were!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Even though I am thrilled with the direction of OpenGL, there are two things I'd like to see:&lt;ul&gt;&lt;li&gt;3.4 - I was expecting to see 3.4 released at the same time as 4.1 but instead 3.x gained new ARB extensions, including the ones listed above minus &lt;a href="http://developer.download.nvidia.com/opengl/specs/GL_ARB_vertex_attrib_64bit.txt"&gt;ARB_vertex_attrib_64bit&lt;/a&gt;.  Since not all vendors support all ARB extensions, I would have rather seen these great features rolled into 3.4.  This way the features are guaranteed to be implemented, and application developers can simply say their application requires 3.4 instead of saying 3.4 plus whatever extensions.  I would not mind seeing 3.4 released with 4.2 (or 5.0?) and include all possible extensions from 4.1 and 4.2.&lt;/li&gt;&lt;p /&gt;&lt;li&gt;I'd also like to see debugging support for modern GLSL shaders.  If OpenGL really wants to be a Direct3D superset, it needs better tool support.  Right now, there is &lt;a href="http://www.vis.uni-stuttgart.de/glsldevil/"&gt;glslDevil&lt;/a&gt; but it does not support core profile development.  There is also NVIDIA's &lt;a href="http://developer.nvidia.com/object/nsight.html"&gt;Parallel Nsight&lt;/a&gt; (see their &lt;A href="http://nvidia.fullviewmedia.com/siggraph2010/03-dev-jeff-kiel-kumar-lyer.html"&gt;SIGGRAPH presentation&lt;/a&gt;), which currently has very little OpenGL support and the support requires the paid version.  Although, I am under the impression that NVIDIA is working on more OpenGL and GLSL features.  They will hit a home run if we can seamlessly debug GLSL shaders!&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-922140241609169621?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/922140241609169621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-41-and-more-at-siggraph.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/922140241609169621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/922140241609169621'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-41-and-more-at-siggraph.html' title='OpenGL 4.1 and more at SIGGRAPH'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-7574879876590068668</id><published>2010-07-19T07:00:00.026-04:00</published><updated>2010-12-07T08:53:48.116-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Terrain'/><category scheme='http://www.blogger.com/atom/ns#' term='Silhouettes'/><category scheme='http://www.blogger.com/atom/ns#' term='NPR'/><category scheme='http://www.blogger.com/atom/ns#' term='Geometry Shaders'/><title type='text'>Geometry Shader Silhouettes without Adjacency Information</title><content type='html'>Rendering silhouette edges is a classic problem in NPR.  It has other uses to - for example, in terrain rendering, it can convey quite a bit about where ridge lines are:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wUfqk3kFyG4/TD-mwCCo2PI/AAAAAAAABSU/5Mlf6hbe6wI/s1600/Silhouettes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://2.bp.blogspot.com/_wUfqk3kFyG4/TD-mwCCo2PI/AAAAAAAABSU/5Mlf6hbe6wI/s400/Silhouettes.png" width="515" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Of course, the above comparison is not very fair.  The image on the left is just shaded by height (no lighting) which can hide terrain features, especially for horizon views.  Regardless, silhouettes are cool and most graphics developers are familiar with the standard geometry shader approach based on adjacency information (if not see &lt;a href="http://www.gamasutra.com/view/feature/1644/sponsored_feature_inking_the_.php"&gt;Inking the Cube: Edge Detection with Direct3D 10&lt;/a&gt; or &lt;a href="http://www.cgstarad.com/NPR/GSContours.pdf"&gt;Single Pass GPU Stylized Edges&lt;/a&gt;).  What I'd like to briefly share with you is a geometry shader approach that does not require adjacency info, which means you won't need one index buffer with adjacency info and another without it!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;I should mention that &lt;a href="http://www.blogger.com/profile/17213601113380550808"&gt;Deron&lt;/a&gt; came up with this and I am sharing it so he can keep busy on the book!  The idea is simple - use the geometry shader to do a procedural geometry technique called triangle fattening (see &lt;a href="http://www.cs.unc.edu/%7Eraskar/NPR/"&gt;Image Precision Silhouette Edges&lt;/a&gt;) in screen space.  In the first pass, the model is rendered normally with backface culling.  In the second pass, it is rendered with front face culling and a geometry shader that transforms the triangle to screen space and expands each edge by a given number of pixels.  To eliminate elongated corners, the three input vertices are turned into six as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wUfqk3kFyG4/TD-sWSPXPEI/AAAAAAAABSc/Zfmcx6VU0UE/s1600/Expand.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_wUfqk3kFyG4/TD-sWSPXPEI/AAAAAAAABSc/Zfmcx6VU0UE/s400/Expand.jpg" width="350" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The original triangle is gray and the expanded "triangle" is black.  The result is a uniform width silhouette.  This method is similar to a fixed function algorithm, which renders the second pass in wireframe mode using a wide line.  But in &lt;a href="http://www.opengl.org/registry/doc/glspec30.20080923.pdf"&gt;OpenGL 3&lt;/a&gt;, line widths greater than one were deprecated.&lt;br /&gt;&lt;br /&gt;In our method, the geometry shader outputs six vertices for all backfacing triangles.  Most of those fragments should get thrown away by early z since the front facing triangles were laid down in the first pass.  The geometry shader could output more vertices to reduce the rasterization load but we found this to slow things down quite a bit.  Performance is commonly bound by geometry shader output and this algorithm will output a lot more triangles than the standard geometry shader algorithm that only outputs triangles for edges on the silhouette.  We think this algorithm is still worth mentioning since it is so easy to integrate into a rendering pipeline, especially if you have the shader source.  Here:  &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/branches/book/Source/Scene/Terrain/TriangleMeshTerrainTile/SilhouetteGS.glsl"&gt;SilhouetteGS.glsl&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-7574879876590068668?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/7574879876590068668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/07/geometry-shader-silhouettes-without.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7574879876590068668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/7574879876590068668'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/07/geometry-shader-silhouettes-without.html' title='Geometry Shader Silhouettes without Adjacency Information'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wUfqk3kFyG4/TD-mwCCo2PI/AAAAAAAABSU/5Mlf6hbe6wI/s72-c/Silhouettes.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-2278680471670852066</id><published>2010-07-13T14:30:00.008-04:00</published><updated>2010-07-13T14:30:02.054-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL at SIGGRAPH 2010 Update</title><content type='html'>The &lt;a href="http://www.opengl.org/news/permalink/opengl-community-drink-schedule-at-siggraph-2010/"&gt;OpenGL Community Drink&lt;/a&gt; at SIGGRAPH has now been scheduled:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Monday, July 26th, 6pm&lt;br /&gt;&amp;nbsp;&amp;nbsp; Veranda Bar in the Figueroa Hotel&lt;br /&gt;&lt;br /&gt;The Figueroa Hotel is one of the closest hotels to the convention center.  See the &lt;a href="http://old.siggraph.org/s2010/downloads/S10_HotelMap.pdf"&gt;Hotel Map&lt;/a&gt;.  There is no need to RSVP but you are welcome to chime in &lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;amp;Number=279542"&gt;here&lt;/a&gt;, email &lt;a href="http://www.g-truc.net/contact.html"&gt;Christophe&lt;/a&gt;, leave a comment below, or just show up, we're not exactly going for anything formal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-2278680471670852066?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/2278680471670852066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-at-siggraph-2010-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2278680471670852066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/2278680471670852066'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-at-siggraph-2010-update.html' title='OpenGL at SIGGRAPH 2010 Update'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-340243307297731551</id><published>2010-07-09T16:30:00.027-04:00</published><updated>2010-07-09T16:35:23.589-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL at SIGGRAPH 2010</title><content type='html'>One of the many reasons I love &lt;a href="http://www.siggraph.org/s2010/"&gt;SIGGRAPH&lt;/a&gt; is it allows me to stay current with the now quickly moving world of &lt;a href="http://www.opengl.org/"&gt;OpenGL&lt;/a&gt;.    This year there are many sessions covering OpenGL:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.khronos.org/news/events/detail/siggraph-la-2010/#bofs"&gt;OpenGL BOF&lt;/a&gt;:  Always has the latest OpenGL news.  It might even be the most attended &lt;a href="http://www.siggraph.org/s2010/for_attendees/birds_feather"&gt;BOF&lt;/a&gt; at the conference - the free beer doesn't hurt.  It is on Wednesday, 5:15-7:15pm&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nvidia.com/object/siggraph-2010.html"&gt;OpenGL 4.0 for 2010&lt;/a&gt;:  Hosted by NVIDIA on Wednesday, 10:15-11:30 am.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opengl.org/news/permalink/opengl-community-drink-at-siggraph-2010/"&gt;OpenGL Community Drink&lt;/a&gt;:  Currently being organized by &lt;a href="http://www.g-truc.net/"&gt;Christophe Riccio&lt;/a&gt; (creator of &lt;a href="http://www.g-truc.net/project-0016.html"&gt;GLM&lt;/a&gt; and the &lt;a href="http://www.g-truc.net/project-0026.html"&gt;OpenGL Samples Pack&lt;/a&gt;).  This will be a great opportunity to meet people that are active on the &lt;a href="http://www.opengl.org/discussion_boards/"&gt;opengl.org forums&lt;/a&gt; or just using OpenGL in general.  The time and place have not been set yet but it is likely to be Monday night.  Join the planning discussion &lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=279542"&gt;here&lt;/a&gt;.  This is an informal meeting and not an official SIGGRAPH event.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-340243307297731551?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/340243307297731551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-at-siggraph-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/340243307297731551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/340243307297731551'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/07/opengl-at-siggraph-2010.html' title='OpenGL at SIGGRAPH 2010'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-67903597652724752</id><published>2010-07-01T17:04:00.000-04:00</published><updated>2010-07-01T17:04:35.294-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIGGRAPH'/><category scheme='http://www.blogger.com/atom/ns#' term='Ray Casting'/><title type='text'>GPU Ray Casting of Virtual Globes at SIGGRAPH 2010</title><content type='html'>&lt;a href="http://www.siggraph.org/s2010/"&gt;SIGGRAPH&lt;/a&gt; is just around the corner!  I am excited to present our poster:  &lt;i&gt;GPU Ray Casting of Virtual Globes&lt;/i&gt;.  The &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/papers-and-presentations.html#GPURayCastingOfVirtualGlobes"&gt;papers and presentations&lt;/a&gt; page contains the abstract, video, and all that good stuff.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.siggraph.org/s2010/for_attendees/posters"&gt;poster sessions&lt;/a&gt; are Tuesday and Wednesday, 12:15-1:15pm.  If you are interested in GPU ray casting, rendering ellipsoids, or anything related, stop by our poster at location 80B in the West Lobby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-67903597652724752?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/67903597652724752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/07/gpu-ray-casting-of-virtual-globes-at.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/67903597652724752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/67903597652724752'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/07/gpu-ray-casting-of-virtual-globes-at.html' title='GPU Ray Casting of Virtual Globes at SIGGRAPH 2010'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-1016328689147191367</id><published>2010-06-30T10:30:00.000-04:00</published><updated>2010-06-30T10:31:50.597-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Direct3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><category scheme='http://www.blogger.com/atom/ns#' term='Multithreading'/><title type='text'>GPU Pro Review - 3D Engine Design Section</title><content type='html'>I recently started reading &lt;a target="_blank"  href="http://www.amazon.com/GPU-Pro-Advanced-Rendering-Techniques/dp/1568814720?ie=UTF8&amp;tag=virtua06a-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;GPU Pro&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=virtua06a-20&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=1568814720" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt; and it is outstanding!  I love the full color and syntax highlighting!  Many of the articles are even useful research for our own book.  I'd like to write a full review but who knows when I'll get through the 700+ pages.  So I'm going to write a review as I read each section.  These reviews will be more about the ideas the articles give me than a complete review of the contents, writing style, etc.  But isn't that the point of reading anyway - to get new ideas?&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;3D Engine Design&lt;/i&gt; section was the first section that peeked my interest.  Of which, I read two of the four articles:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Porting Code between Direct3D 9 and OpenGL 2.0&lt;/i&gt; - Wojciech Sterna&lt;br /&gt;&lt;br /&gt;A chapter in our book is on designing an abstraction layer over OpenGL so the rest of the book can contain API agnostic discussion and code examples (with the exception of the use of GLSL for shaders).  This isn't just important for book writing, all major graphics applications should have a renderer abstraction layer for flexibility, portability, performance, and most importantly, ease of development.&lt;br /&gt;&lt;br /&gt;If you count a graduate class project, this is third time I've designed such a layer (check it out on &lt;a href="http://miniglobe.svn.sourceforge.net/viewvc/miniglobe/Source/Renderer/"&gt;sourceforge&lt;/a&gt;).  Every time, I've done so with OpenGL so I was excited to see this article on the differences between Direct3D and OpenGL.  While designing the layer, I looked at the Direct3D documentation from time to time but I am not positive that it is ideal for both APIs so I looked forward to learning more from this article.&lt;br /&gt;&lt;br /&gt;And I did learn quite a bit.  Perhaps I should be embarrassed to say, but I didn't know anything about the fine grain control available in Direct3D with memory pools.  I also felt good learning that many things like vertex buffers and textures seem very similar between the two APIs.&lt;br /&gt;&lt;br /&gt;I liked the mention of Cg - since I was recently asked why not use Cg instead of duplicating shaders in GLSL and HLSL.  Although it sounds like two slightly different Cg shaders would need to be written anyway.  If anyone has experience with maintaining shaders for different APIs, I'd like to hear about it.&lt;br /&gt;&lt;br /&gt;Overall, this article was pretty good and I like that it was only 11 pages and right to the point.  If I had to criticize it, I would have liked it to be about Direct3D 10/11 and OpenGL 3.2 core profile.  But I understand that Direct3D 9 is still widely used and OpenGL 3.2 might not of even been out when this article was written.  It would have also been nice to see more tips on designing an abstraction layer that allows for reasonable implementations using both APIs instead of just the API differences - although, the &lt;a href="http://www.akpeters.com/gpupro/"&gt;example code&lt;/a&gt; more than makes up for this.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Practical Thread Rendering for DirectX 9&lt;/i&gt; - David Pangerl&lt;br /&gt;&lt;br /&gt;This article also jumped out at me since I am preparing to write the threading material for our book.  My focus is on using threads for out-of-core rendering:  reading data from secondary storage, CPU intensive processing of that data (.e.g, computing normals, etc), then finally creating renderer resources (e.g., vertex buffers, textures, etc) - assuming I get all the example code &lt;a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&amp;Number=279118#Post279118"&gt;working&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;This short article is on another use of threading:  using a dedicated thread for issuing rendering commands.  The basic idea is to fill a command buffer instead of directly issuing Direct3D calls (I'm pretty sure this would also work with OpenGL).  A dedicated rendering thread then executes the command buffer.  Filling the command buffer is much faster than calling Direct3D functions, which reduces the CPU usage of your main thread.  An interesting statistic from the article is the author found an average Direct3D function call takes 15,231 instructions.  Using the dedicated rendering thread, the author saw improvements up to 200% in tests, and a 15% in a real-time game.  Considering all that is going on in a game, 15% is great!&lt;br /&gt;&lt;br /&gt;One thing I'm curious about is what happens when uploading large objects like vertex buffers and textures?  Its not clear to me if a copy of the data is made for the rendering thread or if this falls into their category of commands that synchronize with the rendering thread and execute immediately.  I'm also curious about operations like compiling and linking shaders which may be threaded by the driver anyway.  I suppose this can happen offline in Direct3D.&lt;br /&gt;&lt;br /&gt;It's worth mentioning that if you have an abstraction layer over your rendering API (and you should!), this could all be done behind the scenes with the user having no idea that there is a dedicated rendering thread.&lt;br /&gt;&lt;br /&gt;In closing, I think this is a worthwhile idea that I'd like to implement myself at some point.  Also, I'm not sure how this compares to &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=97852ee6-56cd-4f0b-9efb-962a95d33f72"&gt;multithreaded rendering in Direct3D 11&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now onto the &lt;i&gt;Game Postmortems&lt;/i&gt; section!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-1016328689147191367?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/1016328689147191367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/06/gpu-pro-review-3d-engine-design-section.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1016328689147191367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/1016328689147191367'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/06/gpu-pro-review-3d-engine-design-section.html' title='GPU Pro Review - 3D Engine Design Section'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-935410731531028523.post-5556872192238697087</id><published>2010-06-26T08:51:00.001-04:00</published><updated>2010-10-09T11:39:09.457-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Welcome</title><content type='html'>Welcome to our graphics blog!  This will be a journal of sorts for our upcoming book tentatively titled &lt;i&gt;Virtual Globe and Terrain Rendering&lt;/i&gt; to be published by &lt;a href="http://www.akpeters.com/"&gt;AK Peters, Ltd.&lt;/a&gt; in time for &lt;a href="http://www.siggraph.org/s2011/"&gt;SIGGRAPH 2011&lt;/a&gt;.  We'll talk about our experiences preparing the manuscript and the heaps of &lt;a href="https://sourceforge.net/projects/miniglobe/"&gt;example code&lt;/a&gt; (which you can download as we work on it, before the book is available!).  The &lt;a href="http://virtualglobeandterrainrendering.blogspot.com/p/about.html"&gt;about&lt;/a&gt; page has more information on our book, including the planned contents.&lt;br /&gt;&lt;br /&gt;Even if you don't think you're interested in our book project, our blog should be useful for real-time computer graphics in general.  Many of the techniques used for virtual globe rendering are applicable in all sorts of places - GIS, games, simulations, etc.  We anticipate at least as much general graphics content as we do book-related content.&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/935410731531028523-5556872192238697087?l=blog.virtualglobebook.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.virtualglobebook.com/feeds/5556872192238697087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.virtualglobebook.com/2010/06/welcome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/5556872192238697087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/935410731531028523/posts/default/5556872192238697087'/><link rel='alternate' type='text/html' href='http://blog.virtualglobebook.com/2010/06/welcome.html' title='Welcome'/><author><name>Patrick Cozzi</name><uri>http://www.blogger.com/profile/16648883274039420643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_wUfqk3kFyG4/THFqTuqDCCI/AAAAAAAABS0/EpSxQ33HCAg/S220/PatrickCozziCropped.jpg'/></author><thr:total>0</thr:total></entry></feed>
