{"id":175,"date":"2013-01-30T12:07:31","date_gmt":"2013-01-30T20:07:31","guid":{"rendered":"http:\/\/martinecker.com\/martincodes\/?p=175"},"modified":"2013-02-01T12:17:09","modified_gmt":"2013-02-01T20:17:09","slug":"cool-link-stash-january-2013","status":"publish","type":"post","link":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/","title":{"rendered":"Cool Link Stash, January 2013"},"content":{"rendered":"<h4>C++<\/h4>\n<p>There's a good video talk up on Channel 9 from the C++ and Beyond 2012 conference called <a href=\"http:\/\/channel9.msdn.com\/posts\/C-and-Beyond-2012-Herb-Sutter-You-dont-know-blank-and-blank\" target=\"_blank\">You don't know blank and blank<\/a> on the different meaning of const and mutable in C++11.<br \/>\nIn summary, the const keyword in C++11 no longer means logical const as it did in C++98. In C++11 const has the sense of bitwise const (or at least internally synchronized to make a function or const-declared object thread-safe).<br \/>\nThis follows from the fact that the C++11 standard library guarantees that const means thread-safe for its own types and all operations it calls on your types.<br \/>\nThread-safe means bitwise const (i.e. no modifications) or internally synchronized. Copy constructors need to be thread-safe in C++11!<br \/>\nIt follows that any object that is declared const is fully thread-safe, i.e. truly immutable or internally synchronized.<br \/>\nNote that it's already undefined behavior in C++98 to cast away const from an object declared const!<br \/>\nThe new meaning of mutable in C++11 is also thread-safe. A mutable-declared mutex, for example, is now basically a thread-safe object (this means that even its non-const member functions are thread-safe).<\/p>\n<p>Another good Channel 9 talk from C++ and Beyond 2012 that got posted recently is Herb Sutter's talk called <a href=\"http:\/\/channel9.msdn.com\/Shows\/Going+Deep\/C-and-Beyond-2012-Herb-Sutter-Concurrency-and-Parallelism\" target=\"_blank\">C++ Concurrency<\/a>.<\/p>\n<p><\/p>\n<h4>Graphics<\/h4>\n<p>S\u00e9bastien Lagarde has an interesting (and still ongoing) <a href=\"http:\/\/seblagarde.wordpress.com\/2012\/12\/10\/observe-rainy-world\/\" target=\"_blank\">blog post series on rendering real-time water<\/a>.<\/p>\n<p>In the SIGGRAPH brief <a href=\"https:\/\/sites.google.com\/site\/takahiroharada\/storage\/2012SA_2.5DCulling.pdf?attredirects=0\" target=\"_blank\">A 2.5D Culling for Forward+<\/a> Takahiro Harada presents a new light culling approach for Forward+ (aka Tile-Based Forward Rendering). The idea is to basically split the frustum for a tile along the depth axis into 32 buckets and then create a bit mask that contains a 1 for a bucket with geometry and a 0 for a bucket with empty space. The same bit mask is computed for the volume of influence of a light. By comparing the bit masks lights can be quickly culled along the depth of a tile's frustum.<\/p>\n<p>NVIDIA has a new, interesting paper titled <a href=\"http:\/\/graphics.cs.williams.edu\/papers\/PhotonI3D13\/\" target=\"_blank\">Toward Practical Real-Time Photon Mapping: Efficient GPU Density Estimation<\/a>.<\/p>\n<p><a href=\"http:\/\/www.volumesoffun.com\/polyvox-about\/\" target=\"_blank\">PolyVox<\/a> is a C++ library by indie game developer Volumes Of Fun that provides storage and processing of voxel-based environments. It's released under a liberal zlib license and the source code is available on BitBucket.<\/p>\n<p>Inigo Quilez has an excellent article up on <a href=\"http:\/\/www.iquilezles.org\/www\/articles\/multiresaocc\/multiresaocc.htm\" target=\"_blank\">Multiresolution Ambient Occlusion<\/a> with plenty of pictures. Well worth the read.<\/p>\n<p>A pretty nifty idea for denoising images generated via Monte Carlo ray tracing is presented in the paper <a href=\"http:\/\/cs.au.dk\/~toshiya\/vfl.pdf\" target=\"_blank\">Robust Image Denoising using a Virtual Flash Image for Monte Carlo Ray Tracing<\/a> by Boochang Moon et al. Here's the <a href=\"http:\/\/sglab.kaist.ac.kr\/VFL\/\" target=\"_blank\">companion website with a video<\/a> (download the file, don't watch it on youtube because the strong video compression makes it pointless). The idea is to generate a virtual flash image (by putting a flash-like light source at the camera position and summing that with direct illumination of diffuse surfaces and all interaction with specular surfaces). This virtual flash image is then used to guide the denoising process. The technique is somewhat similar to a paper from several years ago where a real-life flash picture is used to denoise a non-flash picture of the same scene via bilateral filtering.<\/p>\n<p>The I3D paper from the Technical University of Vienna <a href=\"http:\/\/www.cg.tuwien.ac.at\/research\/publications\/2013\/LUKSCH-2013-FLM\/\" target=\"_blank\">Fast Light-Map Computation with Virtual Polygon Lights<\/a> describes a quality improvement to the typical VPL-based instant radiosity method to quickly generate light maps on the GPU.<\/p>\n<p>Chris\u00adt\u00adian Sch\u00fcler has a nice article on his blog titled <a href=\"http:\/\/www.thetenthplanet.de\/archives\/1180\" target=\"_blank\">Normal Mapping Without Precomputed Tangents<\/a>. As you might guess, it's about doing normal mapping in a pixel shader without passing a tangent frame via vertex attributes.<\/p>\n<p><\/p>\n<h4>Web Development<\/h4>\n<p><a href=\"http:\/\/addyosmani.github.com\/backbone-fundamentals\/\" target=\"_blank\">Developing Backbone.js Applications<\/a> is an early, online pre-release of a book by Addy Osmani on the popular JavaScript MVC framework Backbone.js.<\/p>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++ There's a good video talk up on Channel 9 from the C++ and Beyond 2012 conference called You don't know blank and blank on the different meaning of const and mutable in C++11. In summary, the const keyword in &hellip; <a href=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[9],"tags":[],"class_list":["post-175","post","type-post","status-publish","format-standard","hentry","category-cool-link-stash"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.12 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cool Link Stash, January 2013 - Martin Codes<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cool Link Stash, January 2013 - Martin Codes\" \/>\n<meta property=\"og:description\" content=\"C++ There&#039;s a good video talk up on Channel 9 from the C++ and Beyond 2012 conference called You don&#039;t know blank and blank on the different meaning of const and mutable in C++11. In summary, the const keyword in &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\" \/>\n<meta property=\"og:site_name\" content=\"Martin Codes\" \/>\n<meta property=\"article:published_time\" content=\"2013-01-30T20:07:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-02-01T20:17:09+00:00\" \/>\n<meta name=\"author\" content=\"Martin Ecker\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Ecker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\",\"url\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\",\"name\":\"Cool Link Stash, January 2013 - Martin Codes\",\"isPartOf\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/#website\"},\"datePublished\":\"2013-01-30T20:07:31+00:00\",\"dateModified\":\"2013-02-01T20:17:09+00:00\",\"author\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816\"},\"breadcrumb\":{\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/martinecker.com\/martincodes\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cool Link Stash, January 2013\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#website\",\"url\":\"http:\/\/martinecker.com\/martincodes\/\",\"name\":\"Martin Codes\",\"description\":\"Ramblings from a video game\/graphics programmer on anything coding- or graphics-related\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/martinecker.com\/martincodes\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816\",\"name\":\"Martin Ecker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g\",\"caption\":\"Martin Ecker\"},\"url\":\"http:\/\/martinecker.com\/martincodes\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cool Link Stash, January 2013 - Martin Codes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/","og_locale":"en_US","og_type":"article","og_title":"Cool Link Stash, January 2013 - Martin Codes","og_description":"C++ There's a good video talk up on Channel 9 from the C++ and Beyond 2012 conference called You don't know blank and blank on the different meaning of const and mutable in C++11. In summary, the const keyword in &hellip; Continue reading &rarr;","og_url":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/","og_site_name":"Martin Codes","article_published_time":"2013-01-30T20:07:31+00:00","article_modified_time":"2013-02-01T20:17:09+00:00","author":"Martin Ecker","twitter_misc":{"Written by":"Martin Ecker","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/","url":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/","name":"Cool Link Stash, January 2013 - Martin Codes","isPartOf":{"@id":"http:\/\/martinecker.com\/martincodes\/#website"},"datePublished":"2013-01-30T20:07:31+00:00","dateModified":"2013-02-01T20:17:09+00:00","author":{"@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816"},"breadcrumb":{"@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/martinecker.com\/martincodes\/cool-link-stash-january-2013\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/martinecker.com\/martincodes\/"},{"@type":"ListItem","position":2,"name":"Cool Link Stash, January 2013"}]},{"@type":"WebSite","@id":"http:\/\/martinecker.com\/martincodes\/#website","url":"http:\/\/martinecker.com\/martincodes\/","name":"Martin Codes","description":"Ramblings from a video game\/graphics programmer on anything coding- or graphics-related","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/martinecker.com\/martincodes\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/2ad254c988c5aaef13e54a1cadde5816","name":"Martin Ecker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/martinecker.com\/martincodes\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7dfd53e699c35d22210a3c63e4b3e2cfae66f49029b0cde5f3c9d86847471d7a?s=96&d=mm&r=g","caption":"Martin Ecker"},"url":"http:\/\/martinecker.com\/martincodes\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/comments?post=175"}],"version-history":[{"count":22,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/175\/revisions"}],"predecessor-version":[{"id":215,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/posts\/175\/revisions\/215"}],"wp:attachment":[{"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/media?parent=175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/categories?post=175"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/martinecker.com\/martincodes\/wp-json\/wp\/v2\/tags?post=175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}