Судя по вашей жестко запрограммированной орто-матрице, похоже, что ваше происхождение находится в левом нижнем углу. Возможно ли, что вы указываете координаты, предполагая верхний левый угол? Re: glOrtho, вы можете попробовать это в обычном проекте GL, или поверьте мне на слово :)

роблема в том, что у меня есть (рабочая) пара ортогональных вершинных и фрагментных шейдеров, которые позволяют мне указывать центральные X и Y спрайта через передаваемые формы 'translateX' и 'translateY'. Я умножаю на матрицу projectionMatrix, которая жестко закодирована и работает отлично. Все работает, насколько орфографическая операция. Моя входящая геометрия для этого шейдера основана на 0, 0, 0 в качестве его центральной точки.

Теперь я хочу выяснить, какой будет эта центральная точка (0, 0, 0 в локальном координатном пространстве) после перевода. Мне нужно знать эту информацию во фрагментном шейдере. Я предположил, что я могу создать вектор в 0, 0, 0 и затем применить те же переводы. Однако я НЕ получаю правильный ответ.

Мой вопрос: что я делаю не так, и как я могу даже отладить, что происходит? Я знаю, что вычисляемое значение должно быть неверным, но я не понимаю, что это такое. (Моя платформа - Xcode 4.2 на OS X, разрабатываемая для OpenGL ES 2.0 iOS)

Вот мой вершинный шейдер:

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

РЕДАКТИРОВАТЬ: В ответ на неправильную орфографическую матрицу, вот чтовикипедия должен сказать об орто-проекциях, и мой -1 выглядит правильно. потому что в моем случае, например, 4-й элемент моего мата должен быть - ((правый + левый) / (правый левый)) справа от 960 слева от 0, поэтому -1 * (960/960) это -1 ,

РЕДАКТИРОВАТЬ: Я, возможно, обнаружил корень проблемы здесь -что ты думаешь?

Ответы на вопрос(2)

Ваш ответ на вопрос