NSOpenGLView без построителя интерфейса - PullRequest
4 голосов
/ 14 марта 2012

Я написал класс TestingView, который является подклассом NSOpenGLView, и добавил его в NSWindow через Interface Builder

@implementation TestingView

- (void)prepareOpenGL 
{
    [super prepareOpenGL];

    glGenRenderbuffers( NumRenderbuffers, renderbuffer ); 
    glBindRenderbuffer( GL_RENDERBUFFER, renderbuffer[Color] ); 
    glRenderbufferStorage( GL_RENDERBUFFER, GL_RGBA, 1024, 768 );

    glBindRenderbuffer( GL_RENDERBUFFER, renderbuffer[Depth] ); 
    glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 1024, 768);
    glGenFramebuffers( 1, &framebuffer ); 
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, framebuffer );
    glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
                          renderbuffer[Color] );
    glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER,
                          GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer[Depth] );
    glEnable( GL_DEPTH_TEST );
}

- (void)show 
{   
    glBindFramebuffer( GL_READ_FRAMEBUFFER, framebuffer ); 
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); 
    glViewport(0, 0, self.window.frame.size.width, self.window.frame.size.height); 
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glBlitFramebuffer( 0, 0, 1024, 768, 0, 0, 1024, 768, GL_COLOR_BUFFER_BIT, GL_NEAREST );
    glSwapAPPLE();

}

- (void)draw 
{
    /* Prepare to render into the renderbuffer */ 
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, framebuffer ); 
    glViewport( 0, 0, 1024, 768 );

    /* Render into renderbuffer */ 
    glClearColor( 1.0, 1.0, 0.0, 1.0 ); 
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 
}

@end

, и он отлично работает.Однако в моем втором проекте я не могу использовать Interface Builder, поэтому я делаю это так,

TestingView *testingView = [[TestingView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
[self.view addSubview:testingView];

, и это не работает.OpengGLContext не инициализируется должным образом.Я также попытался

GLuint pixAttribs[] =
{
    NSOpenGLPFAWindow,         // choose among pixelformats capable of rendering to windows
    NSOpenGLPFAAccelerated,    // require hardware-accelerated pixelformat
    NSOpenGLPFADoubleBuffer,   // require double-buffered pixelformat
    NSOpenGLPFAColorSize, 24,  // require 24 bits for color-channels
    NSOpenGLPFAAlphaSize, 8,   // require an 8-bit alpha channel
    NSOpenGLPFADepthSize, 24,  // require a 24-bit depth buffer
    NSOpenGLPFAMinimumPolicy,  // select a pixelformat which meets or exceeds these requirements
    0
};

NSOpenGLPixelFormat *pixFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixAttribs];
NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:pixFormat shareContext:nil];
TestingView *testingView = [[TestingView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768) pixelFormat:pixFormat];
testingView.openGLContext = context;

, и OpenGL все еще не работает.Как добавить NSOpenGLView в качестве подпредставления без использования Interface Builder?

1 Ответ

2 голосов
/ 15 марта 2012

Я несколько раз ударился головой об этом. Я узнал, что мой pixformat был в пути. Вот что я бы сделал:

// Assuming you have a self.window initialized somewhere
TestingView *testingView = [[TestingView alloc] initWithFrame:self.window.frame pixelFormat:nil];
[self.window setContentView:testingView];

Вы можете ознакомиться с моей полной реализацией (вообще без Interface Builder) здесь: https://gitorious.org/glengine/glengine

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