GLSL Shader - Как рассчитать высоту текстуры? - PullRequest
0 голосов
/ 06 марта 2012

В этом вопросе я задал вопрос о том, как создать «зеркальную» текстуру, и теперь я хочу переместить это «зеркальное» изображение вниз по оси 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 ]

3 голосов
/ 06 марта 2012

То, что вы на самом деле изменяете в своем фрагменте кода, это позиция Y ваших вершин ... это, безусловно, не то, что вы хотите сделать.
a_position - ваша позиция в пространстве модели; система координат, которая центрирована вокруг вашего четырехугольника (я предполагаю, что вы используете четырехугольник для отображения текстуры).

Если вместо этого вы внесете изменения в экранное пространство, вы сможете перемещать изображение вверх и вниз и т. Д., Поэтому измените значение gl_Position:

((u_projectionMatrix * u_modelViewMatrix) * pos + Vec4(0,HEIGHT,0,0))

Обратите внимание, что тогда вы будете в пространстве экрана; так что проверьте размеры вашего окна просмотра.

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

Вы можете либо умножить матрицы моделей на проекцию вида на ЦП:

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;

или на графическом процессоре:

uniform highp mat4 u_model;
uniform highp mat4 u_viewMatrix;
uniform highp mat4 u_projectionMatrix;
gl_Position = (u_projectionMatrix * u_model * u_viewMatrix) * pos;
1 голос
/ 06 марта 2012

Координаты, переданные в texture2D, всегда выбирают источник в диапазоне [0, 1) по обеим осям, независимо от исходного размера текстуры и соотношения сторон.Таким образом, ответ коленного толчка заключается в том, что высота текстуры всегда равна 1,0.

Если вы хотите узнать высоту исходного изображения, содержащего текстуру в пикселях, вам нужно будет указать это самостоятельно - вероятно, какуниформа - так как она не выставлена ​​иначе.

...