Что не так с этим шейдером для эффекта центрированного масштабирования в ортографической проекции? - PullRequest
1 голос
/ 10 июля 2011

Я создал базовый ортографический шейдер, который отображает спрайты из текстур. Отлично работает.

Я добавил коэффициент масштабирования, чтобы спрайт масштабировался, становясь больше или меньше. Предполагая, что текстура привязана к источнику в «левом нижнем углу», она сжимается к этой исходной точке или расширяется от нее к верхнему правому углу. То, что я на самом деле хочу, это уменьшить или расширить «на месте», чтобы оставаться в центре.

Итак, один из способов достижения этого - определить, сколько пикселей я сожму или увеличу и компенсирую. Я не совсем уверен, как бы я это сделал, и я также знаю , что это не лучший способ. Я дурачился с порядком своих переводов и масштабированием, думая, что могу сначала масштабировать, а затем размещать, но я просто получаю различные плохие результаты. Я не могу обернуться, чтобы решить проблему.

Вот мой шейдер:


// Set up orthographic projection (960 x 640)
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;

    // Apply our (pre-computed) zoom factor to the X and Y of our matrix
    projectionMatrix[0][0] *= zoomFactorX;
    projectionMatrix[1][1] *= zoomFactorY;

    // Translate
    gl_Position *= projectionMatrix;

    // Pass right along to the frag shader
    v_texCoord = a_texCoord;
}

1 Ответ

1 голос
/ 10 июля 2011
mat4 projectionMatrix =

Матрицы в GLSL построены по столбцам. Для mat4 первые 4 значения - это первый столбец, затем следующие 4 значения - второй столбец и т. Д.

Вы транспонировали свою матрицу.

Кроме того, для чего эти -1?

В остальном вопрос масштабирования - это не то, с чем должна работать матрица projection . Не тот тип масштабирования, о котором вы говорите. Шкалы должны быть применены к позициям до того, как вы умножите их на матрицу проекции. Как и для 3D-объектов.

Вы не опубликовали, каковы данные вершин вашего спрайта, так что нет никакого способа узнать наверняка. Но способ, которым должен работать, заключается в том, что позиции вершин для спрайта должны быть центрированы в центре спрайта (где вы его и определяете).

Так, если у вас есть спрайт 16x24, и вы хотите, чтобы центр спрайта был смещен на 8 пикселей вправо и на 8 пикселей вверх, то ваш прямоугольник спрайта должен быть от (-8, -8) до (8, 16) ( из нижней левой системы координат).

Затем, если вы масштабируете его, он будет масштабироваться вокруг центра системы координат спрайта.

...