OpenGL ES 2.0: проблема умножения матриц - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь нарисовать четырехугольник, используя OpenGL ES 2.0. Мой вершинный шейдер выглядит так:

uniform mat4 mvp;
attribute vec4 position;
attribute vec4 color;
varying vec4 colorVarying;

void main()
{
    gl_Position = mvp * position;
    colorVarying = color;
}

Если я использую эти вершины:

-1.0f, -1.0f, 0.f, 1.f,
 1.0f, -1.0f, 0.f, 1.f,
-1.0f,  1.0f, 0.f, 1.f,
 1.0f,  1.0f, 0.f, 1.f

и эта матрица (в главном порядке столбцов, как и все следующие матрицы):

0.5,0,0,0,
0,  1,0,0,
0,  0,1,0,
0.5,0,0,1

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

0,    -1,     0,     1,
1,    -1,     0,     1,
0,     1,     0,     1,
1 ,    1,     0,     1,

и если я использую эти вершины и единичную матрицу, я получаю тот же результат. Таким образом, кажется, что умножение сделано правильно.

Теперь, если я умножу эти вершины (A):

-100.0f, -100.0f, 301.0f, 1.0f,
 100.0f, -100.0f, 301.0f, 1.0f,
-100.0f,  100.0f, 301.0f, 1.0f,
 100.0f,  100.0f, 301.0f, 1.0f,

по этой матрице (M):

0.4170         0         0         0
     0    0.5560         0         0
     0         0   -1.2220   -1.0000
     0         0  444.4440         0

Я получаю эти вершины (B):

 0.2075,    0.2766,   -0.9892,    1.0000
-0.2075,    0.2766,   -0.9892,    1.0000,
 0.2075,   -0.2766,   -0.9892,    1.0000,
-0.2075,   -0.2766,   -0.9892,    1.0000,

и если я передам своему шейдеру B-вершины и единичную матрицу, он отобразит маленький прямоугольник в середине окна просмотра. Но если я передам ему вершины A и матрицу M, то ничего не получится.

Что происходит?

Ответы [ 3 ]

0 голосов
/ 12 июля 2011

Проблема в том, что gl_Position после завершения вершинного шейдера проходит отсечение, где оно сравнивается с диапазоном [-WW] и отсечено (не рисуется), если gl_Position выходит за пределы этого диапазона.умножьте A * M и установите результат в gl_Position, затем, учитывая, что матрицы, которые вы используете, координату W будут равны -301, отрицательное число, которое будет инвертировать сравнение отсечения.

Попробуйте умножить матрицу M на -1 перед выполнением умножения, что должно дать те же результаты, что и умножение матрицы B на единичную матрицу.* ":

Избегайте использования отрицательных координат вершин w и отрицательных координат текстуры q.OpenGL может некорректно обрезать такие координаты и может делать ошибки интерполяции при затенении примитивов, определенных такими координатами.

0 голосов
/ 12 июля 2011

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

0.4170         0         0         0
     0    0.5560         0         0
     0         0    1.2220    1.0000
     0         0 -444.4440         0

Я также изменил знак столбца z (фактически строки, так как матрица транспонирована), чтобы держать -1 как близко и +1 как далеко по оси z.

0 голосов
/ 11 июля 2011

Используемая вами математическая библиотека может не использовать тот же порядок матриц, что и GLSL. Попробуйте перенести матрицу M перед передачей ее в шейдер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...