<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>silly openGl texture question</title>
		<link>http://www.allegro.cc/forums/view/570879</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 09 Mar 2006 14:26:41 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have started to make a 2d top view game. Wall, monsters, etc.<br />Now i created a function, that is casting light and shadows on the level.<br />My idea is to get all light sources to one texture (using blenging) and to have a &quot;shadowmap&quot; that will be blended onto the level.</p><p>My problem - when creating the shadows, i draw them directly to the level - and thats bad, cause i can&#39;t do 2 lightsources at once.</p><p>So the question - how should I change the drawing code to draw on some &quot;memory-bitmap&quot; as used in allegro and not directly on the video screen ?  <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /></p><p>My code is from the tutorials, nothing special..<br />(the x1, ... x4 points are simple drawing rectangle shadows)</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="c">//reset matrix</span></td></tr><tr><td class="number">2</td><td>glBindTexture<span class="k2">(</span>GL_TEXTURE_2D, gl_textures<span class="k2">[</span>texture<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>glBlendFunc<span class="k2">(</span>GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>glEnable<span class="k2">(</span>GL_BLEND<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>glBegin<span class="k2">(</span>GL_QUADS<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  glColor4ub<span class="k2">(</span>r, g, b, alpha<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>  <span class="c">//Draw our four points, clockwise.</span></td></tr><tr><td class="number">11</td><td>  glTexCoord2f<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">12</td><td>  glVertex3f<span class="k2">(</span>x1,y1, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  glTexCoord2f<span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  glVertex3f<span class="k2">(</span>x2,y2, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">15</td><td>  glTexCoord2f<span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">16</td><td>  glVertex3f<span class="k2">(</span>x3,y3, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  glTexCoord2f<span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">18</td><td>  glVertex3f<span class="k2">(</span>x4,y4, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">19</td><td>  </td></tr><tr><td class="number">20</td><td>glEnd<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Pavel Hilser)</author>
		<pubDate>Sat, 04 Mar 2006 19:01:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You need to render your lights and shadows on a texture using FBOs, and call &#39;glBlendEquationEXT(GL_MAX_EXT)&#39;, which would make your lights and shadows accumulate in a realistic way, e.g. red, green and blue lights will mix into white.</p><p>But even then, simply blending your shadowmap with the level won&#39;t do the job, because then, even the most dark spot won&#39;t be completely dark because it&#39;ll be a blend of black and whatever is underneath it.</p><p>Maybe you can use &#39;glBlendEquationEXT&#39; with another parameter to fix that (what you need is to multiply the level pixel by the lightmap pixel), I don&#39;t remember how it&#39;s called, though.<br />I would suggest you to search the net for &#39;glBlendEquationEXT&#39;.</p><p>[EDIT]</p><p>Silly me!<br />You can blend the lightmap with the rest of the level correctly with multitexturing and TEXTURE_ENV_MODE set to MODULATE.<br />And by the way, the simplest solution would be to precalculate your lightmaps instead of generating them in real time with all that render-to-texture burden, which isn&#39;t supported on old cards.</p><p>Oh, and here&#39;s an example of how to render stuff on a texture:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;GL/glut.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;math.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="p">#define    SIZE  256</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">static</span> <span class="k1">unsigned</span> <span class="k1">char</span> texture<span class="k2">[</span><span class="n">3</span> <span class="k3">*</span> SIZE <span class="k3">*</span> SIZE<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="k1">static</span> <span class="k1">unsigned</span> <span class="k1">int</span> texture_id<span class="k2">;</span></td></tr><tr><td class="number">9</td><td><span class="k1">static</span> <span class="k1">int</span> window_width <span class="k3">=</span> <span class="n">500</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">static</span> <span class="k1">int</span> window_height <span class="k3">=</span> <span class="n">500</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="c">/*</span></td></tr><tr><td class="number">14</td><td><span class="c">** Just a textured cube</span></td></tr><tr><td class="number">15</td><td><span class="c">*/</span></td></tr><tr><td class="number">16</td><td><span class="k1">void</span>    Cube <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>  glBegin <span class="k2">(</span>GL_QUADS<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>&#160;</td></tr><tr><td class="number">45</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span><span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>,  <span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>  glTexCoord2i <span class="k2">(</span><span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> glVertex3f <span class="k2">(</span> <span class="n">1</span>, <span class="k3">-</span><span class="n">1</span>,  <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td>  glEnd <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td><span class="k2">}</span></td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td><span class="c">/*</span></td></tr><tr><td class="number">54</td><td><span class="c">** Function called to update rendering</span></td></tr><tr><td class="number">55</td><td><span class="c">*/</span></td></tr><tr><td class="number">56</td><td><span class="k1">void</span>    DisplayFunc <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td><span class="k2">{</span></td></tr><tr><td class="number">58</td><td>  <span class="k1">static</span> <span class="k1">float</span> alpha <span class="k3">=</span> <span class="n">20</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td>  glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>  glTranslatef <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="k3">-</span><span class="n">10</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>  glRotatef <span class="k2">(</span><span class="n">30</span>, <span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>  glRotatef <span class="k2">(</span>alpha, <span class="n">0</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>  <span class="c">/* Define a view-port adapted to the texture */</span></td></tr><tr><td class="number">66</td><td>  glMatrixMode<span class="k2">(</span>GL_PROJECTION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>  glLoadIdentity <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>  gluPerspective <span class="k2">(</span><span class="n">20</span>, <span class="n">1</span>, <span class="n">5</span>, <span class="n">15</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>  glViewport<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, SIZE, SIZE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>  glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td>  <span class="c">/* Render to buffer */</span></td></tr><tr><td class="number">73</td><td>  glClearColor <span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>  glClear <span class="k2">(</span>GL_COLOR_BUFFER_BIT <span class="k3">|</span> GL_DEPTH_BUFFER_BIT<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>  Cube <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>  glFlush <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>&#160;</td></tr><tr><td class="number">78</td><td>  <span class="c">/* Copy buffer to texture */</span></td></tr><tr><td class="number">79</td><td>  glCopyTexSubImage2D<span class="k2">(</span>GL_TEXTURE_2D, <span class="n">0</span>, <span class="n">5</span>, <span class="n">5</span>, <span class="n">0</span>, <span class="n">0</span>, SIZE <span class="k3">-</span> <span class="n">10</span>, SIZE <span class="k3">-</span> <span class="n">10</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>&#160;</td></tr><tr><td class="number">81</td><td>  <span class="c">/* Render to screen */</span></td></tr><tr><td class="number">82</td><td>  glMatrixMode<span class="k2">(</span>GL_PROJECTION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>  glLoadIdentity <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>  gluPerspective <span class="k2">(</span><span class="n">20</span>, window_width <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span> window_height, <span class="n">5</span>, <span class="n">15</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>  glViewport<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, window_width, window_height<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>  glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>  glClearColor <span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  glClear <span class="k2">(</span>GL_COLOR_BUFFER_BIT <span class="k3">|</span> GL_DEPTH_BUFFER_BIT<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>  Cube <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td>&#160;</td></tr><tr><td class="number">91</td><td>  <span class="c">/* End */</span></td></tr><tr><td class="number">92</td><td>  glFlush <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td>  glutSwapBuffers <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">94</td><td>&#160;</td></tr><tr><td class="number">95</td><td>  <span class="c">/* Update again and again */</span></td></tr><tr><td class="number">96</td><td>  alpha <span class="k3">=</span> alpha <span class="k3">+</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>  glutPostRedisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td><span class="k2">}</span></td></tr><tr><td class="number">99</td><td>&#160;</td></tr><tr><td class="number">100</td><td><span class="c">/*</span></td></tr><tr><td class="number">101</td><td><span class="c">** Function called when the window is created or resized</span></td></tr><tr><td class="number">102</td><td><span class="c">*/</span></td></tr><tr><td class="number">103</td><td><span class="k1">void</span>    ReshapeFunc <span class="k2">(</span><span class="k1">int</span> width, <span class="k1">int</span> height<span class="k2">)</span></td></tr><tr><td class="number">104</td><td><span class="k2">{</span></td></tr><tr><td class="number">105</td><td>  window_width <span class="k3">=</span> width<span class="k2">;</span></td></tr><tr><td class="number">106</td><td>  window_height <span class="k3">=</span> height<span class="k2">;</span></td></tr><tr><td class="number">107</td><td>  glutPostRedisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">108</td><td><span class="k2">}</span></td></tr><tr><td class="number">109</td><td>&#160;</td></tr><tr><td class="number">110</td><td><span class="c">/*</span></td></tr><tr><td class="number">111</td><td><span class="c">** Function called when a key is hit</span></td></tr><tr><td class="number">112</td><td><span class="c">*/</span></td></tr><tr><td class="number">113</td><td><span class="k1">void</span>    KeyboardFunc <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a>, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span></td></tr><tr><td class="number">114</td><td><span class="k2">{</span></td></tr><tr><td class="number">115</td><td>  <span class="k1">int</span> foo<span class="k2">;</span></td></tr><tr><td class="number">116</td><td>&#160;</td></tr><tr><td class="number">117</td><td>  foo <span class="k3">=</span> x <span class="k3">+</span> y<span class="k2">;</span> <span class="c">/* Has no effect: just to avoid a warning */</span></td></tr><tr><td class="number">118</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="s">'q'</span> <span class="k3">=</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a> <span class="k3">|</span><span class="k3">|</span> <span class="s">'Q'</span> <span class="k3">=</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a> <span class="k3">|</span><span class="k3">|</span> <span class="n">27</span> <span class="k3">=</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span></td></tr><tr><td class="number">119</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a> <span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td><span class="k2">}</span></td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>&#160;</td></tr><tr><td class="number">123</td><td><span class="k1">int</span>    main <span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span></td></tr><tr><td class="number">124</td><td><span class="k2">{</span></td></tr><tr><td class="number">125</td><td>  <span class="c">/* Creation of the window */</span></td></tr><tr><td class="number">126</td><td>  glutInit <span class="k2">(</span><span class="k3">&amp;</span>argc, argv<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">127</td><td>  glutInitDisplayMode <span class="k2">(</span>GLUT_RGB <span class="k3">|</span> GLUT_DOUBLE <span class="k3">|</span> GLUT_DEPTH<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">128</td><td>  glutInitWindowSize <span class="k2">(</span><span class="n">500</span>, <span class="n">500</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">129</td><td>  glutCreateWindow <span class="k2">(</span><span class="s">"Render to texture"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">130</td><td>&#160;</td></tr><tr><td class="number">131</td><td>  <span class="c">/* OpenGL settings */</span></td></tr><tr><td class="number">132</td><td>  glEnable <span class="k2">(</span>GL_DEPTH_TEST<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">133</td><td>&#160;</td></tr><tr><td class="number">134</td><td>  <span class="c">/* Texture setting */</span></td></tr><tr><td class="number">135</td><td>  glEnable <span class="k2">(</span>GL_TEXTURE_2D<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">136</td><td>  glGenTextures <span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>texture_id<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>  glBindTexture <span class="k2">(</span>GL_TEXTURE_2D, texture_id<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">138</td><td>  glTexImage2D <span class="k2">(</span>GL_TEXTURE_2D, <span class="n">0</span>, GL_RGB, SIZE, SIZE, <span class="n">0</span>, GL_RGB,</td></tr><tr><td class="number">139</td><td>    GL_UNSIGNED_BYTE, texture<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">140</td><td>  glTexParameteri <span class="k2">(</span>GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>  glTexParameteri <span class="k2">(</span>GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>  glTexParameteri <span class="k2">(</span>GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">143</td><td>  glTexParameteri <span class="k2">(</span>GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">144</td><td>&#160;</td></tr><tr><td class="number">145</td><td>  <span class="c">/* Declaration of the callbacks */</span></td></tr><tr><td class="number">146</td><td>  glutDisplayFunc <span class="k2">(</span><span class="k3">&amp;</span>DisplayFunc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">147</td><td>  glutReshapeFunc <span class="k2">(</span><span class="k3">&amp;</span>ReshapeFunc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">148</td><td>  glutKeyboardFunc <span class="k2">(</span><span class="k3">&amp;</span>KeyboardFunc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">149</td><td>&#160;</td></tr><tr><td class="number">150</td><td>  <span class="c">/* Loop */</span></td></tr><tr><td class="number">151</td><td>  glutMainLoop <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">152</td><td>&#160;</td></tr><tr><td class="number">153</td><td>  <span class="c">/* Never reached */</span></td></tr><tr><td class="number">154</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">155</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Hope this helps!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Big)</author>
		<pubDate>Sat, 04 Mar 2006 19:18:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, don&#39;t know if its what you showed - I reprogrammed my program, that it draw the shadows, then copy it to a buffer texture, draw all my stuff and put the shadow texture on the level. Ok so far. All working fine.</p><p>BUT</p><p>my fps drops from 150 to 50 and when I use multiple sources (5 monsters that are casting shadows), the game is not playable - 4 fps.</p><p>My problem is, that I handle a lot of data</p><p>-------<br />- clear the video to zero<br />- copy video to shadows bitmap (I have an empty shadows)</p><p>for(each monster)<br />- clear video to light<br />- add shadows<br />- add previous shadow bitmap<br />end for</p><p>- clear video<br />- draw level stuff<br />- draw shadow bitmap<br />------------<br />in this way i have what I wanted - any object can cast light and the lights are ok when two monsters are close to each other, etc.</p><p>but erasing&amp;copying over and over the shadow bitmap (using blending) is not usable ..</p><p>So is there a way to draw directly to a texture ? <br />Or have I missunderstand your example ? <br />(I&#39;m really not skilled in open gl to read your code and be able to say what each of the commands are doing)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Pavel Hilser)</author>
		<pubDate>Sun, 05 Mar 2006 03:10:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry it took me so long to reply.<br />I was on a vacation.<br />Anyway, I don&#39;t really know what is the cause of your problem, but there are three options I can think of:<br />1. Your shadow method is slow, so it doesn&#39;t work well with many light sources and occluders<br />2. Your card is old, so render-to-texture is very slow<br />3. You misunderstood the example code and did something wrong</p><p>I won&#39;t be surprised if it&#39;s the third option, &#39;cause the example code is pretty bad.<br />I will try to clarify:</p><p>First you need to get a valid OpenGL ID for your framebuffer.<br />Put this where your program starts:</p><div class="source-code snippet"><div class="inner"><pre>GLuint framebuffer<span class="k2">;</span>
