<?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-3685042506497839630</id><updated>2011-04-21T18:55:17.880+01:00</updated><title type='text'>Joe's Honours Project</title><subtitle type='html'>A 4th year student at The University of Abertay, Dundee's project diary for his BSc in Computer Games Technology.

The topic? Real time ray tracing as a next-gen. Rendering approach for computer games.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-4925133171366318308</id><published>2009-05-14T16:10:00.002+01:00</published><updated>2009-05-14T16:18:23.994+01:00</updated><title type='text'>The End is Nigh!</title><content type='html'>I've not done any coding since the last update. I managed to sensibly draw that part of the project to a close and have been really concentrating on the dissertation.&lt;br /&gt;&lt;br /&gt;I'm in the final stages and as it stands &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;I'm&lt;/span&gt; around 7000 words and 59 pages through into a fully formatted dissertation with all the trimmings (front page, abstract, foreword, contents, main body text, references and bibliography, appendices) with only the following sections to complete:&lt;br /&gt;&lt;br /&gt;Table of figures&lt;br /&gt;Overview/Layout&lt;br /&gt;Conclusion/&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Future work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So I'm probably looking at around 8000 words and 61 pages total. Hoping to print on &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;Sunday&lt;/span&gt; night/&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;Monday&lt;/span&gt; morning (a few days from now) and bind on &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Monday&lt;/span&gt;. Perhaps hand it in or take it home and stroke for a couple of days before I do so.&lt;br /&gt;&lt;br /&gt;I'm pretty pleased anyway, I'm actually &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;surprised&lt;/span&gt; that I've managed to keep my project organised and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;I'm&lt;/span&gt; not finding myself here &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;panicking&lt;/span&gt; with only a literature review written or something, which is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_8"&gt;more&lt;/span&gt; than i can say for some people. I'm relatively stress free.. although looking forward to getting to enjoy the sun again and actually spend time with my girlfriend/friends.&lt;br /&gt;&lt;br /&gt;Dissertation is with my dad for review at the moment. Will keep pushing for the rest of the time I have. Its not over yet :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-4925133171366318308?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/4925133171366318308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=4925133171366318308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4925133171366318308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4925133171366318308'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/05/end-is-nigh.html' title='The End is Nigh!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5383791616142544540</id><published>2009-04-24T20:45:00.002+01:00</published><updated>2009-04-24T20:49:39.594+01:00</updated><title type='text'>Update</title><content type='html'>Woah! Looks like i havent updated in a while.. I've been getting on with my dissertation and other courseworks.&lt;br /&gt;&lt;br /&gt;About half way through the dissertation now, looking to pick up speed.&lt;br /&gt;&lt;br /&gt;As for the application: i managed to get a 1.4x speed increase by just using a different compiler! (intel c++) and a few tweaks here and there. Nothing major, i'm pretty happy with it. I've also noticed in simple scenes a super-linear speedup. For example, in the "two spheres" scene posted most often on this website, with one core running it, i can get about 15.1fps. Using 4 cores yields just over 70fps. a 4.66x speed increase! This is due to the "cache effect". My program utilises the cache super efficiently in the tiled rendering mode. so it has that performance improvement as well as the pure calculation speed increase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5383791616142544540?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5383791616142544540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5383791616142544540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5383791616142544540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5383791616142544540'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/04/update.html' title='Update'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-326176760525452067</id><published>2009-03-27T19:23:00.002Z</published><updated>2009-03-27T19:28:25.440Z</updated><title type='text'>XML parsing</title><content type='html'>I've added the ability for my program to parse XML files as it builds. All application settings are contained in this file (technical settings, ray tracer properties, scene information etc..) so now i need not re-compile the project everytime I want to change a setting or the scene. Very handy! This was done using an Open source C++ XML parsing library called TinyXML. Its really very good.&lt;br /&gt;&lt;br /&gt;I've also added a ray counter. A bit tricky because of thread specific storage and synchronisation to be dealt with at the end but its up and running. I won't bother posting a screen shot because its not really that exciting.&lt;br /&gt;&lt;br /&gt;I've a couple of other little bugs to fix in the program but its all definetly coming to a halt, i've not done any work on it for a ew days actually.&lt;br /&gt;&lt;br /&gt;I've been writing my dissertaition! So far I have about a thousand words written down in the introduction, objectives and background section. will aim to have 2000 - 2500 down by the end of the weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-326176760525452067?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/326176760525452067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=326176760525452067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/326176760525452067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/326176760525452067'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/03/xml-parsing.html' title='XML parsing'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-4075350583564923116</id><published>2009-03-19T19:38:00.001Z</published><updated>2009-03-19T19:38:12.740Z</updated><title type='text'></title><content type='html'>I've got the tile based approach of rendering up and running. I'm able to state how many thread i want it to use (like the split screen camera), and what size tiles i want to be rendered at a time for full flexibility. the tiles must be a number that the resolution of the screen can be divided by though. ie, for a 400*400 display, a tile can either be 1x1, 2x2, 4x4, 8x8, 16x16, 20x20, 40x40 and so on. I find that i get the best results from about 16x16 square tiles.&lt;br /&gt;&lt;br /&gt;To make the concept of all this easier to see, I've added in a switch that turns a thread visualistation on. Here is a scene using one thread, with and without visualisation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/ScKaxWyAIYI/AAAAAAAAAHs/uqfxq9hEfMs/s1600-h/single.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 368px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/ScKaxWyAIYI/AAAAAAAAAHs/uqfxq9hEfMs/s400/single.png" alt="" id="BLOGGER_PHOTO_ID_5314980682970177922" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/ScKa4gJDp5I/AAAAAAAAAH0/4jywpvVqBhk/s1600-h/singlevis.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 368px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/ScKa4gJDp5I/AAAAAAAAAH0/4jywpvVqBhk/s400/singlevis.png" alt="" id="BLOGGER_PHOTO_ID_5314980805741881234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The red colour shows that thread one is doing the work on those pixels. Since threre is only one thread, all we can see is the red.&lt;br /&gt;&lt;br /&gt;Introducing the splitscreen rendering method now:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/ScKbWKRf9MI/AAAAAAAAAH8/OZYcdbEpGHY/s1600-h/splitvis.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 368px; height: 400px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/ScKbWKRf9MI/AAAAAAAAAH8/OZYcdbEpGHY/s400/splitvis.PNG" alt="" id="BLOGGER_PHOTO_ID_5314981315267785922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We can see that four threads (red, blue, green and yellow) are working on their own portions of the screen.&lt;br /&gt;&lt;br /&gt;Now heres the latest update, the tile based rendering approach, using 16x16 tiles:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/ScKcZDtqocI/AAAAAAAAAIE/uChOfC3Kn2c/s1600-h/tiledvis.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 368px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/ScKcZDtqocI/AAAAAAAAAIE/uChOfC3Kn2c/s400/tiledvis.png" alt="" id="BLOGGER_PHOTO_ID_5314982464558113218" border="0" /&gt;&lt;/a&gt;We're able to see a very pretty map of work distribution between each thread.&lt;br /&gt;&lt;br /&gt;On top of this, I'm able to report a few results that I'm happy with:&lt;br /&gt;&lt;br /&gt;using those above, we not that one thread is able to render 2.7384 frames per second while the split screen method with four threads achieves 8.1917fps - a 2.991x speed increase.&lt;br /&gt;&lt;br /&gt;The tiled approach however achieves 10.8726 frames per second - a 3.97x increase!&lt;br /&gt;&lt;br /&gt;Showing that ray tracing can scale very NEARLY linearly with N numbers of cores. ie framerate = O(N*0.9926), according to the tile based approach.&lt;br /&gt;&lt;br /&gt;In other news, I've started writing my dissertion and so far have a plan laid out and notes for each heading, detailing what each section should contain and hopefully these notes will give me a boost over the "where do I start" syndrome.&lt;br /&gt;&lt;br /&gt;So I'm ahead in code but behind in writing. That may change this weekend.&lt;br /&gt;&lt;br /&gt;Goals now? Continue writing.. get stuck into that, but also build into my ray tracer the ability to parse scene files, so i don't have to recompile the thing each time I want to run tests on a scene.&lt;br /&gt;&lt;br /&gt;Oh and benchmark functionality might be nice (ie. run n number of cycles on the same scene using each render method, record the results and analyse accordingly.)&lt;br /&gt;&lt;br /&gt;I've emailed Andy Sapeluk about using this PS3 Cluster. It might be too late now for anything to come of it but i still want to get my hands dirty!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-4075350583564923116?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/4075350583564923116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=4075350583564923116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4075350583564923116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4075350583564923116'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/03/ive-got-tile-based-approach-of.html' title=''/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kMRp_EJicWs/ScKaxWyAIYI/AAAAAAAAAHs/uqfxq9hEfMs/s72-c/single.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2242452109320567038</id><published>2009-03-07T09:39:00.002Z</published><updated>2009-03-07T09:44:12.506Z</updated><title type='text'></title><content type='html'>Heres a dragon model consisting of about 47k triangles&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SbJBPHZa8sI/AAAAAAAAAHQ/lkMvEGAKJyY/s1600-h/dragon50k.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 385px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SbJBPHZa8sI/AAAAAAAAAHQ/lkMvEGAKJyY/s400/dragon50k.png" alt="" id="BLOGGER_PHOTO_ID_5310378638562751170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The same dragon, this time with 1.13 million triangles:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SbJBPU3u0ZI/AAAAAAAAAHg/kfT4kOH4zvU/s1600-h/dragon1.133m.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 385px; height: 400px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SbJBPU3u0ZI/AAAAAAAAAHg/kfT4kOH4zvU/s400/dragon1.133m.png" alt="" id="BLOGGER_PHOTO_ID_5310378642179543442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;the same 1.13 million triangles, with 16 samples per pixel and 25*16 samples for AO per pixel:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SbJBPcsz0HI/AAAAAAAAAHY/-SThPINgGMw/s1600-h/dragonlarge.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SbJBPcsz0HI/AAAAAAAAAHY/-SThPINgGMw/s400/dragonlarge.png" alt="" id="BLOGGER_PHOTO_ID_5310378644281217138" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2242452109320567038?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2242452109320567038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2242452109320567038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2242452109320567038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2242452109320567038'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/03/heres-dragon-model-consisting-of-about.html' title=''/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/SbJBPHZa8sI/AAAAAAAAAHQ/lkMvEGAKJyY/s72-c/dragon50k.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-6140197419077970257</id><published>2009-03-04T14:53:00.002Z</published><updated>2009-03-04T15:09:21.548Z</updated><title type='text'>Models! .Obj file parser and loader sculpted from lex and yacc.</title><content type='html'>A lot of ray tracer use the .ply model format to load in meshes because its easy to use, since Greg Turk already wrote ply loading libraries back in the 90s, working with the stanford scanning repository. This why typically you only see the same scenes in ray tracers (who else is getting tired of the stanford bunny?) So I decided to write my very own Obj file parser using lex and yacc (yet another compiler compiler). Since the Obj file is an open text based format, it wasn't too hard to do. Although I did have (well, i was being a bit lazy) to tailor the parser specifically for the way milkshape exports .obj files, since so many exporters write the files in different ways (most leave out data, which is no good!) milkshap is kind, since if the model doesn't have texture co-ordinate data, it'll just stick one co-ord into the file and lets me not have to worry about checking for this kind of inconvenience. Anyway. Its done.. I'm a little annoyed though because milkshape can't handle models over about 50k triangles... so i can't test some amazing looking millions of triangle models in my ray tracer.&lt;br /&gt;&lt;br /&gt;Currently the ray tracer doesn't support textures, groups and different materials per group.. so we'll just call them sculptures. ;) Nor anything but triangles...&lt;br /&gt;&lt;br /&gt;There are a few screenshots below of a house and a helicopter. The helicopter is made of 4536 vertices and 4748 triangles and the house is 34075 vertices and 27545 triangles.&lt;br /&gt;&lt;br /&gt;Each shot is 720p and for each model there is 2 renders using 4 samples per pixel, ambient occlusion (i think its about 144 samples per pixel), shadows and either a matte finish or reflective surface. The third of each set is a "real time" rendering at 1 sample per pixel and no AO. Click on them for larger.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WZcm-O9I/AAAAAAAAAHI/w0MvZzNHo2Y/s1600-h/mirrorhouse.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WZcm-O9I/AAAAAAAAAHI/w0MvZzNHo2Y/s400/mirrorhouse.png" alt="" id="BLOGGER_PHOTO_ID_5309346374636944338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/Sa6WZTk3UJI/AAAAAAAAAHA/rhjmRePov8g/s1600-h/mattehouse.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/Sa6WZTk3UJI/AAAAAAAAAHA/rhjmRePov8g/s400/mattehouse.png" alt="" id="BLOGGER_PHOTO_ID_5309346372212183186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/Sa6WZNPxsrI/AAAAAAAAAG4/d0uvLdMhjhs/s1600-h/housert.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/Sa6WZNPxsrI/AAAAAAAAAG4/d0uvLdMhjhs/s400/housert.png" alt="" id="BLOGGER_PHOTO_ID_5309346370513121970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WKs7RV3I/AAAAAAAAAGw/SFdyOXA_-xY/s1600-h/mirrorheli.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WKs7RV3I/AAAAAAAAAGw/SFdyOXA_-xY/s400/mirrorheli.png" alt="" id="BLOGGER_PHOTO_ID_5309346121319012210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/Sa6WKfbJqPI/AAAAAAAAAGo/-PA1yxRWeis/s1600-h/matteheli.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/Sa6WKfbJqPI/AAAAAAAAAGo/-PA1yxRWeis/s400/matteheli.png" alt="" id="BLOGGER_PHOTO_ID_5309346117694630130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WKP7vROI/AAAAAAAAAGg/L4ZKJliXk_8/s1600-h/helirt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WKP7vROI/AAAAAAAAAGg/L4ZKJliXk_8/s400/helirt.png" alt="" id="BLOGGER_PHOTO_ID_5309346113536345314" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-6140197419077970257?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/6140197419077970257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=6140197419077970257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6140197419077970257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6140197419077970257'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/03/models-obj-file-parser-and-loader.html' title='Models! .Obj file parser and loader sculpted from lex and yacc.'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kMRp_EJicWs/Sa6WZcm-O9I/AAAAAAAAAHI/w0MvZzNHo2Y/s72-c/mirrorhouse.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-4889906193670224993</id><published>2009-02-23T18:37:00.000Z</published><updated>2009-02-23T18:38:04.604Z</updated><title type='text'>:)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SaLtA1nVCYI/AAAAAAAAAGI/x7A0ck8VbmU/s1600-h/nice.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SaLtA1nVCYI/AAAAAAAAAGI/x7A0ck8VbmU/s400/nice.png" alt="" id="BLOGGER_PHOTO_ID_5306063909643684226" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-4889906193670224993?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/4889906193670224993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=4889906193670224993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4889906193670224993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4889906193670224993'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/02/blog-post.html' title=':)'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kMRp_EJicWs/SaLtA1nVCYI/AAAAAAAAAGI/x7A0ck8VbmU/s72-c/nice.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-6730389439912492530</id><published>2009-02-23T00:18:00.004Z</published><updated>2009-02-23T00:43:48.789Z</updated><title type='text'>Regular Grids</title><content type='html'>I've implemented a spatial subdivision algorithm: Regular grids. Basically this is a grid of axis aligned boxes, all the same size, with each grid having a pointer to each object stored inside the box. The grid is traversed box by box and any intersection tests are made along the wat. once an objectis hit, the grid traversal stops. I can now render many objects in one scene with a minimal drop in framerate. the rendering time used to vary linearly with the number of objects in the scene, now the render time of a frame is denoted as a function of log(n), where n is the number of objects in the scene. Heres a nice picture showing depth of field with 100 matte spheres, rendered with 4 threads:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SaHv0g6PdFI/AAAAAAAAAFw/HwoC0MsEuyw/s1600-h/100mattespheres.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SaHv0g6PdFI/AAAAAAAAAFw/HwoC0MsEuyw/s400/100mattespheres.png" alt="" id="BLOGGER_PHOTO_ID_5305785521485608018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A scene showing 10,000 spheres all casting shadows and all reflective, with 3 levels of reflection:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SaHwhcelNiI/AAAAAAAAAF4/pUKWP0wRUtw/s1600-h/10000spheres.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SaHwhcelNiI/AAAAAAAAAF4/pUKWP0wRUtw/s400/10000spheres.png" alt="" id="BLOGGER_PHOTO_ID_5305786293389964834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And zoomed in:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SaHwvK6tHJI/AAAAAAAAAGA/sRl2J6W1CJc/s1600-h/lotsofspheres.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SaHwvK6tHJI/AAAAAAAAAGA/sRl2J6W1CJc/s400/lotsofspheres.png" alt="" id="BLOGGER_PHOTO_ID_5305786529194253458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It'll run about 20% faster using ten threads instead of four too!&lt;br /&gt;&lt;br /&gt;Next step: Triangle meshes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-6730389439912492530?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/6730389439912492530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=6730389439912492530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6730389439912492530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6730389439912492530'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/02/regular-grids.html' title='Regular Grids'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kMRp_EJicWs/SaHv0g6PdFI/AAAAAAAAAFw/HwoC0MsEuyw/s72-c/100mattespheres.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5642769614622158550</id><published>2009-02-17T20:45:00.003Z</published><updated>2009-02-17T20:52:37.013Z</updated><title type='text'>Just for fun</title><content type='html'>A nice render of two matte spheres and a plane with depth of field.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Specs&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;1024x720 (720p)&lt;br /&gt;9 Jittered Samples per pixel (9 primary rays per pixel)&lt;br /&gt;36 shadow rays per primary ray intersection for ambient occlusion (324 pp)&lt;br /&gt;One point light casting shadows.&lt;br /&gt;Depth of field (144 Jittered samples per pixel) done as post process&lt;br /&gt;&lt;br /&gt;click on it for a larger image.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SZsjHCKmG-I/AAAAAAAAAFo/ktV8ewgmQAE/s1600-h/big.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SZsjHCKmG-I/AAAAAAAAAFo/ktV8ewgmQAE/s400/big.png" alt="" id="BLOGGER_PHOTO_ID_5303871589906258914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5642769614622158550?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5642769614622158550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5642769614622158550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5642769614622158550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5642769614622158550'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/02/just-for-fun.html' title='Just for fun'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kMRp_EJicWs/SZsjHCKmG-I/AAAAAAAAAFo/ktV8ewgmQAE/s72-c/big.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-8678415675572894599</id><published>2009-02-17T13:23:00.005Z</published><updated>2009-02-17T17:03:23.132Z</updated><title type='text'>Depth of field - for free!</title><content type='html'>I realised that since I'm using an RGBA texture to render to (directx for some reason doesnt like RGB dynamic textures), i had a completely unused alpha channel. So I figured i could output the average length of ray per pixel into this channel to store the depth of the pixel in the scene - and then apply a depth based shader to the texture in directx. I've chosen depth of field because this is pretty expensive to model in ray tracing as it involves even more samples per pixel. Using the alpha channel of the texture to store scene depth for each pixel, i could quite easily assess how far this pixel was away from the focal plane and blur it accordingly. I used &lt;a href="http://ati.amd.com/developer/shaderx/shaderx2_real-timedepthoffieldsimulation.pdf"&gt;this paper&lt;/a&gt; from ATI and modified it to suit the ray tracer. Oh and I changed it to pixel shader 3.0 because 2.0 is a joke and doesnt allow you many calculations at all. Using 3.0, I've been able to increase the number of samples used for blurring from 12 to 144, giving a much nicer result. Its not really perfect and no-where near as nice as ray traced depth of field would be, but I can't argue with a 0% drop in framerate for the effect.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SZrss2rzw8I/AAAAAAAAAFY/H1bpP48uQlQ/s1600-h/dof2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SZrss2rzw8I/AAAAAAAAAFY/H1bpP48uQlQ/s400/dof2.png" alt="" id="BLOGGER_PHOTO_ID_5303811766519841730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've got some issues to sort out with it yet.. like bleeding of shard edges. That green sphere should be sharp, its reflections are the thing that is blurred. Shouldnt be too hard a fix though I'd imagine. Its looking good though! I'm especially suprised at the quality of blurring I'm able to achieve in a pixel shader in real time.&lt;br /&gt;&lt;br /&gt;Here is what the scene looks like showing how much each pixel is blurred (white for full, black for none)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SZrtwUEvReI/AAAAAAAAAFg/WEsQgttMWa8/s1600-h/blurred.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SZrtwUEvReI/AAAAAAAAAFg/WEsQgttMWa8/s400/blurred.png" alt="" id="BLOGGER_PHOTO_ID_5303812925460268514" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-8678415675572894599?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/8678415675572894599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=8678415675572894599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8678415675572894599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8678415675572894599'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/02/depth-of-field-for-free.html' title='Depth of field - for free!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/SZrss2rzw8I/AAAAAAAAAFY/H1bpP48uQlQ/s72-c/dof2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5295045050144772857</id><published>2009-02-17T13:02:00.006Z</published><updated>2009-02-17T13:23:49.739Z</updated><title type='text'>Multithreading</title><content type='html'>I've succeeded in setting up a multithreaded version of the ray tracer, using a simple and naive split screen method. It took me a while to figure out some static data was making the whole thing very unsafe and slow but thats all now been sorted using thread local storage. I've had to take the ray counter out due to technical difficulties but i'll get that back in soon.&lt;br /&gt;&lt;br /&gt;I'm getting the results I expected though: on one core the scene is capable of 18fps and using 4 cores it is achieving 50fps (~2.5x speed up). 4x in best case scenario. The reason? in parts of the screen the ray tracer has more work to do might be mostly assigned to one thread, leaving the other threads waiting for that one to finish at the end of the frame. Anyway as proof: here is out favourite test scene (400x400, 1spp, 2 spheres with 3 levels of reflections, one matte plane and no AO):&lt;br /&gt;&lt;br /&gt;1 thread (one core):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SZq4eiC74XI/AAAAAAAAAE4/i5k-rz4kqQQ/s1600-h/1thread.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SZq4eiC74XI/AAAAAAAAAE4/i5k-rz4kqQQ/s400/1thread.png" alt="" id="BLOGGER_PHOTO_ID_5303754345856885106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;4 threads (4 cores):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SZq4ruQKgfI/AAAAAAAAAFA/1XBtMG0zcI8/s1600-h/4threads.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SZq4ruQKgfI/AAAAAAAAAFA/1XBtMG0zcI8/s400/4threads.png" alt="" id="BLOGGER_PHOTO_ID_5303754572471894514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see, thats a pretty significant increase in speed! Ambient occlusion still kills it though - with 36 samples per intersection for AO:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SZq5qepUs5I/AAAAAAAAAFI/3G-18pIJ8dA/s1600-h/AO.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SZq5qepUs5I/AAAAAAAAAFI/3G-18pIJ8dA/s400/AO.png" alt="" id="BLOGGER_PHOTO_ID_5303755650614211474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The images might look a little more zoomed out than all the previous examples. Well I realised i was rendering stuff outside of the directx window too, so i've fixed that and now the generated texture from the ray tracer goes right to the edge of the window.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5295045050144772857?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5295045050144772857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5295045050144772857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5295045050144772857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5295045050144772857'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/02/multithreading.html' title='Multithreading'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kMRp_EJicWs/SZq4eiC74XI/AAAAAAAAAE4/i5k-rz4kqQQ/s72-c/1thread.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-1926149578906711424</id><published>2009-01-25T00:42:00.003Z</published><updated>2009-01-25T01:52:19.992Z</updated><title type='text'>CUDA, SSE SCOPS3 and Wald, I</title><content type='html'>I've been doing a lot of reading lately trying to decide where my honours project is going other than the base multithreading work. If i can I'd like to do extra. And here are the options:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;CUDA: GPGPU (general purpose graphics processing unit) programs can now be written to take advantage of all cores on graphics devices and NVIDIA has provided the tool to do this: CUDA. basically massively parralell problems (like ray tracing) can be offloaded to the GPU to carry out, yeilding big performance gains over standard intel multi-core CPUs. A ray tracer could therefore be written to take advantage of this power, rendering a pixel at a time, say, on one of the available cores.&lt;/li&gt;&lt;li&gt;SIMD, and in paticular, Intel's SSE insturction set, as it is almost become a standard for many processors (AMD chips are now supporting SSE as well as their own 3DNow!). SIMD or "simmed" stands for Single Instruction, Multiple Data and basically does what it says on the tin. Most modern processors are really good at floating point maths and come with special 128bit wide registers that allow you to carry out the same calculation on four floats (or 8 ints) at once. Which can come in handy in ray tracing&lt;/li&gt;&lt;li&gt;SCOPS3. Scientific Computing On the Playstation 3. A PS3 has 6 very powerful cell proccessors in it. Abertay has 6 Ps3s joined together in a cluster. So of course I want to play with it.&lt;/li&gt;&lt;/ol&gt;Ok so first of all; CUDA. I'm dismissing it. I took a really good look at it today and while its pretty awesome, its caused me a lot of stress. It took me a couple of hours alone to figure out how to get a Cuda project set up in visual studio and then to write a very simple program that just transfers memory to the graphics card, does a really simple calculation on it, and then transfers the memory back to the CPU. I thought it would be nice to port my ray tracer into a cuda project and tell the graphics card which bits i wanted it to take over at, maybe change a few thigns here and there but no, if you want to write a ray tracer for CUDA, it has to be done in C. And since my project is nicely object oriented, this isn't happening. Its too much work for something that would be "just a bit of fun". No, I'll just talk about it in my dissertation instead.&lt;br /&gt;&lt;br /&gt;Something else that might be a decent amount of work is using SIMD to improve performance of my ray tracer, although i want to have a really good bash at it. Why? it's something that has existed for a long time now and I've personally never used it and frankly, I'm a little bit confused as to why we've not been taught about it in Uni. Anyway, given this utility, it is possible to speed up the performance of a ray tracer. I've already tried to convert some of my maths libraries into using SSE operations with negative reults. Its turns out using the operations for one off calculations is actually slower than not. Looking at &lt;a href="http://software.intel.com/en-us/articles/interactive-ray-tracing/"&gt;this&lt;/a&gt; article, the best way to do it is by tracing packets of 4 rays at a time. I found a 311 page PhD thesis by Ingo Wald - the king of interactive ray tracing - on interactive ray tracing. In it, he describes how best to use SIMD in a ray tracer.&lt;br /&gt;&lt;br /&gt;So I've already started stripping down my ray tracer and rebuilding a packet tracer, a architecture that will build &lt;span style="font-style: italic;"&gt;packets of rays &lt;/span&gt;instead of single rays at a time, at the same cost. Hopeully i'll be able to get over double the performance out of my ray tracer if implemented well. This leads me neatly into SCOPS3.&lt;br /&gt;&lt;br /&gt;The Cell proccessor is impressive really only when using SIMD (i guess in the same way as any intel CPU these days). Therefore, in order to make trying to use Abertay's PS3 Super computer worthwhile, i need to be able to efficently program it. Its a distant vison, but a beautiful one. Of course I could just port my current ray tracer onto it as it is and not use SIMD and it'll still run mega fast. Either way I do want to play around with it. I need to email someone to sort this out..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-1926149578906711424?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/1926149578906711424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=1926149578906711424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1926149578906711424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1926149578906711424'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/cuda-sse-scops3-and-wald-i.html' title='CUDA, SSE SCOPS3 and Wald, I'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2985370729508489325</id><published>2009-01-23T15:58:00.004Z</published><updated>2009-01-25T00:40:57.927Z</updated><title type='text'>Honours Project Presentation</title><content type='html'>As a quick "for the record" I'm going to post the slides I used to present my honours project ideas:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SXu1An5XnsI/AAAAAAAAAEw/NKpu73UYneE/s1600-h/presentation.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SXu1An5XnsI/AAAAAAAAAEw/NKpu73UYneE/s400/presentation.jpg" alt="" id="BLOGGER_PHOTO_ID_5295024809218383554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SXnqO5FQYdI/AAAAAAAAAEg/YCKv-ghzKJw/s1600-h/presentation2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SXnqO5FQYdI/AAAAAAAAAEg/YCKv-ghzKJw/s400/presentation2.jpg" alt="" id="BLOGGER_PHOTO_ID_5294520378512662994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SXnqO9uoh0I/AAAAAAAAAEY/erPIRmbuOuI/s1600-h/presentation3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SXnqO9uoh0I/AAAAAAAAAEY/erPIRmbuOuI/s400/presentation3.jpg" alt="" id="BLOGGER_PHOTO_ID_5294520379759953730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnqOkuHhjI/AAAAAAAAAEQ/KpAxSQLwuyQ/s1600-h/presentation4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnqOkuHhjI/AAAAAAAAAEQ/KpAxSQLwuyQ/s400/presentation4.jpg" alt="" id="BLOGGER_PHOTO_ID_5294520373046904370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SXnqOemjAVI/AAAAAAAAAEI/LSMJFjKlJxo/s1600-h/presentation5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SXnqOemjAVI/AAAAAAAAAEI/LSMJFjKlJxo/s400/presentation5.jpg" alt="" id="BLOGGER_PHOTO_ID_5294520371404538194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SXnqOccd7KI/AAAAAAAAAEA/8Nr2fSf9_W0/s1600-h/presentation6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SXnqOccd7KI/AAAAAAAAAEA/8Nr2fSf9_W0/s400/presentation6.jpg" alt="" id="BLOGGER_PHOTO_ID_5294520370825391266" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2985370729508489325?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2985370729508489325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2985370729508489325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2985370729508489325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2985370729508489325'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/honours-project-presentation.html' title='Honours Project Presentation'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/SXu1An5XnsI/AAAAAAAAAEw/NKpu73UYneE/s72-c/presentation.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-1539826324684837023</id><published>2009-01-23T15:30:00.004Z</published><updated>2009-01-23T15:38:58.004Z</updated><title type='text'>Speed increase!</title><content type='html'>This week I've managed to get a decent speed increase from the ray tracer by:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Increasing the efficiency of the ray-sphere intersection algorithm and&lt;/li&gt;&lt;li&gt;Turning all my utility classes (maths libraries and shading record classes etc..) and classes that are accessed a lot into fully public classes. I know its against "the rules" but even with the private version using inlined accessors to get member data, I've noticed about a 5-6% increase from using public classes.&lt;/li&gt;&lt;/ol&gt;So I've gone from this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnjhY7AREI/AAAAAAAAACo/56fITP_H5NQ/s1600-h/slow.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnjhY7AREI/AAAAAAAAACo/56fITP_H5NQ/s400/slow.png" alt="" id="BLOGGER_PHOTO_ID_5294512999715849282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnj4-IeRBI/AAAAAAAAACw/KDCWnEqt09E/s1600-h/fast.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SXnj4-IeRBI/AAAAAAAAACw/KDCWnEqt09E/s400/fast.PNG" alt="" id="BLOGGER_PHOTO_ID_5294513404841444370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;from 6.6 million rays/second to 8.5 is about a 29% increase in speed! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-1539826324684837023?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/1539826324684837023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=1539826324684837023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1539826324684837023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1539826324684837023'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/speed-increase.html' title='Speed increase!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kMRp_EJicWs/SXnjhY7AREI/AAAAAAAAACo/56fITP_H5NQ/s72-c/slow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5894802663398224231</id><published>2009-01-22T17:11:00.007Z</published><updated>2009-01-22T18:30:23.911Z</updated><title type='text'>Boost.Thread</title><content type='html'>I've had a good look around for a way to thread a C++ application and have come accross Boost.Threads by way of recommendation and a good read in &lt;a href="http://www.ddj.com/cpp/184401518"&gt;this&lt;/a&gt; and &lt;a href="http://paulbridger.net/multithreading_tutorial"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The concepts and ideas are simple and easily illustrated. I've written a very simple program that uses the library that just starts a new thread out of a public class member function and prints an increasing number (and the thread ID) until the user requests the thread be interrupted. If an interrupt is requested, the thread kills its self at the next interruption point. When the main thread calls the interrupt, it "joins" the thread - meaning it waits for it to end.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;#include &lt;&gt;&lt;br /&gt;#include &lt;&gt;&lt;br /&gt;#include &lt;&gt;&lt;br /&gt;#include &lt;&gt;&lt;br /&gt;&lt;br /&gt;boost::mutex io_mutex;&lt;br /&gt;&lt;br /&gt;class counter{&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;int id;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;public:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;void count(int ID) {&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;id = ID;&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &lt; 10000000; ++i) {&lt;br /&gt;boost::this_thread::interruption_point();&lt;br /&gt;boost::mutex::scoped_lock lock(io_mutex);&lt;br /&gt;std::cout &lt;&lt; id &lt;&lt; ": " &lt;&lt; i &lt;&lt; std::endl;&lt;br /&gt;}&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;} &lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;};&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;         counter *cP = new counter;&lt;br /&gt;        boost::thread thrd1( boost::bind(&amp;amp;counter::count, cP, 1));&lt;br /&gt;&lt;br /&gt;        system("pause");&lt;br /&gt;        thrd1.interrupt();&lt;br /&gt;        thrd1.join();&lt;br /&gt;        system("pause");&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;&lt;/span&gt;   &lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;boost thread="" hpp=""&gt;&lt;boost thread="" hpp=""&gt;&lt;boost hpp=""&gt;&lt;iostream&gt;&lt;/iostream&gt;&lt;/boost&gt;&lt;/boost&gt;&lt;/boost&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5894802663398224231?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5894802663398224231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5894802663398224231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5894802663398224231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5894802663398224231'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/boostthread.html' title='Boost.Thread'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-6433947074846296528</id><published>2009-01-22T17:07:00.002Z</published><updated>2009-01-22T21:28:12.986Z</updated><title type='text'></title><content type='html'>It has occured to me that i've not yet posted my honours project proposal ducument. Here it is:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }   A.western:link { so-language: zxx }   A.ctl:link { so-language: zxx }  --&gt;  &lt;/style&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;Joe Taylor 0501535&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;Honours Project Proposal&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;CS1004A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Ray Tracing: A Multi-threaded Approach&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;As the games industry grows, computer games are evolving to have increasingly believable universes (Luban, 2008 p. 4). One of the factors of a believable universe is lifelike graphics. Graphical abilities in games have been continually pushed forward every year and will continue to do so in the effort to create these environments.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Since 3D games were introduced to the market, Rasterization has been the dominating algorithm for rendering 3D scenes described in world space for two main reasons: it is efficient with low numbers of polygons and it produces reasonably good looking results.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;The basic operation of rasterisation is to take packets of three vertices within a world space, project these onto a viewing plane and then shade the space described between all three vertices.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Yet problems are starting to occur with this approach.  Ratserizastion does not permit subtle graphical effects such as per pixel shading. Calculating simple lighting effects like shadows and reflections can involve complicated shading programs to be run on specialised hardware. Furthermore, these effects can not be computed accurately and fakes must be used (Slusallek et. al 2005). Photo realistic graphics essentially require higher numbers of polygons too. With rasterization, the processing cost of adding polygons to a scene is linear (Shirley et. Al, p. 2), requiring faster graphics cards.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Ray tracing differs in that it more closely follows real light physics to achieve near perfect results. Light rays are traced backwards from a common point (a camera) through a view plane and into a 3D scene. Calculations based on surface physics determine the colour of the pixel on the view plane. The algorithm can model reflections, refractions, shadows and global illumination effects.  The cost of adding polygons to a scene when using a spatial partitioning system in ray tracing is logarithmic (Shirley et. Al, p2) – extremely high numbers of polygons can be rendered with little cost relative to rasteriztion.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Using this rendering approach, very photo realistic results can be achieved. Indeed, it is the main algorithm used in offline rendering of animated films and conceptual visualisation of products. However, to enable the features that set ray tracing apart from the raster process, the algorithm must generate more rays from rays and become recursive. Due to this nature, it is too computationally expensive to be used in common real time desktop applications right now.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Ray tracing is gaining a lot of interest within the computer games community as a possible successor to rasterization as the main rendering algorithm for games. This is simply because ray tracing, by nature, achieves the effects that rasterization struggles over. More complicated, expensive hardware and complex shading algorithms drive rasterization forward whereas ray tracing simply just needs more power – which comes naturally over time. It is plain to see then, that there is an overlap in time when ray tracing will replace rasterisation in computer games. Some believe it could be as close as a few years.. But where will this extra processing power come from?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Research Question&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;“&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;How is parallelism best achieved in real time ray tracing through the use of multiple core technology?” &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Research Topic and Aims&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Physical limits of fitting more and more transistors onto a single core are pushing the CPU manufacturing industry to shift towards multiple core architectures (Sutter, 2005). This shift allows ray tracing one massive advantage over the raster process; parallelism:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 1.01cm; margin-right: 0.74cm; margin-bottom: 0cm; line-height: 150%;"&gt; “&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;Ray tracing is a prime example of such an “embarrassingly parallel”&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 1.01cm; margin-right: 0.74cm; margin-bottom: 0cm; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;algorithm as every pixel could be rendered independently from all&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 1.01cm; margin-right: 0.74cm; margin-bottom: 0cm; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;others.”&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 1.01cm; margin-right: 0.74cm; margin-bottom: 0cm; line-height: 150%;" align="right"&gt;  &lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;(Friedrich et Al 2006 p48)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;In essence, the theoretical performance of a real time ray tracing engine should scale linearly with the number of cores it is run on. &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Daniel Phol has already shown at IDF (Intel Developer Forum) 2007 that Quake 4 can be ray traced at High Definition resolution (720p) at 90 frames per second using a dual X5365 system with a total of 8 cores, achieving a scaling factor of 7.8x over a single core (Shrout, 2007, p. 2)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;This project will conduct research into the topic of real time ray tracing with specific regard to multi-threading. The main question the project proposes to answer is the how parallelization can be used to achieve high scalability.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;An attempt will be made to analyse just how feasible it is to assume ray tracing will take rasterization's place in computer games. Clearly, each method has its own advantages and disadvantages for use in computer games. By examining these pros and cons while taking into account current and future technological advances, a conclusion will drawn on this popular assumption.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Methodology&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;The research question will be answered through the development of a number of applications. The first will be a single threaded ray tracer that demonstrates the abilities ray tracing has to offer (e.g. reflections, refractions, specular highlights, perfect diffuse specular reflection, accurate lighting and shadows, ambient occlusion, a spatial partitioning structure etc.) with a mind to traditional game technologies such as triangle mesh rendering, dynamic scenes, a moving camera and texture mapping. This application will serve as a benchmark to the other applications.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Those other applications will be copies of the first application, with the same functionalities and abilities as the base render. However, these will make use of different multi-threading optimisations. A few examples of how&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; a ray tracer can be multi-threaded are:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-right: 0.85cm; margin-bottom: 0cm; line-height: 150%;"&gt;  &lt;span style="font-family:Arial,sans-serif;"&gt;A simple “Pixel Cyclic” method,  whereby each core calculates the colour of every Nth pixel on the  view plane.&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-right: 0.85cm; margin-bottom: 0cm; line-height: 150%;"&gt;  &lt;span style="font-family:Arial,sans-serif;"&gt;A Split screen method. With this  technique, each core is assigned an equal amount of screen space to  render per frame.&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-right: 0.85cm; margin-bottom: 0cm; line-height: 150%;"&gt;  &lt;span style="font-family:Arial,sans-serif;"&gt;A tile based approach. Rather than  splitting the screen up into large chunks, much smaller tiles are  used with index numbers loaded into a list. These tiles can be  treated as tasks by each core and rendered individually.&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-left: 1.27cm; margin-right: 0.85cm; text-indent: -0.64cm; margin-bottom: 0cm; line-height: 150%;" align="right"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;(Stone, 2007)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Each application will be able to display the same test scenes for fair comparison.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Evaluation&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;The main area of evaluation, in determining how well each application performs, will be to measure how many frames per second the application can display under test conditions. If the single threaded application is taken as a benchmark, scaling factors can be determined by simply performing the calculation applicationFPS / benchmarkFPS. For example, if one multi-threaded application can render 10 frames per second while the benchmark application achieves only 2, we have a scaling factor of 10/2 = 5x.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;The same calculation can be performed for rays per second. This measurement will give an indication as to how many calculations the application will be executing every second.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;For real time scenarios, especially when discussed in respect to computer games, the standard unit of measurement for measuring the performance of a ray tracer is frames per second, since the frame-rate of the application is key to meeting the real-time condition.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Further conclusions can be made from turning on and off certain graphical effects and evaluating the performance implications of using these effects.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Issues&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Running any demanding multi-threaded application under Windows will introduce a degree of uncertainty to the measurements. Windows will always have other tasks to be performing in the background, taking CPU time away from the application. What's more, Windows handles task assignments to cores itself, which would introduce another overhead in terms of thread management, albeit a small one. An ideal environment would be to run the application on a dedicated system that allows assignment of tasks to specific cores and very low level programming instructions. This way, a programmer could make optimal use of all available resources without having to compromise with other unimportant tasks. That said, uncertainties in measurements would only be minute and perhaps even negligible.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Project Plan&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;The Project will have three main components that can be seen as goals; critical, target and additional. The critical component will consist of everything required to construct a reasonable answer to the research question. Achieving the target goal will enable a more accurate response to the RQ and additional work will go further to compliment the response. These break down as follows:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;Critical&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;A benchmark ray tracer with basic functionalities and visual effects will be constructed and at least two methods for optimising the application using multiple core processors will have been attempted.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;Target&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;More visual effects will be achieved and the functionality will be better suited to computer games with implementation of a model loader, a spatial partitioning system and texture mapping.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;Additional&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal; line-height: 150%;"&gt; &lt;span style="font-family:Arial,sans-serif;"&gt;Further optimisations will be implemented, perhaps including the use of SIMD (Single Instruction, Multiple Data). Attempts made at porting the application to a true multiple core system like a PS3 and/or using the hundreds of processors available on a graphics card to perform ray tracing.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Resource Requirements&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Since the project focuses on multiple core technology, a PC running under windows (XP or greater) with a multiple core architecture is needed - preferably four cores for a reasonable set of results. It would be ideal to use a true multiple core system like the PS3 to test the applications on; to decrease synchronisation overheads and have more control over assignment of tasks to specific cores. This is not critical to the project, however.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Visual Studio 2005 will be required to write the programs and art may have to be acquired from either the internet or acquaintances willing to submit their own work.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 150%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Friedrich, H et. Al (2006) &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;&lt;span style="font-weight: normal;"&gt;Exploring the use of ray tracing for future games. &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-weight: normal;"&gt;Proceedings of the 2006 ACM SIGGRAPH symposium on Videogames, [online] p. 41-50, Available at: &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://portal.acm.org/citation.cfm?doid=1183316.1183323"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://portal.acm.org/citation.cfm?doid=1183316.1183323&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-weight: normal;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Luban, P (2008) &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;The Megatrends of Game Design, Part 1. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Gamasutra [online] Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://www.gamasutra.com/view/feature/3772/the_megatrends_of_game_design_.php"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://www.gamasutra.com/view/feature/3772/the_megatrends_of_game_design_.php&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Shirley, P et. Al (2007) &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;Rethinking Graphics and Gaming Courses Because of Fast Ray Tracing, &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;SIGGRAPH 2007 educators program, [online] 15, Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://portal.acm.org/citation.cfm?doid=1282040.1282056"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://portal.acm.org/citation.cfm?doid=1282040.1282056&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Shrout, R (2007) &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;Rendering Games with Raytracing Will Revolutionize Graphics, &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;PC Perspective [online] Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://www.pcper.com/article.php?aid=455"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://www.pcper.com/article.php?aid=455&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Slusallek, P et. Al (2005) &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;Introduction To Real Time Ray Tracing. &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;SIGGRAPH 2005 Courses, [online] 1, Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://portal.acm.org/citation.cfm?doid=1198555.1198740"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://portal.acm.org/citation.cfm?doid=1198555.1198740&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Stone, J (1999) &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;The Ups and Downs of Multithreaded Ray Tracing and Optimization, &lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Ray Tracing News [online] Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://tog.acm.org/resources/RTNews/html/rtnv12n2.html#art3"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://tog.acm.org/resources/RTNews/html/rtnv12n2.html#art3&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008] &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;Sutter, H (2005),  &lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;i&gt;A Fundamental Turn Toward Concurrency in Software&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;, Dr. Dobb’s Portal, [online] Available at: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a class="western" href="http://www.ddj.com/architect/184405990"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;http://www.ddj.com/architect/184405990&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt; [Last Accessed 8 December 2008]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Bibliography&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: normal;"&gt;Glassner, A (1989) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span style="font-weight: normal;"&gt;An Introduction To Ray Tracing &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;San Francisco, California: Morgan Kaufmann Publishers, Inc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: normal;"&gt;Shirley, P (2000) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span style="font-weight: normal;"&gt;Realistic Ray Tracing. &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Natick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: normal;"&gt;, Massachusetts: A K Peters, Ltd.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: normal;"&gt;Suffern, K (2007) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span style="font-weight: normal;"&gt;Ray Tracing from the Ground Up. &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: normal;"&gt;Wellesley, Massachusetts: A K Peters, Ltd.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-6433947074846296528?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/6433947074846296528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=6433947074846296528' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6433947074846296528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6433947074846296528'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/it-has-occured-to-me-that-ive-not-yet.html' title=''/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-4850210215369209182</id><published>2009-01-20T13:11:00.005Z</published><updated>2009-01-20T19:14:55.884Z</updated><title type='text'>Fixed bugs, added ray counter.. and Ambient Occlusion!</title><content type='html'>So first of all: bug fixed. I was getting some artefacting on objects in the form of tearing when shadowing was enabled. What was happening was the shadow rays were being generated slightly inside the object and then firing out, hitting the object again and shading the outside of it because it thinks its in shadow. Anyway i fixed that.. so now the scenes are rendered niceley and reflections and shadows and diffuse and ambient shading all work in perfect harmony. Heres 400x400 x4 samples per pixel with reflections on both spheres... depth of 5 in reflections i think.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SXYg0EQHL9I/AAAAAAAAACQ/LNXkx7HlWH0/s1600-h/withoutAOsmall.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SXYg0EQHL9I/AAAAAAAAACQ/LNXkx7HlWH0/s400/withoutAOsmall.jpg" alt="" id="BLOGGER_PHOTO_ID_5293454490887204818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pretty right? Wrong. Ambient occlusion makes all the difference. But comes at a cost. basically ambient occlusion is an effect that attempts to look like global illumination. By firing rays randomly in a hemisphere around the normal of an intersection point, we can determine how shaded that object should be, depending on how "occluded" that object is. It does however, come at a price. We can afford a small frame rate drop to get pretty rough looking ambient occlusion:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SXYh6gQ7w8I/AAAAAAAAACY/eCDuCrbZHFc/s1600-h/withAOsmall.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SXYh6gQ7w8I/AAAAAAAAACY/eCDuCrbZHFc/s400/withAOsmall.JPG" alt="" id="BLOGGER_PHOTO_ID_5293455700997686210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But this is wuite rough around the edges. This image was rendered using the same settings as the one above, but by firing 64 rays out into that hemisphere around the intersection points. To get a nice, smooth looking image with beautiful AO, we're looking at 256 samples per pixel and 256 samples for the AO:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/SXYigGV94dI/AAAAAAAAACg/VbRoSTzaoys/s1600-h/withoutAOsmallgood.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SXYigGV94dI/AAAAAAAAACg/VbRoSTzaoys/s400/withoutAOsmallgood.jpg" alt="" id="BLOGGER_PHOTO_ID_5293456346874503634" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-4850210215369209182?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/4850210215369209182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=4850210215369209182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4850210215369209182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/4850210215369209182'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2009/01/fixed-bugs-added-ray-counter-and.html' title='Fixed bugs, added ray counter.. and Ambient Occlusion!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kMRp_EJicWs/SXYg0EQHL9I/AAAAAAAAACQ/LNXkx7HlWH0/s72-c/withoutAOsmall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-8058620579626254662</id><published>2008-12-02T03:20:00.002Z</published><updated>2008-12-02T03:32:48.928Z</updated><title type='text'>better reflections, camera</title><content type='html'>As for the ray tracer, I fixed a reflections problem i kind of didnt know I had.. its a quick fix, so the calculations arent that accurate now but the problem was that I was adding the reflected colour to the pixel colour without any colour over-run protection.. so colours were getting pretty bright and doing wierd things in levels of relection higher than 1.. it does look a little better now though.&lt;br /&gt;&lt;br /&gt;And good news.. I've finally gotten round to writing my own all purpose plug and play camera class for the bezier curves coursework I've started too. Shoved it into the ray tracer and voila: fly around ray traced scenes!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/STSsIWcXsOI/AAAAAAAAACA/jZN50oFuQTY/s1600-h/ref1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/STSsIWcXsOI/AAAAAAAAACA/jZN50oFuQTY/s400/ref1.png" alt="" id="BLOGGER_PHOTO_ID_5275030323021197538" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kMRp_EJicWs/STSsI7N8jWI/AAAAAAAAACI/2KZp69AcMQ0/s1600-h/ref2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://2.bp.blogspot.com/_kMRp_EJicWs/STSsI7N8jWI/AAAAAAAAACI/2KZp69AcMQ0/s400/ref2.png" alt="" id="BLOGGER_PHOTO_ID_5275030332892810594" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-8058620579626254662?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/8058620579626254662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=8058620579626254662' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8058620579626254662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8058620579626254662'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/12/better-reflections-camera.html' title='better reflections, camera'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/STSsIWcXsOI/AAAAAAAAACA/jZN50oFuQTY/s72-c/ref1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-1638492633534821348</id><published>2008-12-02T01:53:00.002Z</published><updated>2008-12-02T03:16:48.940Z</updated><title type='text'></title><content type='html'>I've come accross an interesting "paper" by Brad Grantham, in which he asks leading computer games industry experts "When will ray tracing replace rasterization?". A list of the people he poses the question to:&lt;br /&gt;&lt;br /&gt;Kurt Akeley&lt;br /&gt;Stanford University&lt;br /&gt;NVIDIA Corporation&lt;br /&gt;&lt;br /&gt;David Kirk&lt;br /&gt;NVIDIA Corporation&lt;br /&gt;&lt;br /&gt;Larry Seiler&lt;br /&gt;ATI Research, Inc.&lt;br /&gt;&lt;br /&gt;Philipp Slusallek&lt;br /&gt;Saarland University&lt;br /&gt;&lt;br /&gt;It seems that most have the opinion that ray tracing WILL replace rasterization, whether its sooner or later. the general consensus is in about 5 to ten years, probably through a hybrid approach. Seiler however, says "Ray-tracing will never replace rasterization" and that another algorithm will triumph over both, one that can more accurately model lighting calculations than rasterization, but do it faster than ray tracing.&lt;br /&gt;&lt;br /&gt;Kirk on the other hand says the question is "ill posed", in that the two are different algorithms with different uses. To back up his company though, he poses the question “When will hardware graphics pipelines become sufficiently programmable to efficiently implement ray tracing and other global illumination techniques?” since Nvidea are trying to promote fully programmable GPU architectures, they obviously want to bag ray tracing if it is to start becoming feasible for games.&lt;br /&gt;&lt;br /&gt;Grantham explains exactly my own sentiment: from here on, the road gets easier for ray tracing and more complicated for rasterisation.&lt;br /&gt;&lt;br /&gt;Ray tracing simply needs more power (or cores) whereas rasterization needs more approximations&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-1638492633534821348?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/1638492633534821348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=1638492633534821348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1638492633534821348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/1638492633534821348'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/12/ive-come-accross-interesting-paper-by.html' title=''/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2198301388792831182</id><published>2008-11-19T00:46:00.003Z</published><updated>2008-11-19T01:16:50.836Z</updated><title type='text'>Reflections!</title><content type='html'>Today i sat down and gave my ray tracer the ability to process reflections! I had to create a perfect specular BRDF to calculate the reflection ray direction and the radiance at the reflection point. I've created a reflection material that inherits all of the phong material properties and adds a reflection colour and reflection constant into the equations. so this material now features ambient, diffuse, glossy specular and perfect specular reflections. The material generates rays upto a maximum depth for recurring reflections. its really quite lovely. anyway, some screenshots:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SSNoz9-e10I/AAAAAAAAABw/QD6AZfbu3tY/s1600-h/reflections%21.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SSNoz9-e10I/AAAAAAAAABw/QD6AZfbu3tY/s400/reflections%21.PNG" alt="" id="BLOGGER_PHOTO_ID_5270171230972860226" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SSNoz4yvQHI/AAAAAAAAAB4/N-4uvSXCFIk/s1600-h/reflections%212.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SSNoz4yvQHI/AAAAAAAAAB4/N-4uvSXCFIk/s400/reflections%212.PNG" alt="" id="BLOGGER_PHOTO_ID_5270171229581426802" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2198301388792831182?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2198301388792831182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2198301388792831182' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2198301388792831182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2198301388792831182'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/11/reflections.html' title='Reflections!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/SSNoz9-e10I/AAAAAAAAABw/QD6AZfbu3tY/s72-c/reflections%21.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-3545034513435596960</id><published>2008-11-15T20:26:00.005Z</published><updated>2008-11-15T20:37:53.618Z</updated><title type='text'>Worksheet 4</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);"&gt;Since I havent recieved my feedback, I'll just publish what I wrote anyway:&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;The aim of this project is to show the speed increase in frame production of a real time ray tracing engine when different multi-threading technologies are applied to the ray tracing algorithm. I would like to show which technique (of the ones I assess) provides the greatest speed increase per number of cores and what that increase is.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;It is well known that ray tracing is a computationally expensive algorithm due to its recursive nature. I want to show that the up side to this is that the algorithm can be scaled well over multiple cores using shared memory. As hardware becomes more and more parallelized in a bid to increase overall processing speed while transistors don't allow us to create much smaller processors, the ray tracing algorithm is falling into its place and threatens rasterisation as the leading 3D graphics rendering algorithm.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;Research question&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;How scalable is the performance of real time ray tracing over multiple cores when the use of different multi-threading techniques are applied and which of these techniques offers the best performance?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;Addressing the Question&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;I will write a base line ray tracer: a single threaded ray tracer with functionalities that both show off advantages over traditional rendering methods and ones that are most suited to computer games. This ray tracer will be a benchmark ray tracer. Then I will employ a few different multi threaded approaches separately and analyse how well each approach performs, in relation to the benchmark ray tracer. The performance of each ray tracer will be measured in both rays/sec and frames/sec. The approaches I've thought about taking are as follows:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Treating each ray as a separate task: Storing a list and having processors deal with one ray at the front of the list at a time&lt;/li&gt;&lt;li&gt;Split screen method: Assigning each processor an equal portion of the screen&lt;/li&gt;&lt;li&gt;Tile based method: Splitting the screen into n*n size tiles and having each processor 'consume' the tiles individually&lt;/li&gt;&lt;li&gt;Intelligent tile based rendering: Splitting the screen into different sized tiles and having cores consume different sized tiles, trying to minimise the waiting period cores have to wait for each other to finish a frame before moving onto the next one.&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;If I have time, I would like to implement the ray tracer on cell architecture, using either a PS3 dev kit or the PS3 super computer at abertay. This however, is not important to the project and would only serve as an interesting note and another set of results.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Progress&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;I have read countless papers on ray tracing, mainly to do with parallelising ray tracers and these have given me more insight into the topic and have raised questions I previously did not know about. I've written a significant amount of my base ray tracer and it boasts features such as multiple geometric shape rendering, phong shading with glossy specular highlights, diffuse and ambient shading, a material layer, Jittered super sampling at n^2 samples per pixel, multiple point lights, shadows, a perspective camera and an extendable, efficient architecture. I will be adding texture mapping, reflections and refractions, a model loader, a spatial partitioning system and a model loader to the engine before attempting to multi thread it.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-3545034513435596960?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/3545034513435596960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=3545034513435596960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3545034513435596960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3545034513435596960'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/11/worksheet-4.html' title='Worksheet 4'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-8273930529151873111</id><published>2008-11-06T11:17:00.003Z</published><updated>2008-11-06T11:22:29.685Z</updated><title type='text'>Work Sheet 3. Draft research proposal.</title><content type='html'>&lt;span style="color:#000000;"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;The aim of this project is to show the speed increase in frame production of a real time ray tracing engine when different multi-threading technologies are applied to the ray tracing algorithm. I would like to show which technique (of the ones I assess) provides the greatest speed increase per number of cores and what that increase is.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Motivation&lt;/strong&gt;&lt;br /&gt;Ray tracing offers many advantages over rasterisation as a renderer for 3D geometry scenes. As a global technique, and one that closely models real world physics, incredibly realistic images can be created with relative simplicity when compared to rasterisation and this is the reason it is used as an off line rendering technique for many films and television shows. The algorithm is however, very expensive to compute. Hence its use in the film industry and not the games industry. To quote Daniel Phol in his article on ray tracing and gaming:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color:#000000;"&gt;“Ray tracing has the potential to become the widely used rendering technology on desktop computers. The number of CPU cores is increasing and special purpose ray tracing-hardware-prototypes (&lt;/span&gt;&lt;a href="http://www.saarcor.de/"&gt;&lt;span style="color:#000000;"&gt;http://www.saarcor.de/&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#000000;"&gt;) show impressive results in speed improvement. It is still a long way to playing computer games in graphics like the Lord of the Ring movies, but we are getting closer to it.”&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;Real time ray tracing is gaining interest as a possible successor to the traditional game rendering techniques because home CPUs are heading towards the required power to carry out this very expensive task. Unlike rasterisation, the ray tracing algorithm lends itself to a multi core environment, as “rays are thus fully self-contained, and can easily be traced in parallel.” (Bikker, 2007) With recent advances in multi core home CPU technology, and intels future plans for many-core processors, this shines even more light on ray tracing as a candidate for rendering future games in real time.&lt;br /&gt;Since ray tracing is an algorithm in which speed varies with the number of rays processed, lower screen resolutions take less time to render.. or, less power. “The frame rates in a raytraced title are in fact nearly linearly dependent on the number of pixels being rendered.” (Shrout, 2007) This poses the possibility of having hand held consoles or platforms which operate at low screen resolutions rendering ray tracing in real time using multiple low powered arm or cell processors, bringing hyper realistic graphics to these units.&lt;br /&gt;It is important therefore, to asses how a ray tracer should be multi threaded for optimum performance and to suggest further techniques for greater optimizations.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;This is pretty good. The only thing I am unsure of is the mention of hand-held platforms as your project seems aimed towards PC’s and the threading aspects of ray tracing, as opposed to changes in resolution, and as a result it seems somewhat irrelevant to your motivation.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Research question&lt;br /&gt;&lt;/strong&gt;How scalable is the performance of real time ray tracing over multiple cores when the use of different multi-threading techniques are applied and which of these techniques offers the best performance?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Addressing the Question&lt;/strong&gt;&lt;br /&gt;I will write a ray tracing engine that updates the image displayed on screen every time the ray tracer renders a full frame. The ray tracer will exhibit common properties of a ray tracer and those appropriate to a computer game engine. This will be my base engine. I will then apply a number multi threading techniques to the engine to take advantage of x amount of cores available to it. The results will be measured as a percentage increase in performance over the base engine, where the performance is a measure of how many frames each engine can render per second, when given the exact same scene.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;This seems like it will answer the question well.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resource Requirements&lt;/strong&gt;&lt;br /&gt;A multiple core computer is needed. My home computer has a quad core so tests can be carried out over 1,2,3 and 4 cores. If I have time, I would like to try and port one of my engines to the PS3 super computer at Abertay.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;References and Bibliography&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Daniel Phol. (2006). Ray Tracing and Gaming - Quake 4: Ray Traced Project. [Online] Available at: http://www.pcper.com/article.php?aid=334&amp;amp;type=expert&amp;amp;pid=4. [Last accessed 04 November 2008.]&lt;br /&gt;&lt;br /&gt;Jacco Bikker. (2007). Architecture of a Real-Time Ray-Tracer. [Online] Available at: http://software.intel.com/en-us/articles/architecture-of-a-real-time-ray-tracer-2. [Last accessed 04 November 2008.]&lt;br /&gt;&lt;br /&gt;Ryan Shrout. (2007). Rendering Games with Raytracing Will Revolutionize Graphics. [Online] Available at: http://www.pcper.com/article.phpaid=455&amp;amp;type=expert&amp;amp;pid=3. [Last accessed 04 November 2008.]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-8273930529151873111?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/8273930529151873111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=8273930529151873111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8273930529151873111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/8273930529151873111'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/11/work-sheet-3-draft-research-proposal.html' title='Work Sheet 3. Draft research proposal.'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-3932736599216082221</id><published>2008-11-03T17:00:00.003Z</published><updated>2008-11-03T17:09:00.938Z</updated><title type='text'>Shadows</title><content type='html'>I've implemented shadows! this is a case of using a simplified hit function in each geometric object class. The function just has to determine wether a a shadow ray, fired from the primary ray hit point on an object in the direction towards any light sources, interescts any object on ts way. if it does, that point is in shadow! so only ambient light will affect it. its really that simple. And the results are beautiful. Here is a scene with two spheres, a plane (I've added a 'Plane' geometric object) and two point lights, the green sphere has a glossy specular reflection applied while the red sphere has a matte material. the image uses 4 jittered samples per pixel and is rendered at 400 * 400. Hence the slow frame rate!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kMRp_EJicWs/SQ8vjU0CGPI/AAAAAAAAABo/VDoNx6X7e8E/s1600-h/shadowsdiffusespecamb.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SQ8vjU0CGPI/AAAAAAAAABo/VDoNx6X7e8E/s400/shadowsdiffusespecamb.png" alt="" id="BLOGGER_PHOTO_ID_5264478773348276466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On another note, I tried implementing some vector SSE operations with success, but the actual framerate is slower than without.. which i dont really understand. the optimisations SSE pose must only be effective when carrying out calculations that involve a lot of maths, like matrix multiplications and the like. Oh well, I'll give SSE a bash when I'm actually using matricies in a camera or object transformations or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-3932736599216082221?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/3932736599216082221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=3932736599216082221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3932736599216082221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3932736599216082221'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/11/shadows.html' title='Shadows'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kMRp_EJicWs/SQ8vjU0CGPI/AAAAAAAAABo/VDoNx6X7e8E/s72-c/shadowsdiffusespecamb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-3490570381827607556</id><published>2008-11-02T20:10:00.002Z</published><updated>2008-11-02T20:44:23.764Z</updated><title type='text'>Specular reflection</title><content type='html'>Getting specular reflection working was a case of writing a new bidirectional distributed reflectance function. This glossy specular material is a phong model that takes into account ambience, diffuse shading and specular shading. the specular shading function calculates the intensity of light based on the light source, the camera position, the normal on the surface and a phong exponent, e, to work out the intensity of the light at the point the ray hits.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kMRp_EJicWs/SQ4RGVN1CuI/AAAAAAAAABg/H159D6YyuFo/s1600-h/specular+reflection.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SQ4RGVN1CuI/AAAAAAAAABg/H159D6YyuFo/s400/specular+reflection.PNG" alt="" id="BLOGGER_PHOTO_ID_5264163814914722530" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-3490570381827607556?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/3490570381827607556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=3490570381827607556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3490570381827607556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3490570381827607556'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/11/specular-reflection.html' title='Specular reflection'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kMRp_EJicWs/SQ4RGVN1CuI/AAAAAAAAABg/H159D6YyuFo/s72-c/specular+reflection.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-7985903313907379069</id><published>2008-10-31T13:06:00.003Z</published><updated>2008-10-31T13:34:03.532Z</updated><title type='text'>Lighting!</title><content type='html'>It took quite a bit of work to integrate lighting into the ray tracer. I had to make a BRDF (bidirectional reflectance distribution functions) base class and an inheriting lambertian class (perfect diffuse shading) and a Matte material class, which has both lambertian ambient functions and lambertain diffuse shading functions. This enables us to be able to set the influence both ambient light and direct light has on the material.&lt;br /&gt;&lt;br /&gt;I created a Light base class and two lights: ambient light and a point light. The ambient light is stored as its own pointer in the world class but the point light (or lights) can be added individually to a light list, with light intensity and colour parameters.&lt;br /&gt;&lt;br /&gt;I also had to change a few existing classes to account for these new light sources, materials and shading functions. Here is the result! a point light lighting the two spheres with 4 samples per pixel is displayed below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kMRp_EJicWs/SQsJLM_21AI/AAAAAAAAABY/zVDMvViepSU/s1600-h/pl4spp.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 382px; height: 400px;" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SQsJLM_21AI/AAAAAAAAABY/zVDMvViepSU/s400/pl4spp.PNG" alt="" id="BLOGGER_PHOTO_ID_5263310677584827394" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-7985903313907379069?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/7985903313907379069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=7985903313907379069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/7985903313907379069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/7985903313907379069'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/lighting.html' title='Lighting!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kMRp_EJicWs/SQsJLM_21AI/AAAAAAAAABY/zVDMvViepSU/s72-c/pl4spp.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-6835227514683363708</id><published>2008-10-30T10:50:00.008Z</published><updated>2008-10-30T11:56:31.557Z</updated><title type='text'>Ray Tracer: Started!</title><content type='html'>Last week I started writing my ray tracer. I bought a book by Kevin Suffern called Ray Tracing From the Ground Up. Its amazing! it basically teaches you how to write a ray tracer that is resonably fast, extendable and clean. It goes right through from a basic ray tracer to global illumination and realistic scene production.&lt;br /&gt;&lt;br /&gt;I'll post some screen shots as I go through this. It'll illustrate the developement of the program.&lt;br /&gt;&lt;p&gt;1) Getting the ray tracer set up and running.&lt;/p&gt;&lt;p&gt;This was quite a big task to start off on. It required writing math libraries (ray class, vector class, normal class, point class RGBColour class) and the basic components of a ray tracer: geometric object base class and a sphere class to start off on, a tracer class, a world class, a view plane class and a shade record class. Thats about all thats required of a basic ray tracer.&lt;/p&gt;&lt;p&gt;The world class contains basically everything and describes what is present in the scene and builds it using a build function. The viewplane describes the screen we will be firing rays through and its co-ordinates in world space. The tracer is responsible for firing the rays into the scene and the shade record class stores all the information needed as the ray gathers it to calculate the final pixel colour at the end.&lt;/p&gt;&lt;p&gt;At this stage there was no camera involved, what was rendered was an orthographic projection (rays fired parallel through the view plane with no common origin) This was fine to render a single yellow sphere, however:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5262901339498000402" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 382px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kMRp_EJicWs/SQmU4ly0sBI/AAAAAAAAAA4/fwOBTZdACSY/s400/singlesphere.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2) Multiple Objects&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Thuis was a case of creating a new tracer class that could handle multiple objects and supplying the world class with an object list and adding them individually in the build function:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5262902288529011810" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 382px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kMRp_EJicWs/SQmVv1NctGI/AAAAAAAAABA/FxFr0BrCCxI/s400/multiple+objects.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;3) At this point I discovered that the main function slowing down the program was the windows GDI SetPixel() function, which writies a pixel colour to the back buffer which will be rendered on screen in the next frame. So slow I had to change it. So I gave OpenGL a bash but this turned out to be pretty slow too. What I needed was a was to take a pixel buffer that stored RGB values for every pixel in the RAM and then at the end of each frame, fire that buffer into a texture on the graphics card to be displayed since the graphics card is better at drawing to the screen than the CPU and anyway, the CPU has work to do!. The obstacle was getting data from RAM to graphics memory fast.&lt;/p&gt;&lt;p&gt;I found the solution in D3D dynamic textures. I set up a simple quad to face the camera in directx and a dynamic texture of the required size. Dynamic textures set up a fast pipeline between system memory and graphics memory (perfect!). This texture is mapped onto the quad with anistropic filtering (to keep things looking beautifully accurate) and every frame after the ray tracer has compelted its rendering, I lock the texture, memcopy each horizontal line of the image from the pixel buffer into the texture and then unlock it. I have to copy each line into the graphics card seperately with a pitch between them because this is how the graphcis card stores textures apparently. It took me a long time and a lot of hair pulling to figure this out. But the result is well worth it! The final render time on directx's part is small enough to be considered negligable to my ray tracer.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;4) Perspective Pinhole Camera&lt;/p&gt;&lt;p&gt;This was a rather simple step. until now, the render function was in the world class (because I had no camera). So I set up a camera base class and a subclass called PinHole and created a camera with a world position, a distance from the view plane, a zoom factor, an up vector and UVW vectors. And thus, a fully moveable camera. The camera now has the render function as we would expect and fires rays from one point with different directions, based on the distance from the view plane and which pixel we're working with. Unfortunately I dont have a screen shot to illustrate the difference between orthographic projection and perspective projection. I deleted the orthographic render function. You might be able to imagine, however, that two spheres intersectig when viewed as an orthographic projection, show a straight intersection line. A prespective camera does not.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;5) Sampling.&lt;/p&gt;&lt;p&gt;As with all computer graphics, and due to the finite nature of computers (a pixel has a size and does not denote a point), aliasing occurs in ray tracing too. To get around this we can send x amount of rays through different positions in one pixel, and average the result. This is what I employed. I've gone for a jittered sampling algorithm which is technically more accurate than a fully random algorithm but still random enough to make a good impact on aliasing.&lt;/p&gt;&lt;p&gt;A random sampler could in theory clump all rays together in one part of the pixel. Jittering the samples splits the screen up into n number of sections where n is the number of rays and gives the ray a random position in its own section. this still gives a degree of randomness required to simulate quantum mechanics (i won't get down to that level of detail though :P) yet won't produce artifacts resulting from rays clumping together.&lt;/p&gt;&lt;p&gt;My Jittered class enables me to set up any number of samples in a pixel.&lt;/p&gt;&lt;p&gt;Here is a screen shot of the two spheres above sampled with 4 samples per pixel.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5262912376531143682" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 382px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kMRp_EJicWs/SQme7B8lTAI/AAAAAAAAABI/qVl5JFOgwbQ/s400/4pp.png" border="0" /&gt; &lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;And 256 samples per pixel:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5262912928136850066" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 382px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kMRp_EJicWs/SQmfbI1oapI/AAAAAAAAABQ/F-tX1ozxVYo/s400/256pp.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;6) Frame Counter&lt;/p&gt;&lt;p&gt;You might have noticed in the last screen shots I have a frame counter. I made a timer class that outputs an average frames per second. I just draw this using D3D font.&lt;/p&gt;&lt;p&gt;7) Lighting: next blog!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-6835227514683363708?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/6835227514683363708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=6835227514683363708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6835227514683363708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6835227514683363708'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/ray-tracer-started.html' title='Ray Tracer: Started!'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kMRp_EJicWs/SQmU4ly0sBI/AAAAAAAAAA4/fwOBTZdACSY/s72-c/singlesphere.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-9158607817694654050</id><published>2008-10-15T00:21:00.004+01:00</published><updated>2008-10-15T00:28:48.452+01:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.alphaworks.ibm.com/screenshots/0QY/irt01.html?opendocument&amp;amp;techid=0QY"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 437px; height: 239px;" src="http://www.alphaworks.ibm.com/awss.nsf/screenshots/00844DB7DC56F4A788257340006C9EE9/$FILE/irt02.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://dl.alphaworks.ibm.com/technologies/irt/iRT_summary_06.22.07e.pdf"&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;ABSTRACT&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-9158607817694654050?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/9158607817694654050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=9158607817694654050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/9158607817694654050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/9158607817694654050'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/abstract.html' title=''/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-3301876459363634591</id><published>2008-10-15T00:08:00.003+01:00</published><updated>2008-10-15T00:14:19.319+01:00</updated><title type='text'>Worksheet 2, annotated by Scott Downie</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt; &lt;p style="margin-left: 0.64cm; margin-right: 0.38cm; text-indent: -0.64cm; margin-bottom: 0cm;" align="center" lang="en-US"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;Joe Taylor 0501535&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm; margin-right: 0.38cm; text-indent: -0.64cm; margin-bottom: 0cm;" align="center" lang="en-US"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;Worksheet 2&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm; margin-right: 0.38cm; text-indent: -0.64cm; margin-bottom: 0cm; color: rgb(255, 0, 0);" align="center" lang="en-US"&gt; (Comments by Scott Downie)&lt;/p&gt;&lt;p style="margin-left: 0.64cm; margin-right: 0.38cm; text-indent: -0.64cm; margin-bottom: 0cm; color: rgb(255, 0, 0);" align="center" lang="en-US"&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;Formulate  a research question for your project. Details on the &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;research  question can be found in presentation 1 in the module&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;folder.&lt;/span&gt;&lt;/span&gt;&lt;p style="margin-right: 0.38cm; margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;How scalable is the performance of real time ray tracing engines over multiple core systems?&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;!-- I can’t see any flaws in the question. I feel that the question details the nature of the experiment well. However maybe you could add a line about implementing it in game situations like you have said at the bottom of the page. The only other issue I can see is that maybe the word “scalable” is a bit ambiguous. It does sound pretty well thought out to me though. --&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;I can’t see any flaws in the question. I feel that the question details the nature of the experiment well. However maybe you could add a line about implementing it in game situations like you have said at the bottom of the page. The only other issue I can see is that maybe the word “scalable” is a bit ambiguous. It does sound pretty well thought out to me though.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm; text-indent: -0.64cm;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;When developing a research question you must produce a &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;question that can be answered by performing literature research,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;practical experimentation and critical analysis. The question should also focus the activities of your project.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm;" lang="en-US"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a) What is the focus of your project?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;To find out the advantages of multi-threading a real time ray tracing engine and to show what advantages a multiple core CPU might have over single core cpus and whether ray tracing might be a replacement for rasterisation within the foreseeable future.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 0.64cm;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Another aspect you might like to focus on or at least discuss briefly is the advantages of ray tracing over rasterisation and the shortcomings of the rasterisation process. &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 0.64cm;" lang="en-US"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;b) What information do you need to find out about?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;I will need to find out &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;about research that has been carried out in this field before, issues surrounding the performance of real time ray tracing engines, new developments in technology and future developments with respect to real time ray tracing.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 0.64cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;What about the disadvantages of ray-tracing compared with photon mapping for realism. Mention any implementations of real-time ray tracing for instance the quake wars experiment where it ran on 16 cores (thank you wiki).&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;!-- What about the disadvantages of ray-tracing compared with photon mapping for realism. Mention any implementations of real-time ray tracing for instance the quake wars experiment where it ran on 16 cores (thank you wiki). --&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm;" lang="en-US"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;c) What Experimental work do you need to perform?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.64cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I will need to create a ray tracing engine, perhaps just a simple one, and analyse its performance when run on different multi-core systems (single core, dual core, quad core). I could also look into the possibility of using the OpenRT engine to network two quad core computers together to create a simulated eight core system.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;This again seems pretty robust to me. I like the idea of using an ‘8-core’ system as that would simulate some future technology and allow you to speculate whether it would be possible within the next year or so.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;!-- This again seems pretty robust to me. I like the idea of using an ‘8-core’ system as that would simulate some future technology and allow you to speculate whether it would be possible within the next year or so. --&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;How will the  information that you obtain in 2 allow you to answer&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="en-US"&gt;the research  question?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&lt;span lang="en-US"&gt;By looking at examples of what other people have done in this field, taking results from my own work and looking at current technology in relation to proposed future technology, I should be able to show the relation between the number of cores in a system against performance increases and judge how much power might be needed to run a real time ray traced game in standard gaming resolutions.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="en-US"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Maybe mention that from this you will be able to draw another conclusion whether ray-tracing can replace rasterisation any time soon&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;!-- Maybe mention that from this you will be able to draw another conclusion whether ray-tracing can replace rasterisation any time soon --&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-3301876459363634591?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/3301876459363634591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=3301876459363634591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3301876459363634591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/3301876459363634591'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/worksheet-2-annotated-by-scott-downie.html' title='Worksheet 2, annotated by Scott Downie'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2856896877837812215</id><published>2008-10-14T22:17:00.004+01:00</published><updated>2008-10-15T00:08:10.677+01:00</updated><title type='text'>Long Awaited Update</title><content type='html'>Thanks to Google for blocking my blog for so long. I've been writing my thoughts today in my physical log book after spending a good few days reading up on all i can find on ray tracing. I don't see any point in re-writing it so I'll copy it out here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What is ray tracing?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Used by the film industry&lt;/li&gt;&lt;li&gt;Accurate lighting model&lt;/li&gt;&lt;li&gt;Approximates real world physics&lt;/li&gt;&lt;li&gt;Gives hyper-realistic images&lt;/li&gt;&lt;li&gt;Simpler than rasterisation&lt;/li&gt;&lt;li&gt;more computationally expensive&lt;/li&gt;&lt;li&gt;Can handle reflection, refraction, and shadows by its nature (no shaders needed)&lt;/li&gt;&lt;/ul&gt;Basically ray tracing is a better way to render 3D scenes than rasterisation. It has mainly offline purposes (CG films, computer arts etc.) due to large frame rendering times.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How Does It Work?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;In real world physics, we see things as a result of photons hitting our retinas with different wavelengths (colours) and energies (intensity), the cells in our retinas build up an image, just like pixels on a screen.&lt;br /&gt;&lt;br /&gt;It would be possible to write a program that took light sources and emitted billions of photons into a virtual world, track them and record any that hit a certain defined area along with their new energies and wavelengths after interacting with the environment&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;however, this would be almost infinitely impossible to do, considering the amount of time wasted following photon paths that didn't even affect the final image.&lt;br /&gt;&lt;br /&gt;The way ray tracing gets around this problem is by tracing rays &lt;span style="font-weight: bold;"&gt;backwards &lt;/span&gt;starting at the camera and following them into the scene like so:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img207.imageshack.us/img207/8269/rayss1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 300px;" src="http://img207.imageshack.us/img207/8269/rayss1.jpg" alt="" border="0" /&gt;&lt;/a&gt;Here we see three rays being traced from our camera, straight through pixels and into a virtual 3D scene consisting of a sphere.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ray 1 is projected through the top left pixel and into the scene but does not intersect any objects and will eventually be terminated, leaving the pixels (the pixel it passed through) colour as black.&lt;/li&gt;&lt;li&gt;Ray 2 is sent through another pixel and this one intersects with a sphere. From this point a shadow ray (or shadow feeler - blue) is sent straight to the light source. If the ray does not intersect any objects on its way, this means the sphere is illuminated by the light source and depending on the surface properties of the sphere, the colour of the light and its intensity, a colour value for the pixel can be determined.&lt;/li&gt;&lt;li&gt;Ray 3 has hit the ground and its shadow feeler has reported that a sphere stands between the ground intersection point and the light source so the ground is in the spheres shadow and does not receive any light. However, the primary ray has detected that the ground has both transparent and reflective properties and so has spawned a reflection ray (red) and a refraction ray (green)&lt;/li&gt;&lt;/ul&gt;It is easy to see how ray tracing is a recursive algorithm that is surprisingly elegant and simple but can result in a lot of computations.&lt;br /&gt;&lt;br /&gt;For a scene to be rendered at 720 x 1024 pixels (720p), 737280 primary rays must be sent out. add to this extra rays per pixel for anti-aliasing, shadow rays, recursive reflective and refractive rays, more lights and perform this at real time frame rates (over 30fps), you get a hell of a lot of rays to process. Indeed, it has been suggested that to play a real time ray traced game at 720p, an engine would need to follow over a billion rays per second and thats with optimisations!&lt;br /&gt;&lt;br /&gt;SO: Optimisations are what I'm interested in. What optimisations could you have for a real time ray tracing engine? Well heres a list of a few important ones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multi threading&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Its easy to see that ray tracing is scalable over multiple cores, since each ray is treated as an individual entity and reads the scene information rather than writing to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Better Anti-Aliasing Techniques&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Aliasing is solved by firing x amount of rays through one pixel and taking the average colour value. However, firing for example, 16 rays through every pixel on the image plane is going to slow the engine down 16 times. How can this be solved?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spatial Partitioning&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Testing for multiple object intersections within a scene can also slow down render times. If we has 2 million triangles in a scene each ray would have to make intersection tests with every one of these triangles, which is very costly. Can spatial partitioning structures be used to speed things up?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SSE Instruction sets&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Since ray tracing involves a lot of vector maths, wouldn't it be useful to use SIMD to speed things up? Single Instruction, Multiple Data allows multiple objects to be operated on in one instruction, greatly increasing the speed of certain operations. Better still, couldn't multiple rays be traced at once using these registers?&lt;br /&gt;&lt;br /&gt;Which of these topics do I want to study for my dissertation? Well, I haven't really decided yet. I'm leaning towards multi threading as this also interests me. I think Anti-aliasing techniques are interesting but a dissertation on this might be too simple. Spatial partitioning doesn't really excite me as much as the other topics and I haven't read into SSE or had any experience with them yet so can't really judge that technique. It is interesting though.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Current State of the Art.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Ray tracing has until recently been used as an offline rendering technique for films and computer arts. However, with increases in home CPU power, ray tracing has been gathering attention as a possible successor to rasterisation. While rasterisation is a fast method for rendering 3D scenes, it has a lot of cons. Mainly:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It requires expensive, dedicated hardware&lt;/li&gt;&lt;li&gt;Shaders have to be used on separate parts of a scene to approximate lighting models&lt;/li&gt;&lt;li&gt;Complex APIs have to be used&lt;/li&gt;&lt;li&gt;It can't handle reflections and refractions well&lt;/li&gt;&lt;li&gt;It doesn't easily give a physically accurate representation of a 3D scene.&lt;/li&gt;&lt;/ul&gt;While it would be naive to say that ray tracing can solve all of rasterisations problems, it can handle them better and more accurately with very little persuasion. It just takes a lot of grunt. Hopefully soon, "grunt" won't be a problem. There are certain things ray tracing &lt;span style="font-weight: bold;"&gt;cant &lt;/span&gt;do due to its 'backwards' nature. Notably caustics and diffuse inter-reflections.&lt;br /&gt;&lt;br /&gt;But it provides a better physical model for simulating light. In effect it is just a lighting model that works in the same way the physical universe does it and so can produce better results and hyper-realism.&lt;br /&gt;&lt;br /&gt;So what is the future of ray tracing? It is hard to say. Intel is pushing for more raw power increases, making ray tracing possible on just the CPU, effectively phasing out graphics cards. Companies like ATI and Nvidea, who own the graphics card hardware market may be looking into using RPUs (Ray Processing Units) instead of traditional GPUs. Indeed, asking a CPU to render what a graphics card is capable of doing at over 30fps with dedicated hardware will yield results of only a couple of frames per second. What then, if we had dedicated hardware for processing rays? Saarland University have developed a prototype programmable RPU that operates at only 66mhz with a very low memory bandwidth (350mb/s) that is capable of achieving the same ray tracing performance as a 2.6Ghz Pentium 4. Could this be the future?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://graphics.cs.uni-sb.de/%7Ewoop/rpu/rpu.html"&gt;Reference&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Personally I think ray tracing has a real time future that is going to take off soon. Whether it will be on dedicated hardware or not, I don't know. Since I don't have access to dedicated hardware I'm stuck with using the CPU and since Intels plans are for many-core CPUs, studying scalability of real time ray tracing engines seems like a sensible option.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2856896877837812215?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2856896877837812215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2856896877837812215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2856896877837812215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2856896877837812215'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/long-awaited-update.html' title='Long Awaited Update'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2698004443920574238</id><published>2008-10-06T15:06:00.001+01:00</published><updated>2008-10-07T16:28:19.653+01:00</updated><title type='text'>Why do I want to do something to do with ray tracing anyway?</title><content type='html'>Well, I've always had a thing with maths (and physics because we all know physics is really just a sub-set of maths).. A love/hate relationship if you will.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;I always get a great satisfaction out of writing a program with elegant algorithms involving elegant maths that just.. work, to great effect. What appeals to me about ray tracing is its beautiful simplicity.&lt;br /&gt;&lt;br /&gt;Human nature is all about looking for ways to make really complicated things simple. Look on the news! The large hadron collider is a massive, incredibly expensive experiment that deals with the smallest stuff imaginable. And why? Its aim is to find a proof of string theory, a theory or one algorithm that can describe the whole universe. Einstein spent most of his years after general relativity searching for this unified solution.&lt;br /&gt;&lt;br /&gt;In a world where processing power in the home computer is increasing at what i think is still the Moores Law rate, and while traditional "bodge job" rendering techniques, designed to get around a lack of computational power are getting waaaay more complicated by the year (shaders, graphics APIs like opengl directx, physical graphics cards with multiple GPUs, dedicated memory and ever changing architecture), its getting towards the day where we need to say "wait! Forget rasterisation, lets just do this how our own universe does it! STAND BACK, I'M GOING TO TRY PHYSICS"&lt;br /&gt;&lt;br /&gt;I believe a change for the better, more accurate rendering technique known as ray tracing is going to happen.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2698004443920574238?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2698004443920574238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2698004443920574238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2698004443920574238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2698004443920574238'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/why-do-i-want-to-do-something-to-do.html' title='Why do I want to do something to do with ray tracing anyway?'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5639630102698935262</id><published>2008-10-06T14:41:00.000+01:00</published><updated>2008-10-06T14:44:03.945+01:00</updated><title type='text'>First Hurdle down?</title><content type='html'>Dr Ozveren has taken a look at the first draft proposals for our class and hasn't said anything against any of them yet.. I'v been assigned Louis Natanson as my supervisor. I'm pleased, Louis is great :)&lt;br /&gt;&lt;br /&gt;So I'll be meeting with Louis hopefully sometime this week, having a discussion with him about my project and then sending off a more detailed work sheet with a proposal question to Dr Oz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5639630102698935262?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5639630102698935262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5639630102698935262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5639630102698935262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5639630102698935262'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/first-hurdle-down.html' title='First Hurdle down?'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-5285527515073801659</id><published>2008-10-06T14:40:00.000+01:00</published><updated>2008-10-06T14:41:00.304+01:00</updated><title type='text'>Scott's 2p</title><content type='html'>"Scott Says : You might want to look at it from a more games orientated angle. Maybe comparing ray tracing to current techniques used and seeing if it can be used in a game situation with current technology, rather than having a solely ray traced scene that just looks as good as today’s top graphics."&lt;br /&gt;&lt;br /&gt;Scott Hampson&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks Scott!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-5285527515073801659?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/5285527515073801659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=5285527515073801659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5285527515073801659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/5285527515073801659'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/10/scotts-2p.html' title='Scott&apos;s 2p'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-6133614264722458443</id><published>2008-09-29T02:36:00.000+01:00</published><updated>2008-09-29T02:49:37.668+01:00</updated><title type='text'>Honours project proposal: first draft</title><content type='html'>We've been given the task of answering a few simple questions on our initial idea for the project. We have to send it to the next person on our class register for it to be evaluated by them and then sent back to a) us and b) the lecturer. So here is what I sent off:&lt;br /&gt;&lt;br /&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.4  (Win32)"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt; &lt;p style="margin-left: 0.95cm; text-indent: -0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none; font-weight: bold;" align="center" lang="en-GB"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;Joe Taylor 0501535 CGT Honours Project draft proposal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; text-indent: -0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; text-indent: -0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 153, 204);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;State the topic of interest that you may wish to take forward into a project.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Ray tracing as a next gen. Rendering approach&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; text-indent: -0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 153, 204);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Indicate the issues surrounding this topic that you may wish investigate.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;With the increase in the processing power of computers (with Intels plans for many core CPUs) and the increase in complexity of traditional rendering methods, it makes sense that one day the switch will be made to begin rendering computer games using the more physically accurate and simple but  computationally expensive method of ray tracing. I would like to investigate how close we are to the 'jump', if at all there is a 'jump' and no hybrid, from rasterisation to ray tracing. In my opinion, ray tracing games is about to take off in a big way.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; text-indent: -0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 153, 204);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Outline your initial ideas about how you would carry out the practical aspects of the project. i.e. what do you envisage yourself actually doing for the project.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.95cm; margin-top: 0.21cm; margin-bottom: 0cm; font-style: normal; line-height: 80%; widows: 0; orphans: 0; text-decoration: none;" align="left" lang="en-GB"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Since ray tracing treats every pixel on a display as an individual ray, this makes it easy to render a scene using multiple threads to build each frame perhaps using split screen methods or other methods. I'd like to write a real time ray tracer that takes advantage of multi-core technology to render 3D scenes with maximum speed. To see how close to 'real time' I can manage, and judge what kind of power a computer might need to render (using ray tracing techniques) a scene that would look just as good as todays top graphics in computer games.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;/p&gt;&lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt; &lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Some Links worth looking at:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://www.youtube.com/watch?v=oLte5f34ya8"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;http://www.youtube.com/watch?v=oLte5f34ya8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://www.youtube.com/watch?v=zKqZKXwop5E"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;http://www.youtube.com/watch?v=zKqZKXwop5E&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://www.youtube.com/watch?v=blfxI1cVOzU"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;http://www.youtube.com/watch?v=blfxI1cVOzU&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://www.realstorm.com/"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;http://www.realstorm.com/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-left: 0.9cm; margin-bottom: 0cm;"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Blog&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;	&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 1.01cm; text-indent: -0.05cm; margin-bottom: 0cm;"&gt; &lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;I have also set up a web log for my honours project. This can be located at &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://yeraveragejoe.blogspot.com/"&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;http://yeraveragejoe.blogspot.com&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-6133614264722458443?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/6133614264722458443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=6133614264722458443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6133614264722458443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/6133614264722458443'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/09/honours-project-proposal-first-draft.html' title='Honours project proposal: first draft'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3685042506497839630.post-2413696268309925720</id><published>2008-09-29T02:28:00.000+01:00</published><updated>2008-10-07T16:29:09.211+01:00</updated><title type='text'>Hello World</title><content type='html'>Well, This is my first public web log.. one that isn't part of a website whos main function is social networking. Hopefully it will include regular updates as I'm pretty sure my degree depends (at least on some level) on it.&lt;br /&gt;&lt;br /&gt;I'm Joe Taylor. A fourth year student at The University of Abertay, Dundee studying Computer Games Technology. This year is my honours year and this blogs main function is to serve as a log of my honours project to my lecturer, Dr. Ozveren.&lt;br /&gt;&lt;br /&gt;I'm not sure what else to put in this introduction... Oh, my student number is 0501535. That might help. Anyway, on with the first real post...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3685042506497839630-2413696268309925720?l=yeraveragejoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yeraveragejoe.blogspot.com/feeds/2413696268309925720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3685042506497839630&amp;postID=2413696268309925720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2413696268309925720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3685042506497839630/posts/default/2413696268309925720'/><link rel='alternate' type='text/html' href='http://yeraveragejoe.blogspot.com/2008/09/hello-world.html' title='Hello World'/><author><name>yer_averagejoe</name><uri>http://www.blogger.com/profile/03527732731938016294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_kMRp_EJicWs/SXnmuCSaW-I/AAAAAAAAADA/qKq_8SBLC0w/S220/2370293318a5006960970o.jpg'/></author><thr:total>0</thr:total></entry></feed>
