Как использовать gluPerspective только один раз? - PullRequest
1 голос
/ 28 августа 2011
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//set viewpoint
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(VIEW_ANGLE,Screen_Ratio,NEAR_CLIP,FAR_CLIP);
gluLookAt(0,5,5, 0,0,0, 0,1,0);

//transform model 1
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(Theta, 0,1,0);

//draw model 1
glBegin(GL_QUADS);
...
glEnd();

Приведенный выше код работает нормально, но есть ли способ удалить вызов gluPerspective?

Я имею в виду, что я хотел бы вызывать его только один раз при инициализации, а не повторно во время каждого рендеринга.

Ответы [ 3 ]

5 голосов
/ 28 августа 2011

Вы называете gluPerspective там, потому что оно принадлежит там.OpenGL - это не граф сцены, где вы инициализируете вещи.Это управляемый состоянием API рисования.Матрица проекции - это состояние, и каждое серьезное графическое приложение меняет это состояние несколько раз в течение одного кадра.

OpenGL не знает геометрических объектов, положений и камер.Он просто проталкивает точки, линии и треугольники через конвейер обработки и выводит результат на экран.После того, как что-то нарисовано, OpenGL не помнит об этом.контекст рендеринга, но на самом деле это часть графического стека операционной системы, а не OpenGL).Конечно, вы загружаете текстуры и буферизуете данные объекта, но это может произойти в любое время.

4 голосов
/ 28 августа 2011

Do not используйте gluLookAt в матрице проекции, так как она определяет камеру / вид и, следовательно, относится к матрице вида модели, обычно как крайнее левое преобразование (первое после glLoadIdentity), где это составляет часть представления слова modelview.Хотя это также работает по-вашему, это концептуально неправильно.Это также решит вашу проблему, так как тогда вам не нужно будет касаться матрицы проекции каждый кадр.

Но на самом деле подход datenwolf более концептуально чист с точки зрения архитектуры конечных автоматов OpenGL.

1 голос
/ 28 августа 2011

Если вы не вызываете glLoadIdentity() (который сбрасывает текущую матрицу как единичную матрицу, т. Е. Отменяет то, что сделал gluPerspective()) каждый кадр, а вместо этого осторожно push / pop Матрицы преобразования, которые вы можете назвать счастливыми, вызывая их только при инициализации.Обычно гораздо проще просто вызывать идентификатор нагрузки каждый раз, когда вы начинаете рисовать, а затем сбрасывать его.Например:

// Initalisation
glLoadIdentity();
gluPerspective(...);

Затем позже:

// Drawing each frame
glClear(...);

glPushMatrix();
gluLookAt(...);

//draw stuff

glPopMatrix();
...