glGenFramebuffersEXT<span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>framebuffer<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then, in the main loop, you render your shadows on the texture:</p><div class="source-code snippet"><div class="inner"><pre>glBindFramebufferEXT<span class="k2">(</span>GL_FRAMEBUFFER_EXT, framebuffer<span class="k2">)</span><span class="k2">;</span>
glFramebufferTexture2DEXT<span class="k2">(</span>GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, your_lightmap, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
make_viewport_same_size_as_lightmap<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
draw_some_shadows<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Note that in the shadow-drawing function, you need to do everything you would usually do when you draw to the screen. (Clear the color buffer ect.)</p><p>Then, you need to switch back to the ordinary screen and draw your scene with the lightmaps.</p><div class="source-code snippet"><div class="inner"><pre>glBindFramebufferEXT<span class="k2">(</span>GL_FRAMEBUFFER_EXT, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
make_viewport_the_way_it_was<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/render_scene" target="_blank"><span class="a">render_scene</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

And one last thing, don&#39;t be surprised if your FPS is 150 with one lightsource and 50 with two.<br />FPS drops in a very non-linear way, so you can&#39;t really measure how good/bad the code you&#39;ve added is, (unless your FPS drops to 4... <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Big)</author>
		<pubDate>Tue, 07 Mar 2006 23:14:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>But beware that especially NVidia doesn&#39;t seem to like supporting framebuffer objects...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Wed, 08 Mar 2006 15:31:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
But beware that especially NVidia doesn&#39;t seem to like supporting framebuffer objects...
</p></div></div><p>
What gave you that impression? FBOs are fully supported on all GeForce FX, GeForce 6 and GeForce 7 series of GPUs.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Thu, 09 Mar 2006 06:51:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have a GeForce 5700 LE and they don&#39;t do me any trouble.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Big)</author>
		<pubDate>Thu, 09 Mar 2006 11:13:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Mr.Big: thanx for the explanation - I really missunderstood your code <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /><br />I&#39;ll try it the way you wrote, hope this will help (and my large-texture-moving will not be necessary anymore;)</p><p>(BTW I have 5700 too <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Pavel Hilser)</author>
		<pubDate>Thu, 09 Mar 2006 14:03:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What gave you that impression? FBOs are fully supported on all GeForce FX, GeForce 6 and GeForce 7 series of GPUs.
</p></div></div><p>
I read it from an another thread here. Buf if they are, that&#39;s great!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Thu, 09 Mar 2006 14:26:41 +0000</pubDate>
	</item>
</rss>
