Как мне реализовать два перевода и операцию масштабирования в GLSL? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь реализовать следующее преобразование.

Мои исходные координаты мирового пространства (2D) x=1586266800 и y=11812

Я хочу:

  1. bottom left corner изображения OpenGL для представления координат (1586266800, 11800)
  2. top right corner изображения OpenGL для представления координат (1586267400, 11900)

Для того, чтобы сделать что я планирую объединить три матрицы преобразования:

  1. Перевести на начало координат x=1586266800 и y=11800
  2. Масштаб, чтобы иметь ширину 600 и высоту 100
  3. Переведите еще раз -1.0f and -1.0f, чтобы центр OpenGL находился внизу слева.

Я использую следующие матрицы преобразования:

Translation Matrix:

| 1 0 0 tx |
| 0 1 0 ty |
| 0 0 1 tz |
| 0 0 0 1  |

Scale Matrix:

| sx  0  0  0 |
|  0 sy  0  0 |
|  0  0 sz  0 |
|  0  0  0  1 |

В Octave я могу реализовать преобразование следующим образом, умножив три матрицы:

>> candle
candle =
  1586266800
       11812
           0
           1
>> translation1
translation1 =
    1   0   0   -1586266800
    0   1   0        -11800
    0   0   1             0
    0   0   0             1

>> scale
scale =
   0.00333333333333333      0   0   0
                     0   0.02   0   0
                     0      0   1   0
                     0      0   0   1

(where `0.0033333 = 2/600` and `0.02 = 2/100`)

>> translation2
translation2 =
    1   0   0   -1
    0   1   0   -1
    0   0   1    0
    0   0   0    1

>> translation2*scale*translation1*candle
ans =

                    -1
    -0.759999999999991
                     0
                     1

, которая переводит точку в нужное место на экране -1.0f,1.0f OpenGL.

Теперь я пытаюсь повторить это в моем шейдере Geometry, который получает оригинальный мир-пространство динаты из вершинного шейдера.

Я пробовал это:

#version 330 core

layout (points) in;
layout (line_strip, max_vertices = 12) out;

in uint gs_in_y[];
in uint gs_in_x[];

uniform uint xOrigin;
uniform uint xScaleWidth;
uniform uint yOrigin;
uniform uint yScaleWidth;

void main()
{

    // TRANSLATION MATRIX
    // [ 1 0 0 tx ]
    // [ 0 1 0 ty ]
    // [ 0 0 1 tz ]
    // [ 0 0 0 1  ]
    // mat3 m = mat3(
    //  1.1, 2.1, 3.1, // first column (not row!)
    //  1.2, 2.2, 3.2, // second column
    //  1.3, 2.3, 3.3  // third column
    //  );
    mat4 translation = mat4(
        1.0f, 0, 0, -xOrigin,
        0, 1.0f, 0, -yOrigin,
        0, 0, 1.0f, 0,
        0, 0, 0, 1.0f
    );


    // SCALE MATRIX
    // [ sx  0  0  0 ]
    // [  0 sy  0  0 ]
    // [  0  0 sz  0 ]
    // [  0  0  0  1 ]
    mat4 scale = mat4(
        2.0/xScaleWidth, 0, 0, 0,
        0, 2.0f/yScaleWidth, 0, 0,
         0,  0, 1.0f,  0,
         0,  0,  0,  1.0f
    );

    // FINAL TRANSLATION
    mat4 translationGl = mat4(
        1.0f,      0,    0,   -1.0f,
           0,   1.0f,    0,   -1.0f,
           0,      0, 1.0f,   0,
           0,      0,    0,   1.0f
    );

    gl_Position = translationGl * scale * translation * vec4(gs_in_x[0], gs_in_y[0], 0.0, 1.0);
    EmitVertex();    
    gl_Position = translationGl * scale * translation * vec4(gs_in_x[0]+30, gs_in_y[0], 0.0, 1.0); 
    EmitVertex();    
    EndPrimitive();

}
...