GLSL Shader - Coverflow Отражение 2D объекта - PullRequest
1 голос
/ 02 марта 2012

Я хочу написать шейдер, который создает отражение изображения, похожее на изображение, используемое для обложек.

// 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 Ответ

2 голосов
/ 02 марта 2012

Если вы говорите о том, что 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 на матрицы «модель» (объект / мир) и «представление». Таким образом, будет легче выполнять такие преобразования.

...