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