Как запустить контекст OpenGL в Mac OSX (Snow Leopard), используя gluOrtho2D (пространство в пикселях) - PullRequest
1 голос
/ 06 июня 2011

У меня были некоторые проблемы и вопросы в целом, касающиеся настройки контекста OpenGL и его правильного использования в MacOSX с использованием Snow Leopard.В Интернете существует множество различных учебных пособий и кода, которые различаются в пределах от 10,4 до 10,6.Я намерен не использовать GLUT для моих периферийных взаимодействий и для обработки моего контекста GL.

Чтобы подойти к рассматриваемому вопросу, я хочу уметь рисовать мою сцену при изменении размера окна.по какой-то причине моя функция изменения формы работает неправильноЯ также не знаю, должен ли я использовать NSOpenGLView или CustomView в конструкторе интерфейса.Из того, что я понял, кажется, что если вам нужно больше атрибутов рендеринга по умолчанию, которые вы можете выбрать в объекте NSOpenGLView, то вам следует использовать CustomView.В моем случае я создал подкласс NSOpenGLView и подключил свой класс к этому объекту в IBuilder.

В любом случае, вот мой код ниже.Как указано ниже, я действительно хочу иметь возможность перемещаться между орто-пространством (пиксельное пространство) и перспективой (мировое пространство).Я получаю предупреждение при попытке использовать gluOrtho2D () (неявное объявление функции).Я не уверен, как заставить это работать правильно все же, поэтому любая помощь ценится.Извините за вывод моего кода - по какой-то причине он не хочет правильно его форматировать:

#import "MyOpenGLView.h"


@implementation MyOpenGLView

-(void)reshape {
  NSRect rectView = [self bounds];
  if( m_rectView.size.width != rectView.size.width || m_rectView.size.height != rectView.size.height ) {
    glViewport( 0, 0, rectView.size.width, rectView.size.height );
    m_rectView = rectView;
  }

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glMatrixMode(GL_MODELVIEW);
}

-(void) drawRect:(NSRect)bounds {
  glClearColor(0, 0, 0, 0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3f(1.0, 0.85, 0.35);
  glBegin(GL_TRIANGLES);
  {
    glVertex3f(0.0, 0.6, 0.0);
    glVertex3f(-0.2, -0.3, 0.0);
    glVertex3f(0.2, -0.3, 0.0);
  }
  glEnd();
  glFlush();
}
@end

1 Ответ

2 голосов
/ 06 июня 2011

Вы перепутали несколько вещей: контекст OpenGL не "запущен", он создан.В случае MacOS X надлежащий контекст создается путем простого создания экземпляра NSOpenGLView.

Что-то, что делают многие учебные пособия, но принципиально некорректно - размещение кода, задающего проекцию и область просмотра, в обработчике изменения формы. Более чистое решение устанавливает все состояния, когда это необходимо в функции дисплея .Это подводит нас к последнему заблуждению, а именно к тому, что люди думают, что некоторые состояния OpenGL могут быть установлены только один раз.

gluOrtho2D не является частью OpenGL, это часть GLU, очень старой вспомогательной библиотеки OpenGL,очень мало пользы для современных реализаций OpenGL.В случае gluOrtho2D я никогда не понимал, почему эта функция вообще существует, потому что gluOrtho2D может быть воссоздан

void mygluOrtho2D(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
{
    glOrtho(left, right, bottom, top, -1., 1.);
}

Вы видите, что это всего лишь два дополнительных параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...