<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Shader Problems - GLSL sampler3d() - 5.1.9</title>
		<link>http://www.allegro.cc/forums/view/616043</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 21 Feb 2016 22:25:34 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Before I spend any more time bashing my head against a wall...</p><p>I&#39;m trying to bind a texture to a sampler3D object and I&#39;m assuming that I can&#39;t use al_set_shader_sampler() because that would bind a 2D sampler.  (Or am I missing something?)</p><p>So I&#39;m trying to bind it manually but having trouble sorting out how to get the program ID out of the ALLEGRO_SHADER so I can glGetUniformLocation() and manually bind. </p><p>Other than setting up the shader manually myself (which I can do, just wanted to try using allegros built-in stuff as much as possible this time around) </p><p><b>Whats the most graceful way to get the program ID of a shader? </b>  (I know this will be openGL specific, and I&#39;ll have to write a separate routine for DX but I&#39;ll get to that later.)</p><p>ALLEGRO_SHADER_GLSL_S does not appear to be exposed, so I can&#39;t really cast to that and get the program id out there. (Trying to define ALLEGRO_SHADER_GLSL_S and all its nested internal types seems really messy...)</p><p>Recommendations?</p><p>Only reason I&#39;m able to use 5.1.9 is because of Reynoldo sharing the binaries - I have only successfully built Allegro ONCE, adn it was on OSX and ... frankly... I don&#39;t have it in me to build Allegro from scratch just to add an al_set_shader_sampler3d() for myself... if thats whats necessary, then fine.  But yeah... I&#39;m lazy.  I&#39;ve got so much past trauma trying to build Allegro (and other libraries) that I&#39;m paralyzed there <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Fri, 12 Feb 2016 00:05:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No simple way, as far as I can tell. You could try the following, though:</p><p>1. Include the header &quot;allegro5\internal\aintern_shader.h&quot; so that you get the definition of ALLEGRO_SHADER.</p><p>2. Get your shader pointer and cast it to an unsigned char pointer, so that you can do simple byte-length pointer arithmetic.</p><p>3. Add sizeof(ALLEGRO_SHADER) to this pointer.</p><p>4. Add ((sizeof(GLuint) * 2) to this pointer</p><p>5. Cast this pointer to a GLuint pointer</p><p>If everything worked as expected, this GLuint pointer should now point to the memory holding the program ID.</p><p>Note that this might not work at all. Like, if ALLEGRO_SHADER_GLSL_S happens not to be a tightly packed struct, this method will fail. Even if it doesn&#39;t fail, note that this is a highly platform-specific solution, becaues different compilers might pack structs differently (even the same compiler could pack structs differently depending on whether you&#39;re doing a 32- or a 64-bit build). If you go with this method, make sure to thoroughly test the outcome on all platforms you&#39;re interested in. The foolproof version would be to either build a GL shader yourself or build the Allegro library, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (RPG Hacker)</author>
		<pubDate>Fri, 12 Feb 2016 01:06:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This seems relevant: GLuint al_get_opengl_program_object(ALLEGRO_SHADER *shader)</p><p>I dont see any documentation, but it seems straight forward.  It would be nice if the documentation mentioned it - it would have saved me a full day of head banging.</p><p>Also, the documentation isnt clear to me that when using al_use_shader(NULL), how that might affect subsequent calls.  It seems that as soon as I al_use_shader(NULL), no subsequent calls to al_use_shader() seem to work?  The program continues to use the default shader from that point on, despite being toggled between the shader I created and the default?</p><p>EDIT: aactually when I used al_use_shader() on any two shaders (even if I manually load a default shader) it doesn&#39;t work after the second call.  Wtf am I doing wrong?  I can see the screen blink with the correct shader for one draw call, but after I toggle to another shader it stops working (and seems to be using default only.)&gt;:(&gt;:(</p><p>EDIT #2: <b>does al_set_target_bitmap() change the shader being used?!?!?!?!?!?</b>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Fri, 12 Feb 2016 04:39:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey thebicnic,</p><p>Good news is you can do it, I&#39;ve used essentially the exact same process you describe to add a <span class="source-code">GL_TEXTURE_CUBE_MAP</span> / <span class="source-code">sampler_cube</span> and extending it to sampler3d should be very similar.  There are a few critical things:</p><p>1) You should upgrade to the latest version of Allegro 5.1.13.  It has <span class="source-code">al_get_opengl_program_object<span class="k2">(</span><span class="k2">)</span></span> which was <i>literally</i> just added in this version.  Here&#39;s the <a href="https://www.allegro.cc/forums/thread/616006">change log</a>.  Building and/or getting Allegro since 5.1.9 has been made quite a bit easier than Previous versions, across all platforms.  Shader API has also improved.</p><p>2) Always reference the latest documentation from the <a href="http://liballeg.org/a5docs/trunk/">official Allegro 5 repo</a>. It&#39;s the most up to date. The manuals on allegro.cc are out of date - don&#39;t use them.</p><p>3) To add anything OpenGL specific to Allegro 5 you just need to <span class="source-code"><span class="p">#include &lt;allegro5/allegro_opengl.h&gt;</span></span> (and link the opengl libraries to build).</p><p>4) Here is how I implemented adding <span class="source-code">GL_TEXTURE_CUBE_MAP</span> and <span class="source-code">sampler_cube</span>:<br />  - <a href="https://github.com/MarkOates/allegro_flare/blob/master/include/allegro_flare/cubemap.h">cubemap.h</a><br />  - <a href="https://github.com/MarkOates/allegro_flare/blob/master/src/cubemap.cpp">cubemap.cpp</a><br />  - <a href="https://github.com/MarkOates/allegro_flare/blob/master/src/shader.cpp#L109-L143">setting the cube map uniform in the shader</a><br />  - <a href="https://github.com/MarkOates/flare_bootstrap/blob/master/bin/data/shaders/cube_vertex.glsl">here&#39;s a vertex shader that uses the cubemap</a><br />  - <a href="https://github.com/MarkOates/flare_bootstrap/blob/master/bin/data/shaders/cube_fragment.glsl">here&#39;s the corresponding fragment shader that uses the cubemap</a>
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616043/1019905#target">thebignic</a> said:</div><div class="quote"><p>Also, the documentation isnt clear to me that when using al_use_shader(NULL), how that might affect subsequent calls.</p></div></div><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>EDIT #2: does al_set_target_bitmap() change the shader being used?!?!?!?!?!?</p></div></div><p>Shaders are relatively-ish new.  Their behavior is a little undocumented and you will find some peculiarities, for example with <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> which stores/flushes/resets some state, <i>including projection</i>.  That is, for example, each bitmap has its own projection transform.  Also, when using <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span>, <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_prim"><span class="a">al_draw_prim</span></a><span class="k2">(</span><span class="k2">)</span></span>, and friends, Allegro binds the first texture <span class="source-code">TEXTURE0</span> to the <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a></span> that you pass into those functions (or does nothing if you pass <span class="source-code">NULL</span>).</p><p>Allegro could really benefit from a great shader tutorial since the exact bounds of these behaviors is still yet to be outlined in the docs. They&#39;re completely usable, however. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 12 Feb 2016 11:34:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616043/1019917#target">Mark Oates</a> said:</div><div class="quote"><p> which was literally just added in this version</p></div></div><p>Welp, no wonder I didn&#39;t find it while scanning the headers of Allegro on my PC. That was actually my first idea, I thought &quot;maybe the allegro_opengl.h header already has a getter for the program index&quot;, but I think I have version 5.1.10 on my system, so naturally, I didn&#39;t find anything like that. Feel stupid for my last, rather hacky, post now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (RPG Hacker)</author>
		<pubDate>Fri, 12 Feb 2016 18:15:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, so I&#39;m on 5.1.13 and I can get the program ID now. </p><p>Running into issues with  texture3d() / glTexImage3D() now.</p><p>Does anyone have a working code snippet of generating/binding a 3D texture buffer?  I can&#39;t imagine its all that different from 2D and the (very few) examples I&#39;ve seen of glTexImage3D() appear to be very similar (to each other, and to what I have.)  </p><p>Marks cube map is interesting and I don&#39;t see anything that is being done there that I&#39;m not doing (albeit for texture3d) in my own code.</p><p>It seems like no matter what my data is (all bytes = 0 or all bytes = 255) I cant read anything sensible in the shader using texture3d() (ie: from vec(1,1,1) or vec(0,0,0) or vec (0.5,0.5,0.5) texture3d() is still returning color values like (0.1,0.9,0.1) when I&#39;ve uploaded a buffer full of zeros?</p><p>I&#39;m still grabbing glGetError after every single GL call and nothing is throwing an error  with the shader compile/link or attaching the texture to a uniform at draw time.</p><p>I&#39;m totally stumped.  Day #2 .... <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><p>EDIT: Well.. moments after I posted this, of course, I discovered that I was passing a reference of a pointer to glTexImage3D() so.. yeah... don&#39;t do that.  </p><p>... I still blame OpenGL for my basic C++ snafu <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Fri, 12 Feb 2016 22:35:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What is a <span class="source-code">texture3d</span>?  Like, what would you use it for?  Serious question.</p><p>Another thing to keep in mind that could be a bit strange is that Allegro texture coordinates are <span class="source-code"><span class="k2">[</span><span class="n">0</span><span class="k3">-</span>bitmap_width<span class="k2">]</span>, <span class="k2">[</span><span class="n">0</span><span class="k3">-</span>bitmap_height<span class="k2">]</span></span>.  This is different from the usual <span class="source-code"><span class="k2">[</span><span class="n">0</span><span class="k3">-</span><span class="n">1</span><span class="k2">]</span>, <span class="k2">[</span><span class="n">0</span><span class="k3">-</span><span class="n">1</span><span class="k2">]</span></span> texture coordinates that you get with UV textures.  Because of that, in the shader you might use <span class="source-code">al_use_tex_matrix</span> and multiply the incoming texture coordinates by <span class="source-code">al_tex_matrix</span>.</p><p>That may have an affect on the appearance of your <span class="source-code">texture3d</span>.  You could be getting textures that are only drawing in the top left pixel (0,0) <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> I&#39;ve done that before <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>You can also <a href="http://liballeg.org/a5docs/trunk/primitives.html#custom-vertex-declaration-routines">create a custom vertex</a> which may make more sense for 3D and textures.  My vertex definition uses <span class="source-code"><span class="k2">[</span><span class="n">0</span><span class="k3">-</span><span class="n">1</span><span class="k2">]</span>,<span class="k2">[</span><span class="n">0</span><span class="k3">-</span><span class="n">1</span><span class="k2">]</span></span> for texture coordinates and also includes a vertex normal.  <a href="https://github.com/MarkOates/allegro_flare/blob/master/src/model.cpp#L21-L29">Here&#39;s what it looks like</a>.</p><p>But that may or may not be related to your actual problem. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 12 Feb 2016 23:49:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Mark said:</div><div class="quote"><p>What is a texture3d? Like, what would you use it for? Serious question.</p></div></div><p>

