Итак, я пытаюсь добавить эффект поворота и перспективы к изображению в вершинный шейдер.Вращение работает просто отлично, но я не могу сделать эффект перспективы.Я работаю в 2D.
Матрица вращения генерируется из кода, но матрица перспективы представляет собой набор жестко закодированных значений, которые я получил от GIMP с помощью инструмента перспективы.
private final Matrix3 perspectiveTransform = new Matrix3(new float[] {
0.58302f, -0.29001f, 103.0f,
-0.00753f, 0.01827f, 203.0f,
-0.00002f, -0.00115f, 1.0f
});
Эта матрица перспективы выполняла результатЯ хочу в GIMP, используя изображение 500x500.Затем я пытаюсь применить эту же матрицу к координатам текстуры.Вот почему я умножаю на 500 до и делю на 500 после.
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
uniform mat3 u_rotation;
uniform mat3 u_perspective;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
vec3 vec = vec3(a_texCoord0 * 500.0, 1.0);
vec = vec * u_perspective;
vec = vec3((vec.xy / vec.z) / 500.0, 0.0);
vec -= vec3(0.5, 0.5, 0.0);
vec = vec * u_rotation;
v_texCoords = vec.xy + vec2(0.5);
gl_Position = u_projTrans * a_position;
}
Для поворота я смещаю начало координат так, чтобы оно вращалось вокруг центра вместо верхнего левого угла.
Практически все, что я знаю об инструменте перспективы GIMP, взято из http://www.math.ubc.ca/~cass/graphics/manual/pdf/ch10.ps Это предполагало, что я смогу воспроизвести то, что делает GIMP после прочтения, но, оказывается, я не могу.Результат ничего не показывает (без пикселей), в то время как удаление части перспективы показывает правильное вращение изображения.
Как упоминалось в ссылке, я делю на vec.z
, чтобы преобразовать мои однородные координаты обратно в 2D точку.Я не использую смещение начала координат для преобразования перспективы, поскольку в ссылке упоминалось, что верхний левый угол использовался как источник.стр.11:
Есть одна вещь, о которой следует быть осторожным - начало координат GIMP находится слева вверху, причем y увеличивается вниз.
РЕДАКТИРОВАТЬ :
Благодаря ответу @ Rabbid76, теперь он что-то показывает!Однако, это не трансформирует мою текстуру, как матрица трансформировала мое изображение в GIMP.
Моя матрица преобразования в GIMP должна была делать что-то вроде этого:
Но вместо этого это выглядит примерно так:
Это то, что я думаю из того, что вижуот фактического результата:
https://imgur.com/X56rp8K ( Изображение используется)
(Как указывалось, это параметр текстуры - зажим к краю, а не зажим к границе, но это не относится к делу)
Похоже, что он делает прямо противоположное тому, что я ищу.Я попытался сместить начало координат в центр изображения и внизу слева, прежде чем применять матрицу безуспешно.Это новый результат, но это все та же проблема: как применить матрицу перспективы GIMP в шейдер GLSL?
EDIT2 :
С помощью дополнительного тестирования я могуПодтвердите, что он делает «обратное».Используя эту простую матрицу преобразования с уменьшением масштаба:
private final Matrix3 perspectiveTransform = new Matrix3(new float[] {
0.75f, 0f, 50f,
0f, 0.75f, 50f,
0f, 0f, 1.0f
});
В результате получается увеличенная версия изображения:
Если инвертироватьматрица программно, она работает для простой матрицы масштабирования!Но для матрицы перспективы это показывает, что:
https://imgur.com/v3TLe2d
EDIT3 :
Благодаря @ Rabbid76 снова получилось применить вращениепосле того, как матрица перспективы выполняет вращение раньше, и я получаю такой результат: https://imgur.com/n1vWq0M
Это почти все!Единственная проблема в том, что изображение ОЧЕНЬ сдавлено.Это как перспективная матрица применялась несколько раз.Но если вы посмотрите внимательно, вы можете увидеть, как он вращается в перспективе, как я хочу.Теперь проблема в том, как отговорить его, чтобы получить результат, как у меня в GIMP.(Основная проблема остается той же, как взять матрицу GIMP и применить ее в шейдере)