如何使用gluOrtho2D(像素空间)在Mac OSX(Snow Leopard)上启动OpenGL上下文

时间:2011-06-05 22:59:35

标签: macos cocoa opengl

关于设置OpenGL上下文并使用Snow Leopard在MacOSX上正确使用它,我遇到了一些问题和疑问。网络上有许多不同的教程和代码,它们各有不同,范围从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 个答案:

答案 0 :(得分:2)

你有一些困惑:OpenGL上下文没有“启动”,它被创建了。在MacOS X的情况下,通过简单地实例化NSOpenGLView来创建适当的上下文。

许多教程都做了一些事情,但从根本上说是有缺陷的是将代码设置为重塑处理程序中的投影和视口。 更清洁的解决方案是在显示功能中设置所有状态。这让我们想到了最后一个误解,即人们认为,一些OpenGL状态只能设置一次。

gluOrtho2D不是OpenGL的一部分,它是GLU的一部分,GLU是一个非常古老的OpenGL辅助库,对于当今的现代OpenGL实现几乎没有用处。在gluOrtho2D的情况下,我从未理解,为什么这个函数完全存在,因为gluOrtho2D可以通过

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

你看,这只是两个额外的参数。