Координаты OpenGL 2.0 ES - PullRequest
       29

Координаты OpenGL 2.0 ES

1 голос
/ 15 января 2010

Я делаю первые шаги с OpenGL ES 2.0, пробуя что-то на моем ipod touch.Мне было интересно, как решить эту проблему с координатами ..

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

Так как я работаю с iPod, у меня есть соотношение 1.5 : 1 и область просмотра, установленная на

glViewport(0, 0, backingWidth, backingHeight);

Так что 0,0 - это центр и границыдля отсечения должно быть -1.0, -1.0, -1.0, 1.0 и т. д. (верно?)

Чтобы нарисовать квадрат, мне пришлось использовать разные значения для координат x и y из-за соотношения сторон:

static const GLfloat lineV[] = {
        -0.5f, 0.33f,  0.5f, 0.33f,
         0.5f, 0.33f,  0.5f,-0.33f, 
         0.5f,-0.33f, -0.5f,-0.33f,
        -0.5f,-0.33f, -0.5f, 0.33f,
        -0.5f, 0.33f,  0.5f,-0.33f,
         0.5f, 0.33f, -0.5f,-0.33f,
    };

Это квадрат с обеими диагоналями (я знаю, что использование индексов было бы более эффективным, но это не главное) ..

Затем я попытался написать вершинный шейдер, чтобы вращать объект при его перемещении:

void main()
{
    m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
             -sin(rotation), cos(rotation), 0.0, 0.0,
                        0.0,           0.0, 1.0, 0.0,
                        0.0,           0.0, 0.0, 1.0);

    m2 = mat4(1.0);
    m2[1][3] = sin(rotation)*0.8;
    gl_Position = position*(m*m2);
}

Это работает, но, поскольку координаты не совпадают, квад вращается при вращении.Как я должен предотвратить это?Я подумал, можно ли изменить усеченный вид, чтобы он имел разные границы (не от -1,0 до 1,0 по обеим осям, так что увеличение по оси Y решило бы проблему).

Кроме того, есть лучший способиспользовать матрицы?Я имею в виду, я привык использовать glRotatef без указания всей матрицы. Существуют ли вспомогательные функции / конструкторы для выполнения этой задачи?

Ответы [ 2 ]

0 голосов
/ 16 января 2010

Из того, что я видел, нет перенасыщения или поддержки. По сути, я решил эту проблему, используя равные координаты при построении вершин и используя вершинный шейдер для масштабирования по оси y с правильным соотношением сторон.

0 голосов
/ 15 января 2010

Первые аргументы glViewport() - это не центр, это координаты нижнего левого угла.

Вероятно, вам следует настроить проекцию, учитывающую ваш аспект, обычно используя gluPerspective () (если GLU доступен в ES).

...