<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Misbehaving transformations</title>
		<link>http://www.allegro.cc/forums/view/616687</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 17 Jan 2017 22:00:30 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been working on a small project of my own for some time now, and have started the process of drawing things to the screen. I&#39;ve set up an OpenGL 3 environment with Allegro 5.2.1.1. All that is working about as expected.</p><p>The problem lies with my transformations. For some unknown reason, I seem to be unable to translate my objects individually. They all render with the exact same transformation, and I just can&#39;t figure out why this is happening.</p><p>For my test scene, I&#39;ve made three simple structures and attempted to render them using three different transformations. This was the result:<br /><a href="http://imgur.com/a/ebLnw">http://imgur.com/a/ebLnw</a><br />The result I want, is this:<br /><a href="http://imgur.com/a/SvbEf">http://imgur.com/a/SvbEf</a></p><p>The code I used to render this scene is the following:
</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="k1">auto</span> helper <span class="k3">=</span> hen::Core::getRenderHelper<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span>  <span class="k1">if</span> <span class="k2">(</span>m_program <span class="k3">!</span><span class="k3">=</span> nullptr<span class="k2">)</span>
<span class="number">  4</span>    m_program-&gt;bind<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>  helper-&gt;setProjection<span class="k2">(</span><span class="n">45</span>.<span class="n">0f</span>, <span class="n">0</span>.<span class="n">1f</span>, <span class="n">1000</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  helper-&gt;setView<span class="k2">(</span>m_pos, glm::vec3<span class="k2">{</span><span class="k2">}</span>, glm::vec3<span class="k2">{</span> <span class="n">0</span>.<span class="n">0f</span>, <span class="n">0</span>.<span class="n">0f</span>, <span class="n">1</span>.<span class="n">0f</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">const</span> <span class="k1">auto</span><span class="k3">&amp;</span> chunk <span class="k2">:</span> m_chunks<span class="k2">)</span>
<span class="number"> 10</span>  <span class="k2">{</span>
<span class="number"> 11</span>    helper-&gt;pushMatrix<span class="k2">(</span>glm::translate<span class="k2">(</span>glm::mat4<span class="k2">{</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k2">}</span>, glm::vec3<span class="k2">{</span> Chunk::SIZE <span class="k3">*</span> chunk.second-&gt;getPosition<span class="k2">(</span><span class="k2">)</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    chunk.second-&gt;render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    helper-&gt;popMatrix<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>  <span class="k2">}</span>
</div></div><p>
The chunk render() method only renders the VBO associated with said chunk, which is the following:
</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">  5</span><span class="k1">void</span> hen::render::VBOBase::render<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>  glBindBuffer<span class="k2">(</span>GL_ARRAY_BUFFER, m_vertexBuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  glBindBuffer<span class="k2">(</span>GL_ELEMENT_ARRAY_BUFFER, m_indiceBuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">const</span> <span class="k1">auto</span><span class="k3">&amp;</span> attribute <span class="k2">:</span> m_attributes<span class="k2">)</span>
<span class="number"> 11</span>  <span class="k2">{</span>
<span class="number"> 12</span>    glEnableVertexAttribArray<span class="k2">(</span>attribute.m_index<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    glVertexAttribPointer<span class="k2">(</span>attribute.m_index, attribute.m_count, attribute.m_format, GL_FALSE, m_vertexSize, <span class="k2">(</span><span class="k1">const</span> GLvoid<span class="k3">*</span><span class="k2">)</span>attribute.m_offset<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>  <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  glDrawElements<span class="k2">(</span>m_renderMode, m_indiceCount, GL_UNSIGNED_INT, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">const</span> <span class="k1">auto</span><span class="k3">&amp;</span> attribute <span class="k2">:</span> m_attributes<span class="k2">)</span>
<span class="number"> 19</span>    glDisableVertexAttribArray<span class="k2">(</span>attribute.m_index<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>  glBindBuffer<span class="k2">(</span>GL_ARRAY_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>  glBindBuffer<span class="k2">(</span>GL_ELEMENT_ARRAY_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span><span class="k2">}</span>
</div></div><p>

Oddly enough, the desired result was obtained, albeit flickering, if I added an al_flip_display() inside the loop. It seems that only the first series of transformations pushed in with pushMatrix counts when flipping the display. Even weirder, any transformations applied, apply to <i>all</i> objects as long as they aren&#39;t popped before rendering the <i>first</i> object. Once one object has been drawn, any subsequent transformations are ignored. This really doesn&#39;t make <i>any</i> sense...</p><p>The push/popMatrix methods are as following:
</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">  2</span><span class="k1">void</span> hen::render::RenderHelper::pushMatrix<span class="k2">(</span><span class="k1">const</span> glm::mat4<span class="k3">&amp;</span> matrix<span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>  <span class="k1">if</span> <span class="k2">(</span>m_matrices.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  5</span>    m_matrices.push<span class="k2">(</span>matrix<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  <span class="k1">else</span>
<span class="number">  7</span>    m_matrices.push<span class="k2">(</span>m_matrices.top<span class="k2">(</span><span class="k2">)</span> <span class="k3">*</span> matrix<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <span class="k1">auto</span> block <span class="k3">=</span> Core::getUniformBlockManager<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get<span class="k2">(</span><span class="s">"Matrix"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>  <span class="k1">if</span> <span class="k2">(</span>block <span class="k3">!</span><span class="k3">=</span> nullptr<span class="k2">)</span>
<span class="number"> 11</span>    block-&gt;set<span class="k3">&lt;</span>glm::mat4&gt;<span class="k2">(</span><span class="s">"model"</span>, m_matrices.top<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span><span class="k2">}</span>
<span class="number"> 13</span><span class="k1">void</span> hen::render::RenderHelper::popMatrix<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>  <span class="k1">if</span> <span class="k2">(</span>m_matrices.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 16</span>    m_matrices.pop<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>  <span class="k1">auto</span> block <span class="k3">=</span> Core::getUniformBlockManager<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get<span class="k2">(</span><span class="s">"Matrix"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>  <span class="k1">if</span> <span class="k2">(</span>block <span class="k3">!</span><span class="k3">=</span> nullptr<span class="k2">)</span>
<span class="number"> 20</span>    block-&gt;set<span class="k3">&lt;</span>glm::mat4&gt;<span class="k2">(</span><span class="s">"model"</span>, m_matrices.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> ? glm::mat4<span class="k2">{</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k2">}</span> <span class="k2">:</span> m_matrices.top<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>
The RenderHelper::setView and setProjection methods sends the data to the GPU in the same manner as push/popMatrix, using uniform blocks.</p><p>Creating and updating the uniform block:
</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">  4</span>  glGenBuffers<span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>m_handle<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>  ...
<span class="number">  6</span>  glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, m_handle<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  glBufferData<span class="k2">(</span>GL_UNIFORM_BUFFER, m_size, nullptr, GL_STATIC_DRAW<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">typename</span> T&gt;
<span class="number"> 12</span><span class="k1">bool</span> hen::render::UniformBlock::set<span class="k2">(</span><span class="k1">const</span> std::string<span class="k3">&amp;</span> name, <span class="k1">const</span> T<span class="k3">&amp;</span> value<span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 13</span><span class="k2">{</span>
<span class="number"> 14</span>  ...
<span class="number"> 15</span>  glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, m_handle<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>  glBufferSubData<span class="k2">(</span>GL_UNIFORM_BUFFER, getOffset<span class="k2">(</span>name<span class="k2">)</span>, <span class="k1">sizeof</span><span class="k2">(</span>T<span class="k2">)</span>, <span class="k2">(</span>GLvoid<span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>value<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>  glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>

My vertex and fragment shader are as following:
</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">  3</span>Vertex shader:
<span class="number">  4</span><span class="p">#version 330 core</span>
<span class="number">  5</span>
<span class="number">  6</span>layout <span class="k2">(</span>std140<span class="k2">)</span> uniform Matrix
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>  mat4 projection<span class="k2">;</span>
<span class="number">  9</span>  mat4 view<span class="k2">;</span>
<span class="number"> 10</span>  mat4 model<span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span> matrices<span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>layout<span class="k2">(</span>location <span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> in vec3 inPosition<span class="k2">;</span>
<span class="number"> 14</span>layout<span class="k2">(</span>location <span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> in vec3 inNormal<span class="k2">;</span>
<span class="number"> 15</span>layout<span class="k2">(</span>location <span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> in vec2 inUV<span class="k2">;</span>
<span class="number"> 16</span>layout<span class="k2">(</span>location <span class="k3">=</span> <span class="n">3</span><span class="k2">)</span> in vec4 inColor<span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>out VertexData
<span class="number"> 19</span><span class="k2">{</span>
<span class="number"> 20</span>  vec3 normal<span class="k2">;</span>
<span class="number"> 21</span>  vec2 uv<span class="k2">;</span>
<span class="number"> 22</span>  vec4 color<span class="k2">;</span>
<span class="number"> 23</span><span class="k2">}</span> vertex<span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 26</span><span class="k2">{</span>
<span class="number"> 27</span>  gl_Position <span class="k3">=</span> matrices.projection <span class="k3">*</span> matrices.view <span class="k3">*</span> matrices.model <span class="k3">*</span> vec4<span class="k2">(</span>inPosition, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>  
<span class="number"> 29</span>  vertex.normal <span class="k3">=</span> <span class="k2">(</span>matrices.model <span class="k3">*</span> vec4<span class="k2">(</span>inNormal, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span>.xyz<span class="k2">;</span>
<span class="number"> 30</span>  vertex.uv <span class="k3">=</span> inUV<span class="k2">;</span>
<span class="number"> 31</span>  vertex.color <span class="k3">=</span> inColor<span class="k2">;</span>
<span class="number"> 32</span><span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>Fragment shader:
<span class="number"> 35</span><span class="p">#version 330 core</span>
<span class="number"> 36</span>
<span class="number"> 37</span>in VertexData
<span class="number"> 38</span><span class="k2">{</span>
<span class="number"> 39</span>  vec3 normal<span class="k2">;</span>
<span class="number"> 40</span>  vec2 uv<span class="k2">;</span>
<span class="number"> 41</span>  vec4 color<span class="k2">;</span>
<span class="number"> 42</span><span class="k2">}</span> vertex<span class="k2">;</span>
<span class="number"> 43</span>
<span class="number"> 44</span>out vec4 fragment<span class="k2">;</span>
<span class="number"> 45</span>
<span class="number"> 46</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 47</span><span class="k2">{</span>
<span class="number"> 48</span>  fragment <span class="k3">=</span> vec4<span class="k2">(</span>vertex.color.xyz, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span><span class="k2">}</span>
</div></div><p>

I know that my shaders are working, and the transformations are working to some degree. I&#39;m able to rotate/scale/translate all the objects in bulk with constant transformations, even apply multiple transformations in a row.</p><p>I&#39;ve stared at this issue for quite some time now, and I just can&#39;t figure out how to fix this, can&#39;t even figure out what is going on here... :/<br />Any help would be highly appreciated!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Hepolite)</author>
		<pubDate>Sat, 14 Jan 2017 21:35:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have an idea or two. Allegro keeps transformations per-bitmap. If you change the target bitmap, you change the transformations.</p><p>What does this set of code do?
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616687/1027702#target">Hepolite</a> said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">typename</span> T&gt; 
<span class="k1">bool</span> hen::render::UniformBlock::set<span class="k2">(</span><span class="k1">const</span> std::string<span class="k3">&amp;</span> name, <span class="k1">const</span> T<span class="k3">&amp;</span> value<span class="k2">)</span> <span class="k1">const</span> <span class="k2">{</span>
   ... 
   glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, m_handle<span class="k2">)</span><span class="k2">;</span> 
   glBufferSubData<span class="k2">(</span>GL_UNIFORM_BUFFER, getOffset<span class="k2">(</span>name<span class="k2">)</span>, <span class="k1">sizeof</span><span class="k2">(</span>T<span class="k2">)</span>, <span class="k2">(</span>GLvoid<span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>value<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span> 
   glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span> 
<span class="k2">}</span>
</pre></div></div><p>
</p></div></div><p>

I don&#39;t see where you are actually setting the transformations anywhere, either with OpenGL, or with Allegro.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 15 Jan 2017 23:59:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Run your program through apitrace. Then diagnose uniform block binding values at the time of the draw call via qapitrace. Look at the draw calls prior to try and isolate the problem. For example:</p><p><span class="remote-thumbnail"><span class="json">{"name":"610758","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/3\/c\/3cb2683895729b1ea60991bcddd5021b.png","w":977,"h":785,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/3\/c\/3cb2683895729b1ea60991bcddd5021b"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/3/c/3cb2683895729b1ea60991bcddd5021b-240.jpg" alt="610758" width="240" height="192" /></span></p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616687/1027750#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>  I don&#39;t see where you are actually setting the transformations anywhere, either with OpenGL, or with Allegro. </p></div></div><p>He is using uniform block buffers. It&#39;s an OpenGL 3+ feature. See <a href="https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object">https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Erin Maus)</author>
		<pubDate>Mon, 16 Jan 2017 03:19:50 +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/616687/1027750#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>
What does this set of code do?<br />&lt;snip&gt;<br />I don&#39;t see where you are actually setting the transformations anywhere, either with OpenGL, or with Allegro.
</p></div></div><p>
The code you highlighted here is the code that passes the transformations to the shaders. pushMatrix invoke the &quot;set&quot; method, which uploads the matrix data.</p><div class="quote_container"><div class="title">Edgar Reynaldo said:</div><div class="quote"><p>
I have an idea or two. Allegro keeps transformations per-bitmap. If you change the target bitmap, you change the transformations.
</p></div></div><p>
The only time this would be relevant would be during al_flip_display, if my understanding is correct. I don&#39;t modify the target bitmap in any location elsewhere. That said, though, using al_flip_display more than once per frame does yield some weird results. If used once per object, the transformation actually <i>does</i> work <i>exactly as expected</i>. Of course, this solution is utterly unacceptable for obvious reasons.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616687/1027752#target">Aaron Bolyard</a> said:</div><div class="quote"><p>
Run your program through apitrace. Then diagnose uniform block binding values at the time of the draw call via qapitrace. Look at the draw calls prior to try and isolate the problem. For example:
</p></div></div><p>
I&#39;ve been unable to get apitrace and apply that to my program. I&#39;ve used glGetBufferSubData, however, to verify that the shader has the correct model matrix before rendering the objects. If the matrix was corrupted in some form, then I likely wouldn&#39;t be able to apply any transformations at all (including the view and projection matrix), which is not the case. From visual inspection, it is clear that the view and projection matrix (which use the very same method to upload data) are working.</p><p>My rendering code is very simple at the moment. It consists of only this code here:
</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>  Initializing:
<span class="number">  2</span>  glGenVertexArrays<span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>m_vao<span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>  glBindVertexArray<span class="k2">(</span>m_vao<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  Render loop:
<span class="number">  6</span>  glClearColor<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span>, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">1</span>.<span class="n">0f</span>, <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  glClearDepth<span class="k2">(</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  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>
<span class="number">  9</span>
<span class="number"> 10</span>  <span class="k2">[</span>render code given in the first post, first block of code<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>
There aren&#39;t many places the problem can hide, it would seem.</p><p>From everything I have tried, only al_flip_display seem to yield some interesting behavior. Is it possible that glDrawElements does nothing before al_flip_display is invoked? I cannot think of anything else that would explain the behavior my program is currently displaying.</p><p>EDIT:<br />In testing, I have discovered something even stranger. When I leave my rendering to only render the objects, the transformations does not apply on a per-object basis. If I introduce some more code, however...
</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">  2</span><span class="k1">for</span> <span class="k2">(</span><span class="k1">const</span> <span class="k1">auto</span><span class="k3">&amp;</span> chunk <span class="k2">:</span> m_chunks<span class="k2">)</span>
<span class="number">  3</span>  <span class="k2">{</span>
<span class="number">  4</span>    helper-&gt;pushMatrix<span class="k2">(</span>glm::translate<span class="k2">(</span>glm::mat4<span class="k2">{</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k2">}</span>, glm::vec3<span class="k2">{</span> Chunk::SIZE <span class="k3">*</span> chunk.second-&gt;getPosition<span class="k2">(</span><span class="k2">)</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    
<span class="number">  6</span>    glm::mat4 data<span class="k2">;</span>
<span class="number">  7</span>    glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, block-&gt;getHandle<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    glGetBufferSubData<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">128</span>, <span class="k1">sizeof</span><span class="k2">(</span>data<span class="k2">)</span>, <span class="k3">&amp;</span>data<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Nasty hardcoded offset to grab model matrix</span>
<span class="number">  9</span>    glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    chunk.second-&gt;render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    helper-&gt;popMatrix<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>  <span class="k2">}</span>
</div></div><p>
This actually works. I have no idea why, but if I leave these four additional lines in, the transformations actually works just as expected. If I try to remove either of two first gl calls, the transformations stop working again. If I remove glBindBuffer(..., 0), it still works. But if I remove glGetBufferSubData, it doesn&#39;t work. Just... what?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Hepolite)</author>
		<pubDate>Mon, 16 Jan 2017 22:13:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Which for lines are you specifically talking about? You&#39;ve got for in a row in the middle, but it seems like you&#39;re refering to the last four.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 17 Jan 2017 04:50:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was referring to these lines:
</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>glm::mat4 data<span class="k2">;</span>
<span class="number"> 2</span>glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, block-&gt;getHandle<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span>glGetBufferSubData<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">128</span>, <span class="k1">sizeof</span><span class="k2">(</span>data<span class="k2">)</span>, <span class="k3">&amp;</span>data<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 4</span>glBindBuffer<span class="k2">(</span>GL_UNIFORM_BUFFER, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>
It doesn&#39;t make much sense that this somehow prevents the problem from occuring. These lines shouldn&#39;t alter the render state in any meaningful way.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Hepolite)</author>
		<pubDate>Tue, 17 Jan 2017 15:39:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Check for OpenGL errors with glGetError. In this case, start with the glBufferSubData call I&#39;d say then expand to others.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616687/1027785#target">Hepolite</a> said:</div><div class="quote"><p>These lines shouldn&#39;t alter the render state in any meaningful way.</p></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>If any rendering in the pipeline makes reference to data in the buffer object being updated by glBufferSubData, especially from the specific region being updated, that rendering must drain from the pipeline before the data store can be updated. </p></div></div><p>

Since you are referencing the same buffer you update earlier, you are indeed forcing a pipeline drain. Which is the same thing that otherwise only happens when you call al_flip_display. It looks a lot like <b>somewhere</b> some buffer related operation fails and you are therefore overwriting the transformation. That&#39;s why I think you need to check for errors on all the buffer related operations.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 17 Jan 2017 21:15:28 +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/616687/1027769#target">Hepolite</a> said:</div><div class="quote"><p> I&#39;ve been unable to get apitrace and apply that to my program.</p></div></div><p>What operating system are you using? Latest apitrace (from git) works fine on FreeBSD (and by extension Linux I suppose) with my Allegro program (screenshot I posted has trace from there). I only use Allegro for input, display management, and OpenGL extension grabbing with an OpenGL 3+ forward-compatible context. apitrace is an invaluable tool when debugging OpenGL rendering.</p><p>Per Elias&#39;s suggestion, apitrace will also help catching OpenGL usage errors.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Erin Maus)</author>
		<pubDate>Tue, 17 Jan 2017 21:20:13 +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/616687/1027794#target">Elias</a> said:</div><div class="quote"><p>
It looks a lot like somewhere some buffer related operation fails and you are therefore overwriting the transformation. That&#39;s why I think you need to check for errors on all the buffer related operations.
</p></div></div><p>
THIS.^^</p><p><b>Anytime</b> you have code that magically fixes due to an unrelated change? </p><p>Try making a different change, and check all pointers, buffers, arrays, etc. What is often the case when &quot;unrelated change causes fix&quot; is an memory bound overrun. Something is clobbering the stack, or an array, or something else, but because it&#39;s still in YOUR PROGRAM&#39;S memory--it doesn&#39;t crash. So the &quot;fix&quot; is moving your code and data in memory slightly and merely pushing the error somewhere else that you don&#39;t see it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 17 Jan 2017 22:00:30 +0000</pubDate>
	</item>
</rss>
