I wrote the TestingView class, which is a subclass of NSOpenGLView, and added it to NSWindow through 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 { glBindFramebuffer( GL_DRAW_FRAMEBUFFER, framebuffer ); glViewport( 0, 0, 1024, 768 ); glClearColor( 1.0, 1.0, 0.0, 1.0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } @end
and it works great. However, in my second project, I cannot use Interface Builder, so I do it this way
TestingView *testingView = [[TestingView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; [self.view addSubview:testingView];
and it does not work. OpengGLContext is not initialized properly. I also tried
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;
and OpenGL is still not working. How to add NSOpenGLView as a subquery without using Interface Builder?