【问题标题】:How to draw to NSOpenGLView from a view controller object?如何从视图控制器对象绘制到 NSOpenGLView?
【发布时间】:2012-01-19 02:54:37
【问题描述】:

在 IB 中,我在窗口中放置了一个 NSOpenGLView 实例。

我的所有绘图代码都在一个自定义的 NSViewController 中,如下所示:

// MyOpenGLViewController.h

@interface MyOpenGLViewController : NSViewController 
{
    IBOutlet NSOpenGLView *glView;  
}

// MyOpenGLViewController.m

-(void)awakeFromNib
{
    [self drawFrame];
}

-(void)drawFrame
{
    [[glView openGLContext] makeCurrentContext];
    glClearColor(0, 0, 0, 1);
}

一切都被链接起来,“drawFrame”被调用,但我没有在屏幕上看到任何东西。它总是白色的。我应该检查什么?

【问题讨论】:

    标签: cocoa opengl nsopenglview


    【解决方案1】:

    通常一个子类 NSOpenGLView 并安装一个计时器来更新您的数据模型,如果有任何变化然后绘制变化。控制器不应该进行绘图。 Apple 有一些很好的文档来说明如何工作。从OpenGl Programming Guide for Mac OS X 开始。

    我似乎记得在 Interface Builder 中使用 NSOpenGLView 对象的一个​​错误。我总是做的是在你想要视图的地方添加一个通用的 NSObject 并将它的类设置为你的 NSOpenGLView 子类。

    【讨论】:

    • 好吧,看来是这样——我无法从控制器进行绘图。我发现了一些示例代码,他们以这种方式进行了设置,所以我认为它应该可以工作。但是,我无法在视图子类中初始化我的着色器。所以我在我的控制器中初始化它们,然后将“程序”传递给视图。似乎正在工作。谢谢。
    • 从控制器绘图应该可以工作,也许还有其他事情发生,但它打破了 MVC 范式。此外,初始化着色器应该在视图子类中工作。几年前我参加了 OpenGL 课程,所有平台代码都与 OpenGL 代码隔离开来。所有的 OpenGL 代码都是带有全局状态的老式 C。 C 代码是通过 Objective-C 层调用的,如果消息存在,控制器只会调用目标 C。生成的 OpenGL 代码应该是跨平台的,尽管我从未尝试过。不幸的是,我无法发布该课程的任何代码。
    【解决方案2】:

    不确定可可,但glClearColor() 只是设置了一些状态。 glClear(GL_COLOR_BUFFER_BIT) 实际上会清除帧缓冲区。

    【讨论】:

    • 观察力不错。虽然我在实际代码中确实有这个。我在这里只发了一行。还是行不通。绘图代码都没有输出到屏幕上,我不知道在哪里看..
    【解决方案3】:

    回答有点晚了,但是当我想知道同样的事情并发现这个线程时,我想我应该用一些缺失的部分来更新它:P

    因为有人提到glClearColor()只设置了一个属性,实际的清除必须用glClear来完成(注意除了颜色缓冲区它还可以清除Z-Buffer、累加器和模板)。

    最后,您的 OpenGL 命令 stream 需要实际刷新。这可以通过 glFlush() 来完成,如果你是单缓冲的,或者 glSwapAPPLE() 如果你是双缓冲的。

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多