title: Why isn't this orthographic vertex shader producing the correct answer?
body: <p>My issue is that I have a (working) orthographic vertex and fragment shader pair that allow me to specify center X and Y of a sprite via 'translateX' and 'translateY' uniforms being passed in.  I multiply by a projectionMatrix that is hardcoded and works great.  Everything works as far as orthographic operation.  My incoming geometry to this shader is based around 0, 0, 0 as its center point.</p>
  
  <p>I want to now figure out what that center point (0, 0, 0 in local coordinate space) becomes after the translations. I need to know this information in the fragment shader.  I assumed that I can create a vector at 0, 0, 0 and then apply the same translations.  However, I'm NOT getting the correct answer.</p>
  
  <p>My question: what I am I doing wrong, and how can I even debug what's going on?  I know that the value being computed must be wrong, but I have no insight in to what it is. (My platform is Xcode 4.2 on OS X developing for OpenGL ES 2.0 iOS)</p>
  
  <p>Here's my vertex shader:</p>
  
  <pre><code>// Vertex Shader for pixel-accurate rendering
  attribute vec4 a_position;
  attribute vec2 a_texCoord;
  
  varying vec2 v_texCoord;
  
  uniform float translateX;
  uniform float translateY;
  
  // Set up orthographic projection 
  // this is for 640 x 960
  mat4 projectionMatrix = mat4( 2.0/960.0, 0.0, 0.0, -1.0,
                               0.0, 2.0/640.0, 0.0, -1.0,
                               0.0, 0.0, -1.0, 0.0,
                               0.0, 0.0, 0.0, 1.0);                        
  
  void main()
  {
      // Set position
      gl_Position = a_position;
  
      // Translate by the uniforms for offsetting
      gl_Position.x += translateX;
      gl_Position.y += translateY;
  
      // Translate
      gl_Position *= projectionMatrix;
  
  
      // Do all the same translations to a vector with origin at 0,0,0
      vec4 toPass = vec4(0, 0, 0, 1); // initialize.  doesn't matter if w is 1 or 0
      toPass.x += translateX;
      toPass.y += translateY;
      toPass *= projectionMatrix;
  
      // this SHOULD pass the computed value to my fragment shader.
      // unfortunately,  whatever value is sent, isn't right.
      //v_translatedOrigin = toPass;
  
      // instead, I use this as a workaround, since I do know the correct values for my
      // situation.  of course this is hardcoded and is terrible.
      v_translatedOrigin = vec4(500.0, 200.0, 0.0, 0.0);
  }
  </code></pre>
  
  <p><strong>EDIT:</strong> In response to my orthographic matrix being wrong, the following is what <a href="http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29" rel="nofollow noreferrer">wikipedia</a> has to say about ortho projections, and my -1's look right.  because in my case for example the 4th element of my mat should be -((right+left)/(right-left)) which is right of 960 left of 0, so -1 * (960/960) which is -1.</p>
  
  <p><strong>EDIT:</strong> I've possibly uncovered the root issue here - <a href="https://stackoverflow.com/questions/7101922/possible-retina-issue-with-opengl-es-on-iphone">what do you think?</a></p>
  
  <p><img src="https://i.stack.imgur.com/anbPL.png" alt="enter image description here"></p>