<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Last Ray of Hope &#187; Code</title>
	<atom:link href="http://www.lastrayofhope.com/category/programming/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lastrayofhope.com</link>
	<description>Home of Kaluriel Hargrove</description>
	<lastBuildDate>Thu, 02 Feb 2012 00:21:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SprintfCat</title>
		<link>http://www.lastrayofhope.com/2011/11/02/sprintfcat/</link>
		<comments>http://www.lastrayofhope.com/2011/11/02/sprintfcat/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 15:17:23 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[safe]]></category>
		<category><![CDATA[sprintf]]></category>
		<category><![CDATA[stdlib]]></category>
		<category><![CDATA[strlen]]></category>
		<category><![CDATA[vsprintf]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3975</guid>
		<description><![CDATA[On the train to Cardiff yesterday, I was creating a fixed function shader generator for the Athena engine. I kept using strcat() with if statements, and in a lot of places I kept using sprintf() then copying that in with strcat(). So I decided to make SprintfCat(), all the wonderful joy of sprintf, with the [...]]]></description>
			<content:encoded><![CDATA[<p>On the train to Cardiff yesterday, I was creating a fixed function shader generator for the Athena engine. I kept using strcat() with if statements, and in a lot of places I kept using sprintf() then copying that in with strcat().</p>
<p>So I decided to make SprintfCat(), all the wonderful joy of sprintf, with the ability to concatenate with a already existant string like strcat.</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">size_t</span> ath<span class="sy4">::</span><span class="me2">SprintfCat</span><span class="br0">&#40;</span> <span class="kw4">char</span> <span class="sy2">*</span> inoutBuffer, <span class="kw4">const</span> <span class="kw4">size_t</span> inBufferSize, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">*</span> inFormat, ... <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">const</span> <span class="kw4">size_t</span> offset <span class="sy1">=</span> StrLen<span class="br0">&#40;</span> inoutBuffer <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">size_t</span> ret <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
	<span class="kw4">va_list</span> arg<span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw3">va_start</span><span class="br0">&#40;</span> arg, inFormat <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#123;</span>
		ret <span class="sy1">=</span> VSprintf<span class="br0">&#40;</span> inoutBuffer <span class="sy2">+</span> offset, inBufferSize <span class="sy2">-</span> offset, inFormat, arg <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
	<span class="kw3">va_end</span><span class="br0">&#40;</span> arg <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">return</span> offset <span class="sy2">+</span> ret<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>I had already created my own wrappers around strlen() and vsprintf(), the reason being the fault of Microsoft. With their implementation of the standard library, they decided to deprecate non-safe versions complain at you until you either used their own _s variants, or defined a certain preprocessor.</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">size_t</span> ath<span class="sy4">::</span><span class="me2">VSprintf</span><span class="br0">&#40;</span> <span class="kw4">char</span> <span class="sy2">*</span> outBuffer, <span class="kw4">const</span> <span class="kw4">size_t</span> inBufferSize, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">*</span> inFormat, <span class="kw4">va_list</span> inArgs <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="co2">#ifndef ATH_PLATFORM_WINDOWS</span>
	<span class="kw1">return</span> vsnprintf<span class="br0">&#40;</span> outBuffer, inBufferSize, inFormat, inArgs <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="co2">#else</span>
	<span class="kw1">return</span> vsprintf_s<span class="br0">&#40;</span> outBuffer, inBufferSize, inFormat, inArgs <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="co2">#endif</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">size_t</span> ath<span class="sy4">::</span><span class="me2">StrLen</span><span class="br0">&#40;</span> <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">*</span> inString <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">return</span> <span class="kw3">strlen</span><span class="br0">&#40;</span> inString <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>While I do prefer to have safe versions, their _s variants are not present in the standard and so it makes the code not portable.</p>
<p>I'm still not quite sure about my naming convention for a variable that is an input and an output. While I do like the <strong>in</strong> or <strong>out</strong> prefix, I don't think <strong>inout</strong> looks right, being slightly too long. I wasn't a fan of <strong>io</strong> either. I have however grown to like the truncation of Athena namespace to ath.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/11/02/sprintfcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL Shader Debugging</title>
		<link>http://www.lastrayofhope.com/2011/10/28/opengl-shader-debugging/</link>
		<comments>http://www.lastrayofhope.com/2011/10/28/opengl-shader-debugging/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 21:17:50 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[OpenGL ES]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3969</guid>
		<description><![CDATA[One thing that always annoys me with using glGetShaderInfoLog(), is that when compiling OpenGL shaders multiple sources can be used. Because of this, the line numbers get shifted, and trying to find line 123 where a syntax error exists is a length process. So I made a function that will take the sources list and [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that always annoys me with using glGetShaderInfoLog(), is that when compiling OpenGL shaders multiple sources can be used. Because of this, the line numbers get shifted, and trying to find line 123 where a syntax error exists is a length process.</p>
<p>So I made a function that will take the sources list and output the lines with line numbers.</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">void</span> OutputWithLineNumbers<span class="br0">&#40;</span> <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">**</span> inSources, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">int</span> inCount <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">bool</span> unendedLineNo <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span>
	<span class="kw4">int</span> lineNumber <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp;
	<span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> inCount<span class="sy4">;</span> <span class="sy2">++</span>i <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">*</span> cur <span class="sy1">=</span> inSources<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy4">;</span>
		<span class="kw4">const</span> <span class="kw4">char</span> <span class="sy2">*</span> next <span class="sy1">=</span> <span class="kw2">NULL</span><span class="sy4">;</span>
&nbsp;
		<span class="kw1">do</span>
		<span class="br0">&#123;</span>
			<span class="co1">//</span>
			<span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy3">!</span>unendedLineNo <span class="br0">&#41;</span>
			<span class="br0">&#123;</span>
				<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;%04d: &quot;</span>, lineNumber <span class="br0">&#41;</span><span class="sy4">;</span>
			<span class="br0">&#125;</span>
&nbsp;
			<span class="co1">//</span>
			next <span class="sy1">=</span> <span class="kw3">strchr</span><span class="br0">&#40;</span> cur, <span class="st0">'<span class="es1">\r</span>'</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			<span class="co1">//</span>
			<span class="kw1">if</span><span class="br0">&#40;</span> next <span class="br0">&#41;</span>
			<span class="br0">&#123;</span>
				<span class="kw4">size_t</span> len <span class="sy1">=</span> <span class="br0">&#40;</span> next <span class="sy2">-</span> cur <span class="br0">&#41;</span><span class="sy4">;</span>
				<span class="kw4">char</span> <span class="sy2">*</span> lineText <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy2">*</span><span class="br0">&#41;</span>alloca<span class="br0">&#40;</span> len <span class="br0">&#41;</span><span class="sy4">;</span>
				<span class="kw3">memcpy</span><span class="br0">&#40;</span> lineText, cur, len <span class="br0">&#41;</span><span class="sy4">;</span>
				lineText<span class="br0">&#91;</span>len<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
				<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;%s<span class="es1">\n</span>&quot;</span>, lineText <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
				unendedLineNo <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span>
				<span class="sy2">++</span>lineNumber<span class="sy4">;</span>
			<span class="br0">&#125;</span>
			<span class="kw1">else</span>
			<span class="br0">&#123;</span>
				<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;%s&quot;</span>, cur <span class="br0">&#41;</span><span class="sy4">;</span>
				unendedLineNo <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
			<span class="br0">&#125;</span>
&nbsp;
			<span class="co1">//</span>
			cur <span class="sy1">=</span> next <span class="sy2">+</span> <span class="nu0">2</span><span class="sy4">;</span>
		<span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span> next <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">if</span><span class="br0">&#40;</span> unendedLineNo <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>This code requires the source files to have a carriage return as well as a new line character.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/10/28/opengl-shader-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCode4 Build Rules for iOS</title>
		<link>http://www.lastrayofhope.com/2011/08/26/xcode4-build-rules-for-ios/</link>
		<comments>http://www.lastrayofhope.com/2011/08/26/xcode4-build-rules-for-ios/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 21:30:20 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3949</guid>
		<description><![CDATA[For a while now I have been manually compiling files since my asset conversion pipeline tool is not quite finished yet. So I took at look into Build Rules in XCode. My main trouble within using them was finding the environment variables, even googling them doesn't turn up much information. I think the output files [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/08/Screen-shot-2011-08-26-at-22.21.021.png"><img class="alignleft size-thumbnail wp-image-3999" title="Build Script" src="http://www.lastrayofhope.com/wp-content/uploads/2011/08/Screen-shot-2011-08-26-at-22.21.021-150x150.png" alt="" width="150" height="150" /></a> For a while now I have been manually compiling files since my asset conversion pipeline tool is not quite finished yet.</p>
<p>So I took at look into Build Rules in XCode. My main trouble within using them was finding the environment variables, even googling them doesn't turn up much information.</p>
<p>I think the output files act as an error check, if the output file fails to appear then the tool failed.</p>
<p>One other thing I had an issue with was the source files list. I tried comma and semi colon delimiters, and spaces, but the TGA file kept giving the warning on Tree1.tga. I have yet t0 find the a way to do this without multiple entries. And I'm thinking a separate tool for building files may be easier.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/08/26/xcode4-build-rules-for-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Orientation</title>
		<link>http://www.lastrayofhope.com/2011/08/25/iphone-orientation/</link>
		<comments>http://www.lastrayofhope.com/2011/08/25/iphone-orientation/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 19:08:42 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3927</guid>
		<description><![CDATA[Earlier I wanted to test my engine with autorotation for when an iOS device's orientation changes. I spent a fair bit of time trying to work out why, sure that I had written some code somewhere to stop it from triggering. After creating another app and still haven't the same problem, I was about to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/08/IMG_0002.png"><img class="alignleft size-thumbnail wp-image-3928" title="Screen Lock taunting me" src="http://www.lastrayofhope.com/wp-content/uploads/2011/08/IMG_0002-150x150.png" alt="" width="150" height="150" /></a>Earlier I wanted to test my engine with autorotation for when an iOS device's orientation changes. I spent a fair bit of time trying to work out why, sure that I had written some code somewhere to stop it from triggering.</p>
<p>After creating another app and still haven't the same problem, I was about to report it as a bug when the answer dawned on me, I had the orientation lock on.</p>
<p>It would be nice if you could do it on an application basis as well as a global one, since I only turn it on because photos get orientated incorrectly.</p>
<p>The contents of my "Useless" app folder: Stocks, Weather, Contacts, Calculator, Voice Memos, Compass, Reminders. If only you could turn off the default apps as well.</p>
<p>On another note, I've added a page next to website for iOS specific links.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/08/25/iphone-orientation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS: Using Separate Shaders</title>
		<link>http://www.lastrayofhope.com/2011/08/18/ios-using-separate-shaders/</link>
		<comments>http://www.lastrayofhope.com/2011/08/18/ios-using-separate-shaders/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 20:22:37 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[GL_EXT_separate_shader_objects]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[OpenGLES]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3916</guid>
		<description><![CDATA[One of the lovely additions to iOS5 is there is now the ability to use separate vertex and fragment shaders (GL_EXT_separate_shader_objects). The first step in using separate shaders is to create an object to bind them onto that will be our overall shader program, known as a pipeline object. This pipeline object acts similar to vertex array [...]]]></description>
			<content:encoded><![CDATA[<p>One of the lovely additions to iOS5 is there is now the ability to use separate vertex and fragment shaders (GL_EXT_separate_shader_objects).</p>
<p>The first step in using separate shaders is to create an object to bind them onto that will be our overall shader program, known as a pipeline object.</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;">GLuint gProgramPipeline <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
GLuint gVertexProgram <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
GLuint gFragmentProgram <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	CreatePipeline<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
	CreateShaders<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	BindShadersToPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">do</span>
	<span class="br0">&#123;</span>
		<span class="co1">//</span>
		UpdateUniforms<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="co1">//</span>
		BindPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
		DrawSomething<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
		UnbindPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> <span class="kw2">true</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DestroyShaders<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
	DestroyPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> CreatePipeline<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glGenProgramPipelinesEXT<span class="br0">&#40;</span> 1, <span class="sy3">&amp;</span>gProgramPipeline <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> DestroyPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> gProgramPipeline <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		glDeleteProgramPipelinesEXT<span class="br0">&#40;</span> 1, <span class="sy3">&amp;</span>gProgramPipeline <span class="br0">&#41;</span><span class="sy4">;</span>
		gProgramPipeline <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>This pipeline object acts similar to vertex array object (VAO) only with shader programs, however instead of using glUseProgram, a separate function glUseProgramStagesEXT() must be used to bind the shader program to the pipeline, specifying the role of the shader program.</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> BindShadersToPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glUseProgramStagesEXT<span class="br0">&#40;</span> gProgramPipeline, GL_VERTEX_SHADER_BIT_EXT, gVertexProgram <span class="br0">&#41;</span><span class="sy4">;</span>
	glUseProgramStagesEXT<span class="br0">&#40;</span> gProgramPipeline, GL_FRAGMENT_SHADER_BIT_EXT, gFragmentProgram <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Updating uniforms is slightly different as well.</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> UpdateUniforms<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	GLint uniformLoc <span class="sy1">=</span> glGetUniformLocation<span class="br0">&#40;</span> gVertexProgram, <span class="st0">&quot;myVertUniform&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	glProgramUniform1fEXT<span class="br0">&#40;</span> gVertexProgram,
			       uniformLoc,
			       1.248f <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	uniformLoc <span class="sy1">=</span> glGetUniformLocation<span class="br0">&#40;</span> gFragmentProgram, <span class="st0">&quot;myFragUniform&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	glProgramUniform1fEXT<span class="br0">&#40;</span> gFragmentProgram,
			       uniformLoc,
			       6.1218f <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	uniformLoc <span class="sy1">=</span> glGetUniformLocation<span class="br0">&#40;</span> gVertexProgram, <span class="st0">&quot;myCommonUniform&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">float</span> commonValue <span class="sy1">=</span> <span class="nu17">2.0f</span><span class="sy4">;</span>
&nbsp;
	glProgramUniform1fEXT<span class="br0">&#40;</span> gVertexProgram,
			       uniformLoc,
			       commonValue <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	uniformLoc <span class="sy1">=</span> glGetUniformLocation<span class="br0">&#40;</span> gFragmentProgram, <span class="st0">&quot;myCommonUniform&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	glProgramUniform1fEXT<span class="br0">&#40;</span> gVertexProgram,
			       uniformLoc,
			       commonValue <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Finally to use the program pipeline, we just need to bind it.</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> BindPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glBindProgramPipelineEXT<span class="br0">&#40;</span> gProgramPipeline <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> UnbindPipeline<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glBindProgramPipelineEXT<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>fef</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/08/18/ios-using-separate-shaders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LONG_MAX on 64bit OSX</title>
		<link>http://www.lastrayofhope.com/2011/08/15/long_max-on-64bit-osx/</link>
		<comments>http://www.lastrayofhope.com/2011/08/15/long_max-on-64bit-osx/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 23:53:44 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[64bit]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[long]]></category>
		<category><![CDATA[OSX]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3877</guid>
		<description><![CDATA[I came by an annoying problem when I was adding some asserts to my FBX to Athena tool. I was basically adding a check to my vertex buffer size to make sure it was not larger than a GLsizeiptr (defined as a long in iOS5 SDK). I've always assumed chars to be 8, shorts to [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3878" class="wp-caption alignleft" style="width: 160px"><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/08/hartnell-sensorites.jpg"><img class="size-thumbnail wp-image-3878" title="Some Sensorites have been known to be dicks" src="http://www.lastrayofhope.com/wp-content/uploads/2011/08/hartnell-sensorites-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Some Sensorites have been known to be dicks</p></div>
<p>I came by an annoying problem when I was adding some asserts to my FBX to Athena tool. I was basically adding a check to my vertex buffer size to make sure it was not larger than a GLsizeiptr (defined as a long in iOS5 SDK).</p>
<p>I've always assumed chars to be 8, shorts to be 16, longs to be 32 and ints to be whatever the system wants it to be (most likely the register size for an atomic copy). However, my tool is setup using 64bit OSX project, and the long comes out as 8 bytes, so the value given by LONG_MAX is huge, while the int remains at 4 bytes.</p>
<p>I wouldn't have even noticed that my assert would have never been hit if it had not been for the warning the IDE gave after writing the statement, "Comparison is always true due to limited range of data type".</p>
<p>In the end I just replaced LONG_MAX with INT32_MAX (stdint.h). And after a bit of googling, <a href="http://en.wikipedia.org/wiki/Integer_(computer_science)" target="_blank">I found this on wikipedia</a>.</p>
<blockquote><p>The sizes of short, int, and long in C/C++ are dependent upon the implementation of the language:</p>
<ul>
<li>On older, 16-bit operating systems, <em>int</em> was 16-bit and <em>long</em> was 32-bit.</li>
<li>On 32-bit Unix, DOS, and Windows, <em>int</em> and <em>long</em> are 32-bits, while <em>long long</em> is 64-bits. This is also true for 64-bit processors running 32-bit programs.</li>
<li><strong>On 64-bit Unix, <em>int</em> is 32-bits, while <em>long</em> and <em>long long</em> are 64-bits.</strong></li>
</ul>
</blockquote>
<p>While this does sound kinda familiar to me, I do not think I've ever had a situation where it has appeared to me until now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/08/15/long_max-on-64bit-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Vertex Array Objects</title>
		<link>http://www.lastrayofhope.com/2011/07/30/using-vertex-array-objects/</link>
		<comments>http://www.lastrayofhope.com/2011/07/30/using-vertex-array-objects/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 12:10:32 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[GL_OES_vertex_array_object]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[OpenGL ES]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3843</guid>
		<description><![CDATA[With my recent post about what iOS devices supported what extensions, I noticed a lot of people got to my website trying to work out how to use Vertex Array Objects (VAO) with the GL_OES_vertex_array_object extension. They're easy to use so I thought I would write up a quick how-to use them. There is a limitation with [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3846" class="wp-caption alignleft" style="width: 160px"><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Karen-Gillan-001.jpg"><img class="size-thumbnail wp-image-3846" title="Amy Pond" src="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Karen-Gillan-001-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Amy Pond &lt;3</p></div>
<p>With my recent post about what iOS devices supported what extensions, I noticed a lot of people got to my website trying to work out how to use Vertex Array Objects (VAO) with the GL_OES_vertex_array_object extension.</p>
<p>They're easy to use so I thought I would write up a quick how-to use them. There is a limitation with the VAO however, it cannot be shared between contexts and can be problematic for multithreading.</p>
<p>If you plan to use one, either generate and create for each context you will be using it on. Or generate and create on the context you will be mostly using it on. It might be a mistake, since it says they <a href="http://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt" target="_blank">didn't want to create the first non-shared named object in OpenGL ES</a>, however at the same time they say no to sharing.</p>
<p>Like with any OpenGL object, first a name must be generated for the object, make sure you always initialise your name variables to 0, since this refers to a non-object.</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;">GLuint gVAO <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	GenerateVAO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
	CreateVAO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">do</span>
	<span class="br0">&#123;</span>
		BindVAO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
		DrawSomething<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
		UnbindVAO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> 1 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DestroyVAO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> GenerateVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Generate Name for VAO</span>
	glGenVertexArraysOES<span class="br0">&#40;</span> 1, <span class="sy3">&amp;</span>gVAO <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> DestroyVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> gVAO <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		glDeleteVertexArraysOES<span class="br0">&#40;</span> 1, <span class="sy3">&amp;</span>gVAO <span class="br0">&#41;</span><span class="sy4">;</span>
		gVAO <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>I've also put the syntax in there for deleting the VAO when you do not need it anymore.</p>
<p>Now for filling in the VAO. The VAO is basically a block of memory for storing vertex data schematic. For fixed function, the schematic includes information about data type, count, stride, buffer offset and whether it is enabled. This is for every pointer, glVertexPointer, glNormalPointer, glColorPointer, glTexCoordPointer, etc.</p>
<p>And for the shader program pipeline, it contains the schematic for each glVertexAttribPointer.</p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> CreateVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Bind VAO</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> gVAO <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Bind Vertex Buffer</span>
	glBindBuffer<span class="br0">&#40;</span> GL_ARRAY_BUFFER, gSomeVBO <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Fill in the VAO with our vertex schematic</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> hasShaders <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		glEnableVertexAttribArray<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		glVertexAttribPointer<span class="br0">&#40;</span> <span class="nu0">0</span>,			<span class="co1">// Attribute bind location</span>
				       <span class="nu0">3</span>,			<span class="co1">// Data type count</span>
				       GL_FLOAT,		<span class="co1">// Data type</span>
				       GL_FALSE,		<span class="co1">// Normalise this data types?</span>
				       <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">3</span>,	<span class="co1">// Stride to the next vertex</span>
				       0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
	<span class="br0">&#125;</span>
	<span class="kw1">else</span>
	<span class="br0">&#123;</span>
		glEnableClientState<span class="br0">&#40;</span> GL_VERTEX_ARRAY <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		glVertexPointer<span class="br0">&#40;</span> <span class="nu0">3</span>,			<span class="co1">// Data type count</span>
				 GL_FLOAT,		<span class="co1">// Data type</span>
				 <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">3</span>,	<span class="co1">// Stride to the next vertex</span>
				 0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Unbind VAO</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>You'll notice that when I am finished with with the VAO, I unbind it. This is because any changes to the vertex pointers will override any we have set within this function, so to protect the VAO we have just filled in, we unbind it.</p>
<p>When using a VAO, you will not need to bind the GL_ARRAY_BUFFER again the next time you use the VAO, since whenever you make a call to gl*Pointer() or glVertexAttribPointer(), the vertex buffer is stored with the vertex schematic. Because of this, you can have multiple streams of data from different vertex buffers.</p>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> CreateVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Bind VAO</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> gVAO <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Vertex Buffer 1</span>
	<span class="br0">&#123;</span>
		<span class="co1">// Bind Vertex Buffer</span>
		glBindBuffer<span class="br0">&#40;</span> GL_ARRAY_BUFFER, gSomeVBO1 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="co1">// Fill in the VAO with our vertex schematic</span>
		<span class="kw1">if</span><span class="br0">&#40;</span> hasShaders <span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			<span class="co1">//</span>
			glEnableVertexAttribArray<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glVertexAttribPointer<span class="br0">&#40;</span> <span class="nu0">0</span>,			<span class="co1">// Attribute bind location</span>
					       <span class="nu0">3</span>,			<span class="co1">// Data type count</span>
					       GL_FLOAT,		<span class="co1">// Data type</span>
					       GL_FALSE,		<span class="co1">// Normalise this data types?</span>
					       <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">5</span>,	<span class="co1">// Stride to the next vertex</span>
					       0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
&nbsp;
			<span class="co1">//</span>
			glEnableVertexAttribArray<span class="br0">&#40;</span> 1 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glVertexAttribPointer<span class="br0">&#40;</span> <span class="nu0">1</span>,			<span class="co1">// Attribute bind location</span>
					       <span class="nu0">2</span>,			<span class="co1">// Data type count</span>
					       GL_FLOAT,		<span class="co1">// Data type</span>
					       GL_FALSE,		<span class="co1">// Normalise this data types?</span>
					       <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">5</span>,	<span class="co1">// Stride to the next vertex</span>
					       <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> 3 <span class="br0">&#41;</span><span class="sy4">;</span>	<span class="co1">// Vertex Buffer starting offset</span>
		<span class="br0">&#125;</span>
		<span class="kw1">else</span>
		<span class="br0">&#123;</span>
			<span class="co1">//</span>
			glEnableClientState<span class="br0">&#40;</span> GL_VERTEX_ARRAY <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glVertexPointer<span class="br0">&#40;</span> <span class="nu0">3</span>,			<span class="co1">// Data type count</span>
					 GL_FLOAT,		<span class="co1">// Data type</span>
					 <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">5</span>,	<span class="co1">// Stride to the next vertex</span>
					 0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
&nbsp;
			<span class="co1">//</span>
			glClientActiveTexture<span class="br0">&#40;</span> GL_TEXTURE0 <span class="br0">&#41;</span><span class="sy4">;</span>
			glEnableClientState<span class="br0">&#40;</span> GL_TEXTURE_COORD_ARRAY <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glTexCoordPointer<span class="br0">&#40;</span> <span class="nu0">2</span>,						<span class="co1">// Data type count</span>
					   GL_FLOAT,					<span class="co1">// Data type</span>
					   <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">5</span>,				<span class="co1">// Stride to the next vertex</span>
					   <span class="br0">&#40;</span><span class="kw4">const</span> GLvoid <span class="sy2">*</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> 3<span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>	<span class="co1">// Vertex Buffer starting offset</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Vertex Buffer 2</span>
	<span class="br0">&#123;</span>
		<span class="co1">// Bind Vertex Buffer</span>
		glBindBuffer<span class="br0">&#40;</span> GL_ARRAY_BUFFER, gSomeVBO2 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="co1">// Fill in the VAO with our vertex schematic</span>
		<span class="kw1">if</span><span class="br0">&#40;</span> hasShaders <span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			glEnableVertexAttribArray<span class="br0">&#40;</span> 2 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glVertexAttribPointer<span class="br0">&#40;</span> <span class="nu0">2</span>,			<span class="co1">// Attribute bind location</span>
					       <span class="nu0">2</span>,			<span class="co1">// Data type count</span>
					       GL_FLOAT,		<span class="co1">// Data type</span>
					       GL_FALSE,		<span class="co1">// Normalise this data types?</span>
					       <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">2</span>,	<span class="co1">// Stride to the next vertex</span>
					       0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
		<span class="br0">&#125;</span>
		<span class="kw1">else</span>
		<span class="br0">&#123;</span>
			glClientActiveTexture<span class="br0">&#40;</span> GL_TEXTURE1 <span class="br0">&#41;</span><span class="sy4">;</span>
			glEnableClientState<span class="br0">&#40;</span> GL_TEXTURE_COORD_ARRAY <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
			glTexCoordPointer<span class="br0">&#40;</span> <span class="nu0">2</span>,			<span class="co1">// Data type count</span>
					   GL_FLOAT,		<span class="co1">// Data type</span>
					   <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> <span class="sy2">*</span> <span class="nu0">2</span>,	<span class="co1">// Stride to the next vertex</span>
					   0 <span class="br0">&#41;</span><span class="sy4">;</span>			<span class="co1">// Vertex Buffer starting offset</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Unbind VAO</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>In the code above, the first texture coordinate set is interlaced with the position data (offset by the sizeof three floats), and is bound using the first vertex buffer (gSomeVBO1). But the second texture coordinate is contained within a second vertex buffer (gSomeVBO2).</p>
<p>Finally, using the VAO is easy.</p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> BindVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> gVAO <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> UnbindVAO<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	glBindVertexArrayOES<span class="br0">&#40;</span> 0 <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>The call to glBindVertexArrayOES() with the VAO object name is just like calling everything we did in the create function. The only limitation is that one VAO is needed per vertex buffer, even if you have the same vertex schematic.</p>
<p>However, this is a great place for optimisation by sharing the same vertex buffer for vertex data with the same schematic. Then whenever you make a call to glDrawArrays() you can specify which vertex to start from. glDrawElements() is a little more complicated, you will need to increase all your elements in your index buffer so they point to the correct position within the shared buffer.</p>
<p>Or alternatively for glDrawElements(), you could share the same index buffer, and just specify the index buffer offset.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/30/using-vertex-array-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Website Updates</title>
		<link>http://www.lastrayofhope.com/2011/07/26/website-updates/</link>
		<comments>http://www.lastrayofhope.com/2011/07/26/website-updates/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 02:13:28 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Accelerate]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3827</guid>
		<description><![CDATA[I made some updates to a couple of entries I did a while ago. Fixed an error in my syntax where I calculated the reciprocal, but then divided by the reciprocal instead of multiplying. I also changed the entries to show equivalent functions instead of my bad descriptions of what the parameters do. iOS4 Vector and Matrix [...]]]></description>
			<content:encoded><![CDATA[<p>I made some updates to a couple of entries I did a while ago. Fixed an error in my syntax where I calculated the reciprocal, but then divided by the reciprocal instead of multiplying.</p>
<p>I also changed the entries to show equivalent functions instead of my bad descriptions of what the parameters do.</p>
<p><a title="iOS4 Vector and Matrix Math" href="http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/">iOS4 Vector and Matrix Math</a></p>
<p><a title="iOS4 Vector and Matrix Math: Part 2" href="http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/">iOS4 Vector and Matrix Math: Part 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/26/website-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS OpenGL ES Extension Support</title>
		<link>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/</link>
		<comments>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 04:26:21 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[OpenGLES]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3779</guid>
		<description><![CDATA[This weekend I was adding improved extension support to the Athena engine for iOS. There is a page on the Apple site that tells what device has what extensions but it hasn't been updated since iOS 4.2. So I ran through each version of GLES on a 1st Generate iPod Touch (MBX), an iPhone 4 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Screen-shot-2011-07-24-at-05.17.56.png"><img class="alignleft size-thumbnail wp-image-3780" style="border-width: 1px; border-color: black; border-style: solid;" title="Supported iOS OpenGL ES Extensions" src="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Screen-shot-2011-07-24-at-05.17.56-150x150.png" alt="Supported iOS OpenGL ES Extensions" width="150" height="150" /></a>This weekend I was adding improved extension support to the Athena engine for iOS. There is a page on the Apple site that tells what device has what extensions but it hasn't been updated since iOS 4.2.</p>
<p>So I ran through each version of GLES on a 1st Generate iPod Touch (MBX), an iPhone 4 (SGX) and an iPad 2 (A5), printing the returned string from glGetString( GL_EXTENSIONS ) for each device.</p>
<p>There are a some new extensions in iOS5, some of which are iPad2 specific. But you can see from the image, each newer device supports all the previous extensions.</p>
<p>I haven't had chance to run it on an iPad1 yet, so it will be interesting to see if there is any difference. I've only wrote a rough idea of what version of what SDK is required to use them.</p>
<p><strong>Anything with '***' does not need the extension to work and has an implementation for that version of OpenGL ES.</strong></p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-collapsed"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: none;"><pre class="c" style="font-family:monospace;">GL_OES_depth_texture
GL_OES_blend_equation_separate
GL_OES_blend_func_separate
GL_OES_blend_subtract
GL_OES_compressed_paletted_texture
GL_OES_depth24
GL_OES_draw_texture
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_framebuffer_object
GL_OES_mapbuffer
GL_OES_matrix_palette
GL_OES_packed_depth_stencil
GL_OES_point_size_array
GL_OES_point_sprite
GL_OES_read_format
GL_OES_rgb8_rgba8
GL_OES_stencil_wrap
GL_OES_stencil8
GL_OES_texture_mirrored_repeat
GL_OES_vertex_array_object
GL_OES_standard_derivatives
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
&nbsp;
GL_EXT_blend_minmax
GL_EXT_color_buffer_half_float
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_discard_framebuffer
GL_EXT_occlusion_query_boolean
GL_EXT_read_format_bgra
GL_EXT_separate_shader_objects
GL_EXT_shader_texture_lod
GL_EXT_shadow_samplers
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_lod_bias
GL_EXT_texture_rg				
&nbsp;
GL_APPLE_framebuffer_multisample
GL_APPLE_rgb_422
GL_APPLE_texture_2D_limited_npot
GL_APPLE_texture_format_BGRA8888
GL_APPLE_texture_max_level	
&nbsp;
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc</pre></div></div>
<p>For more information on each extension, most of them can be <a href="http://www.khronos.org/registry/gles/" target="_blank">viewed here</a>. Some of the newer ones in the EXT namespace are viewable on the what's new page of the beta for iOS5, though the page calls them by the APPLE namespace still.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS Multithreading OpenGL</title>
		<link>http://www.lastrayofhope.com/2011/07/07/iphone-multithreading-opengl/</link>
		<comments>http://www.lastrayofhope.com/2011/07/07/iphone-multithreading-opengl/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 21:38:41 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3644</guid>
		<description><![CDATA[I've been meaning to do this in my engine for a while, but just never had a time. Multithreading in OpenGL is simple enough as long as you are not accessing the same object as something on another thread. In my case, I'm only using it for my loading thread so I will not be [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3693" class="wp-caption alignleft" style="width: 160px"><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/07/IMG_0248.jpg"><img class="size-thumbnail wp-image-3693" title="Vashta Nerada" src="http://www.lastrayofhope.com/wp-content/uploads/2011/07/IMG_0248-150x150.jpg" alt="Vashta Nerada" width="150" height="150" /></a><p class="wp-caption-text">LEGO Vashta Nerada</p></div>
<p>I've been meaning to do this in my engine for a while, but just never had a time.</p>
<p>Multithreading in OpenGL is simple enough as long as you are not accessing the same object as something on another thread.</p>
<p>In my case, I'm only using it for my loading thread so I will not be accessing any of the objects created until loading is complete, and I will not be rendering on the separate thread either, at least not yet, I could use it for render targets.</p>
<p>So first of all, the creation of a OpenGL context on iOS. The examples I'm writing here are just simple main() loops so simplify what has to be done.</p>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	EAGLContext <span class="sy2">*</span> mContext <span class="sy1">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>EAGLContext alloc<span class="br0">&#93;</span> initWithAPI<span class="sy4">:</span>kEAGLRenderingAPIOpenGLES2<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Make context active for this thread</span>
	<span class="br0">&#91;</span>EAGLContext setCurrentContext<span class="sy4">:</span>mContext<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> <span class="nu0">1</span> <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// do some rendering</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Simple enough, this code most people who have written any iPhone OpenGL apps will recognise, it creates an ES2 context and bind it to the active thread.</p>
<p>However, now we want a separate thread that does OpenGL commands. We could use the same context, but a call binding a buffer on one thread could override to bind on the other causing invalid or wrong calls, so we would need to synchronise the threads.</p>
<p>Instead we create a second context that shares objects with our first one.</p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
EAGLContext <span class="sy2">*</span> mMainContext <span class="sy1">=</span> nil<span class="sy4">;</span>
EAGLContext <span class="sy2">*</span> mThreadContext <span class="sy1">=</span> nil<span class="sy4">;</span>
pthread_attr_t mThreadAttributes<span class="sy4">;</span>
pthread_t mThread<span class="sy4">;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	mMainContext <span class="sy1">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>EAGLContext alloc<span class="br0">&#93;</span> initWithAPI<span class="sy4">:</span>kEAGLRenderingAPIOpenGLES2<span class="br0">&#93;</span><span class="sy4">;</span>
	mThreadContext <span class="sy1">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>EAGLContext alloc<span class="br0">&#93;</span> initWithAPI<span class="sy4">:</span><span class="br0">&#91;</span>mMainContext API<span class="br0">&#93;</span>
					       sharegroup<span class="sy4">:</span><span class="br0">&#91;</span>mMainContext sharegroup<span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Make context active for this thread</span>
	<span class="br0">&#91;</span>EAGLContext setCurrentContext<span class="sy4">:</span>mMainContext<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Create second thread for OpenGL stuff</span>
	pthread_attr_init<span class="br0">&#40;</span> <span class="sy3">&amp;</span>mThreadAttributes <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	pthread_create<span class="br0">&#40;</span> <span class="sy3">&amp;</span>mThread,
			<span class="sy3">&amp;</span>mThreadAttributes,
			OGLThread,
			<span class="kw2">NULL</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> <span class="nu0">1</span> <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// do some rendering</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> <span class="sy2">*</span> OGLThread<span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inParam <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="br0">&#91;</span>EAGLContext setCurrentContext<span class="sy4">:</span>mThreadContext<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> loadingSomething <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// other opengl commands</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Flush changes</span>
	glFlush<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>With this second context, any calls to binding objects to the context will not affect the other thread's context. the [API] just makes it so that I'm using the same ES version as the first context, the [sharegroup] is the shared resource group that will be used by both contexts.</p>
<p>However you must take care not to update an object that is in use in the main thread, and whenever you make a change that will affect the other thread, call glFlush() on the thread that modified, and then rebind on the other thread so the changes take place.</p>
<p>In my own engine I hold shadow states of all options set, so one problem with this system would be I would need to pass in the Context depending on the thread. Instead I wrapped a class around the context that holds the shadow states and the context, as well as a pthread_t object for the thread it is assigned to.</p>
<p>Then whenever I do anything that will alter my shadow states, I make a call to pthread_self() to get the current thread, and find the relevant context.</p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">struct</span> MyContext
<span class="br0">&#123;</span>
	EAGLContext <span class="sy2">*</span> context<span class="sy4">;</span>
	ShadowStates states<span class="sy4">;</span>
	pthread_t thread<span class="sy4">;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
MyContext mMainContext<span class="sy4">;</span>
MyContext mThreadContext<span class="sy4">;</span>
&nbsp;
MyContext <span class="sy2">*</span> GetCurrentContext<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">int</span> ret <span class="sy1">=</span> pthread_equal<span class="br0">&#40;</span> pthread_self<span class="br0">&#40;</span><span class="br0">&#41;</span>, mMainContext.<span class="me1">thread</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="kw1">if</span><span class="br0">&#40;</span> ret <span class="sy1">==</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="co1">// 0 means not equal when using pthread_equal()</span>
	<span class="br0">&#123;</span>
		<span class="kw1">return</span> <span class="sy3">&amp;</span>mThreadContext<span class="sy4">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> <span class="sy3">&amp;</span>mMainContext<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>There is only one object so far that I have found doesn't share between contexts, and that is a Vertex Array Object (VAO).</p>
<p>For now I'm just making my code think the extension isn't present when multithreading is enabled, but I need to come up with a solution to generate the VAO for each thread it gets used on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/07/iphone-multithreading-opengl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

