GLSL Shader - Как рассчитать высоту текстуры?
В этом вопросе я спросил, как создать "зеркальную" текстуру, и теперь я хочу переместить это "зеркальное" изображение вниз по оси Y на высоту изображения. Я пробовал что-то вроде этого с разными значениями высоты, но я не могу найти правильное решение:
// Vertex Shader
uniform highp mat4 u_modelViewMatrix;
uniform highp mat4 u_projectionMatrix;
attribute highp vec4 a_position;
attribute lowp vec4 a_color;
attribute highp vec2 a_texcoord;
varying lowp vec4 v_color;
varying highp vec2 v_texCoord;
void main()
{
highp vec4 pos = a_position;
pos.y = pos.y - HEIGHT;
gl_Position = (u_projectionMatrix * u_modelViewMatrix) * pos;
v_color = a_color;
v_texCoord = vec2(a_texcoord.x, 1.0 - a_texcoord.y);
}
2 ответа
То, что вы на самом деле изменяете в своем фрагменте кода, это позиция Y ваших вершин... это, безусловно, не то, что вы хотите сделать.
a_position - ваша позиция в пространстве модели; система координат, которая центрирована вокруг вашего четырехугольника (я предполагаю, что вы используете четырехугольник для отображения текстуры).
Если вместо этого вы внесете изменения в экранное пространство, вы сможете перемещать изображение вверх и вниз и т. Д., Поэтому измените значение gl_Position:
((u_projectionMatrix * u_modelViewMatrix) * pos + Vec4(0,HEIGHT,0,0))
Обратите внимание, что тогда вы будете в пространстве экрана; так что проверьте размеры вашего окна просмотра.
Наконец, лучший способ добиться желаемого эффекта - использовать поворотную матрицу для переворачивания и наклона изображения.
Затем вы должны объединить эту матрицу с поворотом изображения (объединить его с матрицей просмотра модели).
Вы можете либо умножить матрицы моделей на проекцию вида на CPU:
original_mdl_mat = ...;
rotated_mdl_mat = Matrix.CreateTranslation(0, -image.Height, 0) * Matrix.CreateRotationY(180) * original_mdl_mat;
mvm_original_mat = Projection * View * original_mdl_mat;
mvm_rotated_mat = Projection * View * rotated_mdl_mat;
или на GPU:
uniform highp mat4 u_model;
uniform highp mat4 u_viewMatrix;
uniform highp mat4 u_projectionMatrix;
gl_Position = (u_projectionMatrix * u_model * u_viewMatrix) * pos;
Координаты переданы в texture2D
всегда выбирайте источник в диапазоне [0, 1) по обеим осям, независимо от исходного размера текстуры и соотношения сторон. Таким образом, ответ коленного сустава в том, что высота текстуры всегда равна 1,0.
Если вы хотите узнать высоту исходного изображения, содержащего текстуру в пикселях, то вам нужно будет указать это самостоятельно - вероятно, как единое целое - так как оно не отображается иным образом.