¿Por qué este sombreador de vértices ortográficos no produce la respuesta correcta?

Mi problema es que tengo un par de sombreadores de fragmentos y vértices ortográficos (de trabajo) que me permiten especificar el centro X e Y de un sprite a través de los uniformes 'translateX' y 'translateY' que se pasan. Multiplico por una matriz de proyección codificada y funciona muy bien Todo funciona tan lejos como la operación ortográfica. Mi geometría entrante para este sombreador se basa en 0, 0, 0 como su punto central.

Ahora quiero averiguar en qué se convierte ese punto central (0, 0, 0 en el espacio de coordenadas local) después de las traducciones. Necesito saber esta información en el fragment shader. Supuse que puedo crear un vector en 0, 0, 0 y luego aplicar las mismas traducciones. Sin embargo, NO obtengo la respuesta correcta.

Mi pregunta: ¿qué estoy haciendo mal y cómo puedo depurar lo que está pasando? Sé que el valor que se calcula debe ser incorrecto, pero no tengo idea de qué es. (Mi plataforma es Xcode 4.2 en desarrollo de OS X para OpenGL ES 2.0 iOS)

Aquí está mi sombreador de vértices:

// 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);
}

EDITAR En respuesta a que mi matriz ortográfica está equivocada, lo siguiente es lo que wikipedia tiene que decir sobre las proyecciones de orto, y mi -1 se ve bien. porque en mi caso, por ejemplo, el cuarto elemento de mi tapete debería ser - ((derecha + izquierda) / (derecha-izquierda)) que está a la derecha de 960 a la izquierda de 0, entonces -1 * (960/960) que es -1 .

EDITAR Posiblemente descubrí el problema raíz aquí -¿Qué piensas