GLSL Shader - Coverflow Отражение 2D объекта
Я хочу написать шейдер, который создает отражение изображения, похожее на то, которое используется для coverflows.
// 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;
mat4 rot = mat4( -1.0, 0.0, 0.0, 0.0,
0.0, -1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 );
void main()
{
gl_Position = (u_projectionMatrix * u_modelViewMatrix) * a_position * rot;
v_color = a_color;
v_texCoord = a_texcoord;
}
// Fragment Shader
varying highp vec2 v_texCoord;
uniform sampler2D u_texture0;
uniform int slices;
void main()
{
lowp vec3 w = vec3(1.0,1.0,1.0);
lowp vec3 b = vec3(0.0,0.0,0.0);
lowp vec3 mix = mix(b, w, (v_texCoord.y-(float(slices)/10.0)));
gl_FragColor = texture2D(u_texture0,v_texCoord) * vec4(mix, 1.0);
}
Но этот шейдер создает следующее: текущий результат И я не знаю, как "перевернуть" изображение по горизонтали, и я пробовал так много разных параметров в матрице вращения (я даже пытался использовать так называемую "зеркальную матрицу"), но я не знать, как отразить изображение на нижней части исходного изображения.
1 ответ
Если вы говорите о том, что images.google.com возвращает для результата "coverflow", то вам не нужна матрица вращения вообще.
void main()
{
gl_Position = (u_projectionMatrix * u_modelViewMatrix) * a_position;
v_color = a_color;
v_texCoord = vec2(a_texcoord.x, 1.0 - a_texcoord.y);
}
Просто переверните его вертикально.
Если вы настаиваете на использовании матрицы и хотите создать "зеркальный" шейдер (тот, который берет объект и помещает его под "пол" для отражения), тогда вам нужна зеркальная матрица (не забудьте отрегулировать выборку лицевой / оборотной стороны):
mat4(1.0, 0.0, 0.0, 0.0,
0.0, -1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 );
И вы должны знать, где слово.
gl_Position = (u_projectionMatrix * u_modelViewMatrix) * (a_position * mirrorMatrix - floor);
В качестве альтернативы вы можете поместить поэтажный перевод в ту же матрицу. По сути, для отражения от произвольной высоты вам необходимо объединить три преобразования (псевдокод).
translate(0, -floorHeight, 0) * scale(1, -1, 1) * translate(0, floorHeight, 0)
,
и поместите их в свою матрицу.
Также может иметь смысл разделить матрицу modelView на матрицы "модель"(объект / мир) и "представление". Таким образом, будет проще выполнять такие преобразования.