Color correction look-up table (LUT)</p><p>Other than that, it appears to be used for volumetric rendering (clouds, water?) and maybe voxel rendering but thats all way above my head!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Sat, 13 Feb 2016 00:29:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616043/1019938#target">thebignic</a> said:</div><div class="quote"><p>Color correction look-up table (LUT)
</p></div></div><p>I have no idea how that works. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>It sounds cool, though.  I&#39;d be totally into hearing about your implementation. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Sat, 13 Feb 2016 01:14:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s a brief overview of my current color correction lookup table solution. I just learned about the possibility of doing this last week, so I am <b>by no means</b> an expert.</p><p>I just thought I&#39;d share cause there doesn&#39;t seem to be any reasonably complete examples anywhere, let alone any that use Allegro.  While this may have a few pieces missing, I think all of the heavy lifting is documented...  If I left something important out, let me know.</p><p>I&#39;m no artist, but see attachments for examples of what a LUT can do to transform an image in real time, with no other processing.  (&quot;lut-natural&quot; is the way the game draws without any color correction)</p><p>Also see attachments for a neutral LUT (RGBTable16x1.png) that you can use to build your own.</p><h1>How it works...</h1><p> </p><p>To make a LUT, just draw your game as you normally would, screenshot, take it into Photoshop and paste a neutral LUT into a corner somewhere.  Then modify the colours, saturation, hue, contrast, etc until the image looks how you want.  <br />Then just take the LUT portion and save it as a new PNG which we&#39;ll load into the shader later.</p><p>This &quot;look up table&quot; basically contains every colour that you can draw, in a 3D cube, and corrected using the rules we used to modify the colours in Photoshop.  When you draw a pixel with a shader, all the colour correction shader will do is use the source colour as a <b>position</b> in the LUT cube and see what the new colour should be based on the LUT image we loaded up.  16x16x16 colours is enough to do a decent linear interpolation for my needs but you may want to go to 32x32x32 if you&#39;re into that sort of thing.</p><h1>The Code...</h1><p> <br />At program start, call loadShaders() to load the pixel/vertex shaders and build any LUTs that are specified in LUTList / LUTStrings[].</p><p>buildLut() will take an image (ie: the PNG we created above) and then load it into a GL_TEXTURE_3D array so that we can use Sampler3D in our shader.</p><p>We can use Allegro to build the shaders as long as we can get the OpenGL ID later with al_get_opengl_program_object() so it&#39;ll require the latest version of Allegro to do it that way.</p><p>We can&#39;t use Allegro to bind the 3D texture to the shader though, so EnableLUTDrawing() <br />allows us to do that.</p><p>To draw using a lookup table, just enable the LUT shader with a specified table ID<br />for example: </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span><a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>tempBitmap<span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="k2">[</span>... draw your game <span class="k1">using</span> <span class="k1">default</span> shader ... <span class="k2">]</span>
<span class="number">  5</span>
<span class="number">  6</span><a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>displayManager.display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>shaderManager.EnableLUTDrawing<span class="k2">(</span> LUT_ARENA01_DUSK <span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>tempBitmap, <span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>




</p><h1>PIXEL SHADER (Colour Correction)</h1><p> 
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifdef GL_ES</span>
<span class="number">  2</span>precision mediump <span class="k1">float</span><span class="k2">;</span>
<span class="number">  3</span><span class="p">#endif</span>
<span class="number">  4</span>uniform sampler2D al_tex<span class="k2">;</span>
<span class="number">  5</span>uniform sampler3D ColorGradingLUT<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>uniform <span class="k1">bool</span> al_use_tex<span class="k2">;</span>
<span class="number">  8</span>varying vec4 varying_color<span class="k2">;</span>
<span class="number">  9</span>varying vec2 varying_texcoord<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">const</span> <span class="k1">float</span> lutSize <span class="k3">=</span> <span class="n">16</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 13</span><span class="k1">const</span> vec3 scale <span class="k3">=</span> vec3<span class="k2">(</span><span class="k2">(</span>lutSize <span class="k3">-</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span> <span class="k3">/</span> lutSize<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span><span class="k1">const</span> vec3 offset <span class="k3">=</span> vec3<span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="k2">(</span><span class="n">2</span>.<span class="n">0</span> <span class="k3">*</span> lutSize<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 17</span><span class="k2">{</span>
<span class="number"> 18</span>  <span class="k1">if</span> <span class="k2">(</span>al_use_tex<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 19</span>
<span class="number"> 20</span>    vec4 rawColor <span class="k3">=</span> varying_color <span class="k3">*</span> texture2D<span class="k2">(</span>al_tex, varying_texcoord<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>    vec4 lutSample <span class="k3">=</span> texture3D<span class="k2">(</span>ColorGradingLUT, scale <span class="k3">*</span> texture2D<span class="k2">(</span>al_tex, varying_texcoord<span class="k2">)</span>.rgb <span class="k3">+</span> offset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    gl_FragColor.a <span class="k3">=</span> texture2D<span class="k2">(</span>al_tex, varying_texcoord<span class="k2">)</span>.a<span class="k2">;</span>
<span class="number"> 24</span>    <span class="k1">if</span> <span class="k2">(</span>gl_FragColor.a <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">001</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>      gl_FragColor.g<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 26</span>      gl_FragColor.r<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 27</span>      gl_FragColor.b<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 28</span>      gl_FragColor.a<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k2">}</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>  <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 32</span>       gl_FragColor <span class="k3">=</span> varying_color<span class="k2">;</span>
<span class="number"> 33</span>  <span class="k2">}</span>
<span class="number"> 34</span><span class="k2">}</span>
</div></div><p>

</p><h1>VERTEX SHADER (DEFAULT)</h1><p> 
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>attribute vec4 al_pos<span class="k2">;</span>
<span class="number">  2</span>attribute vec4 al_color<span class="k2">;</span>
<span class="number">  3</span>attribute vec2 al_texcoord<span class="k2">;</span>
<span class="number">  4</span>uniform mat4 al_projview_matrix<span class="k2">;</span>
<span class="number">  5</span>uniform <span class="k1">bool</span> al_use_tex_matrix<span class="k2">;</span>
<span class="number">  6</span>uniform mat4 al_tex_matrix<span class="k2">;</span>
<span class="number">  7</span>varying vec4 varying_color<span class="k2">;</span>
<span class="number">  8</span>varying vec2 varying_texcoord<span class="k2">;</span>
<span class="number">  9</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 10</span><span class="k2">{</span>
<span class="number"> 11</span>  varying_color <span class="k3">=</span> al_color<span class="k2">;</span>
<span class="number"> 12</span>  <span class="k1">if</span> <span class="k2">(</span>al_use_tex_matrix<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>    vec4 uv <span class="k3">=</span> al_tex_matrix <span class="k3">*</span> vec4<span class="k2">(</span>al_texcoord, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    varying_texcoord <span class="k3">=</span> vec2<span class="k2">(</span>uv.x, uv.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>  <span class="k2">}</span>
<span class="number"> 16</span>  <span class="k1">else</span>
<span class="number"> 17</span>    varying_texcoord <span class="k3">=</span> al_texcoord<span class="k2">;</span>
<span class="number"> 18</span>  gl_Position <span class="k3">=</span> al_projview_matrix <span class="k3">*</span> al_pos<span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>




</p><h1>Shader Manager (partial)</h1><p> 
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span><span class="k1">static</span> <span class="k1">const</span> <span class="k1">int</span> MAX_LUTS <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number">  3</span><span class="k1">enum</span> LUTList <span class="k2">{</span>
<span class="number">  4</span>    LUT_01_DAY
<span class="number">  5</span>    ,LUT_01_DUSK
<span class="number">  6</span>    ,LUT_01_NIGHT
<span class="number">  7</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">///point to a single LUT image</span>
<span class="number"> 10</span><span class="k1">static</span> <span class="k1">const</span> std::string LUTStrings<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number"> 11</span>    <span class="s">"LUT_01_day.png"</span>
<span class="number"> 12</span>    ,<span class="s">"LUT_01_dusk.png"</span>
<span class="number"> 13</span>    ,<span class="s">"LUT_01_evening.png"</span>
<span class="number"> 14</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>



</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span>
<span class="number">   3</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmpLUT<span class="k2">[</span>MAX_LUTS<span class="k2">]</span><span class="k2">;</span>
<span class="number">   4</span>        GLuint bmpLUT_GL<span class="k2">[</span>MAX_LUTS<span class="k2">]</span><span class="k2">;</span>
<span class="number">   5</span>
<span class="number">   6</span>        ALLEGRO_SHADER <span class="k3">*</span>default_shader<span class="k2">;</span>
<span class="number">   7</span>        ALLEGRO_SHADER <span class="k3">*</span>LUT_shader<span class="k2">;</span>
<span class="number">   8</span>        GLuint LUT_shader_GL<span class="k2">;</span>
<span class="number">   9</span>        GLuint default_shader_GL<span class="k2">;</span>
<span class="number">  10</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="k1">void</span> ShaderManager::EnableLUTDrawing<span class="k2">(</span><span class="k1">int</span> LUTID<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  13</span>
<span class="number">  14</span>        al_use_shader<span class="k2">(</span>LUT_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>
<span class="number">  16</span>        GLenum err<span class="k2">;</span>
<span class="number">  17</span>
<span class="number">  18</span>        glActiveTexture<span class="k2">(</span>GL_TEXTURE1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  19</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glActiveTexture(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  20</span>
<span class="number">  21</span>        GLint handle <span class="k3">=</span> glGetUniformLocation<span class="k2">(</span>LUT_shader_GL, <span class="s">"ColorGradingLUT"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  22</span>            <span class="k1">if</span> <span class="k2">(</span>handle <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" No uniform variable found -- handle: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> handle <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  23</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glGetUniformLocation(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  24</span>
<span class="number">  25</span>        GLuint texture <span class="k3">=</span> bmpLUT_GL<span class="k2">[</span>LUTID<span class="k2">]</span><span class="k2">;</span>
<span class="number">  26</span>
<span class="number">  27</span>        glBindTexture<span class="k2">(</span>GL_TEXTURE_3D, texture<span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glBindTexture(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  29</span>
<span class="number">  30</span>        glUniform1i<span class="k2">(</span>handle, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glUniform1i(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  32</span>
<span class="number">  33</span><span class="k2">}</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="c">///given a bitmap, build a GL_TEXTURE_3D object and bind it </span>
<span class="number">  36</span>GLuint ShaderManager::buildLut<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> lutBMP<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  37</span>
<span class="number">  38</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>lutBMP<span class="k2">)</span> <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" generating 3d lut image from bitmap...\n"</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_LOCKED_REGION"><span class="a">ALLEGRO_LOCKED_REGION</span></a> <span class="k3">*</span>bmpLock<span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>lutBMP, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READONLY <span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>
<span class="number">  44</span>    GLuint glID<span class="k2">;</span>
<span class="number">  45</span>
<span class="number">  46</span>    GLenum err<span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</span>        GLubyte  <span class="k3">*</span> pixels<span class="k2">;</span>
<span class="number">  49</span>        pixels <span class="k3">=</span> <span class="k1">new</span>  GLubyte <span class="k2">[</span> <span class="n">16</span> <span class="k3">*</span> <span class="n">16</span> <span class="k3">*</span> <span class="n">16</span> <span class="k3">*</span> <span class="n">3</span> <span class="k2">]</span><span class="k2">;</span>  <span class="c">///LUT size is 16x16x16 and only contains RGB elements (no alpha)</span>
<span class="number">  50</span>        <span class="k1">long</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number">  51</span>        <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> z <span class="k3">&lt;</span><span class="n">16</span><span class="k2">;</span> z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  52</span>            <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> <span class="n">16</span><span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  53</span>                <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> <span class="n">16</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>                    <span class="c">///neutral</span>
<span class="number">  55</span>                    <span class="c">//pixels[i + 0] = util.unlerp(0,15,z) * 255; // blue</span>
<span class="number">  56</span>                    <span class="c">//pixels[i + 1] = util.unlerp(0,15,y) * 255; // green</span>
<span class="number">  57</span>                    <span class="c">//pixels[i + 2] = util.unlerp(0,15,x) * 255; // red</span>
<span class="number">  58</span>
<span class="number">  59</span>          <span class="c">///sample bitmap</span>
<span class="number">  60</span>                    <span class="k1">int</span> x2d <span class="k3">=</span> x <span class="k3">+</span> <span class="k2">(</span>z <span class="k3">*</span> <span class="n">16</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>                    <span class="k1">int</span> y2d <span class="k3">=</span> y<span class="k2">;</span>
<span class="number">  62</span>                    <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>lutBMP, x2d, y2d<span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>                    pixels<span class="k2">[</span>i <span class="k3">+</span> <span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> c.b <span class="k3">*</span> <span class="n">255</span><span class="k2">;</span> <span class="c">// blue</span>
<span class="number">  64</span>                    pixels<span class="k2">[</span>i <span class="k3">+</span> <span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> c.g <span class="k3">*</span> <span class="n">255</span><span class="k2">;</span> <span class="c">// green</span>
<span class="number">  65</span>                    pixels<span class="k2">[</span>i <span class="k3">+</span> <span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> c.r <span class="k3">*</span> <span class="n">255</span><span class="k2">;</span> <span class="c">// red</span>
<span class="number">  66</span>
<span class="number">  67</span>                    i<span class="k3">=</span>i<span class="k3">+</span><span class="n">3</span><span class="k2">;</span>
<span class="number">  68</span>             <span class="k2">}</span>
<span class="number">  69</span>          <span class="k2">}</span>
<span class="number">  70</span>        <span class="k2">}</span>
<span class="number">  71</span>        <a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span>lutBMP<span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>
<span class="number">  73</span>        glEnable<span class="k2">(</span>GL_TEXTURE_3D<span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glEnable(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err<span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>        glActiveTexture<span class="k2">(</span>GL_TEXTURE1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glActiveTexture(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span>        glPixelStorei<span class="k2">(</span>GL_UNPACK_ALIGNMENT, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glPixelStorei(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  81</span>
<span class="number">  82</span>        glGenTextures<span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>glID<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glGenTextures(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  84</span>
<span class="number">  85</span>        glBindTexture<span class="k2">(</span>GL_TEXTURE_3D, glID<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glBindTexture(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  87</span>
<span class="number">  88</span>        glTexParameteri<span class="k2">(</span>GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR<span class="k2">)</span><span class="k2">;</span> <span class="c">///required for trilinear filtering which we NEED</span>
<span class="number">  89</span>        glTexParameteri<span class="k2">(</span>GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR<span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>        <span class="c">//glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);</span>
<span class="number">  91</span>        <span class="c">//glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);</span>
<span class="number">  92</span>        <span class="c">//glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);</span>
<span class="number">  93</span>
<span class="number">  94</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glTexParameteri(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  95</span>
<span class="number">  96</span>        glTexImage3D<span class="k2">(</span>GL_TEXTURE_3D, <span class="n">0</span>, GL_RGB8, <span class="n">16</span>, <span class="n">16</span>, <span class="n">16</span>, <span class="n">0</span>, GL_RGB,GL_UNSIGNED_BYTE, pixels<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glTexImage3D(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number">  98</span>
<span class="number">  99</span>        glDisable<span class="k2">(</span>GL_TEXTURE_3D<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glDisable(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 101</span>
<span class="number"> 102</span>        glActiveTexture<span class="k2">(</span>GL_TEXTURE0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>            err<span class="k3">=</span>glGetError<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span> err <span class="k3">!</span><span class="k3">=</span> GL_NO_ERROR<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" glActiveTexture(); ERROR: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> err <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</span>
<span class="number"> 106</span>
<span class="number"> 107</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> pixels<span class="k2">;</span>
<span class="number"> 108</span>    pixels <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 109</span>
<span class="number"> 110</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"glID="</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> glID <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 111</span>
<span class="number"> 112</span>    <span class="k1">return</span> glID<span class="k2">;</span>
<span class="number"> 113</span>
<span class="number"> 114</span><span class="k2">}</span>
<span class="number"> 115</span>
<span class="number"> 116</span><span class="k1">void</span> ShaderManager::loadShaders<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 117</span><span class="k2">{</span>
<span class="number"> 118</span>
<span class="number"> 119</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n\n\nloadShaders()\n"</span><span class="k2">;</span>
<span class="number"> 120</span>
<span class="number"> 121</span>    default_shader <span class="k3">=</span> al_loadShaderFromFile<span class="k2">(</span><span class="s">"PIXEL.txt"</span>, <span class="s">"VERTEX.txt"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>    default_shader_GL <span class="k3">=</span> al_get_opengl_program_object<span class="k2">(</span>default_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>
<span class="number"> 124</span>    LUT_shader <span class="k3">=</span> al_loadShaderFromFile<span class="k2">(</span><span class="s">"PIXEL_COLOUR_CORRECT.txt"</span>, <span class="s">"VERTEX.txt"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>    LUT_shader_GL <span class="k3">=</span> al_get_opengl_program_object<span class="k2">(</span>LUT_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>
<span class="number"> 128</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" loading / building LUTS...\n"</span><span class="k2">;</span>
<span class="number"> 129</span>
<span class="number"> 130</span>        <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>MAX_LUTS<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 131</span>            bmpLUT<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span> LUTStrings<span class="k2">[</span>i<span class="k2">]</span>.c_str<span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>            <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmpLUT<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 133</span>            <span class="k2">{</span>
<span class="number"> 134</span>                std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"image file open error: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> LUTStrings<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 135</span>                <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 136</span>            <span class="k2">}</span>
<span class="number"> 137</span>
<span class="number"> 138</span>            bmpLUT_GL<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> buildLut<span class="k2">(</span> bmpLUT<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>            <span class="k1">if</span> <span class="k2">(</span>bmpLUT_GL<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">&lt;</span><span class="n">1</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"ERROR:  "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> bmpLUT<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" handle returned="</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> bmpLUT_GL<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 140</span>
<span class="number"> 141</span>        <span class="k2">}</span>
<span class="number"> 142</span>
<span class="number"> 143</span>
<span class="number"> 144</span>
<span class="number"> 145</span>
<span class="number"> 146</span>
<span class="number"> 147</span><span class="k2">}</span>
<span class="number"> 148</span>
<span class="number"> 149</span>
<span class="number"> 150</span>
<span class="number"> 151</span>ALLEGRO_SHADER <span class="k3">*</span> ShaderManager::al_loadShaderFromFile<span class="k2">(</span>std::string fragment, std::string vertex<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 152</span>
<span class="number"> 153</span>    ALLEGRO_SHADER <span class="k3">*</span> shadey<span class="k2">;</span>
<span class="number"> 154</span>
<span class="number"> 155</span>    shadey <span class="k3">=</span> al_create_shader<span class="k2">(</span>ALLEGRO_SHADER_GLSL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 156</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>shadey<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 157</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Could not create shader.\n"</span><span class="k2">;</span>
<span class="number"> 158</span>    <span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>al_attach_shader_source_file<span class="k2">(</span>shadey, ALLEGRO_VERTEX_SHADER, vertex.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 161</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_attach_shader_source_file failed:"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> al_get_shader_log<span class="k2">(</span>shadey<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 162</span>    <span class="k2">}</span>
<span class="number"> 163</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>al_attach_shader_source_file<span class="k2">(</span>shadey, ALLEGRO_PIXEL_SHADER, fragment.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 164</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_attach_shader_source_file failed: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span>     al_get_shader_log<span class="k2">(</span>shadey<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 165</span>    <span class="k2">}</span>
<span class="number"> 166</span>
<span class="number"> 167</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>al_build_shader<span class="k2">(</span>shadey<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 168</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_build_shader failed:"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> al_get_shader_log<span class="k2">(</span>shadey<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 169</span>    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 170</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"shader build succeeded: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span>     al_get_shader_log<span class="k2">(</span>shadey<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 171</span>    <span class="k2">}</span>
<span class="number"> 172</span>
<span class="number"> 173</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"gl program: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span>  al_get_opengl_program_object<span class="k2">(</span>shadey<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\n"</span><span class="k2">;</span>
<span class="number"> 174</span>
<span class="number"> 175</span>    <span class="k1">return</span> shadey<span class="k2">;</span>
<span class="number"> 176</span>
<span class="number"> 177</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Fri, 19 Feb 2016 05:51:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s cool.</p><p>So it&#39;s like a giant lookup table that&#39;s values are interpolated, similar to how 2D texture&#39;s pixel values are interpolated.</p><p>The only thing I can relate &quot;3D texture&quot; to is like, procedurally generated textures like wood that have different values based on XYZ.</p><p><span class="remote-thumbnail"><span class="json">{"name":"610198","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/2\/7\/27ba756e6a1e7670b4a70ceab8b87fcd.jpg","w":1100,"h":499,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/2\/7\/27ba756e6a1e7670b4a70ceab8b87fcd"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/2/7/27ba756e6a1e7670b4a70ceab8b87fcd-240.jpg" alt="610198" width="240" height="108" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Sun, 21 Feb 2016 22:25:34 +0000</pubDate>
	</item>
</rss>
