Масштабирование и поворот в OpenGL ES 2.0

#opengl-es-2.0 #shader

#opengl-es-2.0 #шейдер

Вопрос:

Есть ли способ включить коррекцию соотношения сторон без использования матриц в OpenGL ES?

Я пишу простой шейдер для поворота текстуры.

 void main()  
{  
    mat2 rotX = mat2(cosA, sinA, -sinA, cosA);  
    vec4 a_pos = a_position;
    a_pos.xy = a_position.xy * rotZ;  
    gl_Position = a_pos;  
}
  

Но проблема в том, что изображение искажается при вращении.
В обычном OpenGL мы используем что-то вроде gluPerspective(fov, (float)windowWidth/(float)windowHeight, zNear, zFar);
Как мне сделать то же самое с шейдерами?
Примечание: Я бы предпочел не использовать матрицу.

Ответ №1:

Включить исправление соотношения сторон в геометрию визуализируемого объекта? Я сделал это в своем инструменте для рендеринга шрифтов, положение вершин в каждом прямоугольнике корректируется соотношением сторон экрана, и да, я знаю, что лучше и проще использовать исправление матрицы, но я не знал этого, когда писал этот инструмент, и он отлично работает 🙂

Ответ №2:

Вы можете вручную перевести код gluPerspective в shader:http://www.opengl.org/wiki/GluPerspective_code

Но вычислять эту матрицу для каждой вершины неэффективно. Таким образом, вы можете вручную рассчитать его для экрана вашего устройства. Посмотрите на эти сообщения

Ответ №3:

Просто измените порядок умножения матрицы для поворота:

 a_pos.xy = rotZ * a_position.xy;