º£²ó¤ÏiPhone¤Ç¤ÎOpenGLES2¤Î½é´ü²½¤ò¤·¤Þ¤¹¡£ º£²ó¤Î¥×¥í¥°¥é¥à°ì¼°¤Ï¤³¤Á¤é OpenGLES¤ò»È¤¦¤¿¤á¤Ë¤Ï ¶ñÂÎŪ¤Ê½é´ü²½½èÍý¤Ï // ¡CAEAGLLayer¥¯¥é¥¹¤ò¥ì¥¤¥ä¡¼¤ËÀßÄê¡ÊOpenGL¥³¥ó¥Æ¥ó¥Ä¤òÉÁ²è¤¹¤ë¤¿¤á¤ÎÉÁ²è¥Ç¥£¥¹¥×¥ì¥¤¤È¤·¤Æ¤ÎÀßÄê¡Ë + (Class)layerClass { return [CAEAGLLayer class]; } // ¢ÉÁ²è¥ì¥¤¥ä¡¼¤òȾƩÌÀ²½¡Ê¥Ñ¥Õ¥¡¡¼¥Þ¥ó¥¹¤ÏȾƩÌÀ²½¤·¤¿¤Û¤¦¤¬¤è¤¤¡Ë - (void)setupLayer { _eaglLayer = (CAEAGLLayer*) self.layer; _eaglLayer.opaque = YES; } // £OpenGL¥³¥ó¥Æ¥¥¹¥È¤ÎºîÀ® // ¥³¥ó¥Æ¥¥¹¥È¤ÏÉÁ²è¤ËɬÍפʾðÊó¤òÁ´¤Æ´ÉÍý¤·¤Æ¤¤¤ë - (void)setupContext { EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2; _context = [[EAGLContext alloc] initWithAPI:api]; if (!_context) { NSLog(@"Failed to initialize OpenGLES 2.0 context"); exit(1); } if (![EAGLContext setCurrentContext:_context]) { NSLog(@"Failed to set current OpenGL context"); exit(1); } } // ¤¥«¥é¡¼¥Ð¥Ã¥Õ¥¡¤ÎºîÀ® - (void)setupRenderBuffer { // ¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤ÎÀ¸À® glGenRenderbuffers(1, &_colorRenderBuffer); // ¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤È¤·¤Æ¥Ð¥¤¥ó¥É glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); // ÉÁ²è¥ì¥¤¥ä¡¼¤Ë¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤Î¥á¥â¥ê³ÎÊÝ [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; } // ¥Z¥Ð¥Ã¥Õ¥¡¤ÎºîÀ® - (void)setupDepthBuffer { // ¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤ÎÀ¸À® glGenRenderbuffers(1, &_depthRenderBuffer); // ¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤È¤·¤Æ¥Ð¥¤¥ó¥É glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer); // ¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤ËZ¥Ð¥Ã¥Õ¥¡Äɲà glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height); } // ¦¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ÎºîÀ® - (void)setupFrameBuffer { GLuint framebuffer; // ¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ÎºîÀ® glGenFramebuffers(1, &framebuffer); // ¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤È¤·¤Æ¥Ð¥¤¥ó¥É glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); // ¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤Ë¿§Â°À¤Î¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤ò´ØÏ¢¤Å¤± glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer); // ¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤Ë¿¼ÅÙ°À¤Î¥ì¥ó¥À¡¼¥Ð¥Ã¥Õ¥¡¤ò´ØÏ¢¤Å¤± glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer); } // ÉÁ²è½èÍý - (void)render:(CADisplayLink*)displayLink { // ¥¹¥¯¥ê¡¼¥ó¤Î¥¯¥ê¥¢ glClearColor(0, 0, 0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Z¥Æ¥¹¥È͸ú glEnable(GL_DEPTH_TEST); // ¥«¥ê¥ó¥°Í¸ú glEnable(GL_CULL_FACE); //glDisable(GL_CULL_FACE); glFrontFace(GL_CW); //glFrontFace(GL_CCW); // ¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡¥ê¥ó¥° [_context presentRenderbuffer:GL_RENDERBUFFER]; } // §Äê´üŪ¤ËÉÁ²è½èÍý¤ò¸Æ¤Ó½Ð¤· // render¥á¥½¥Ã¥É¤òÄê´üŪ¤Ë¸Æ¤Ó½Ð¤¹ // ¤³¤Î¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Ærender¥á¥½¥Ã¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë - (void)setupDisplayLink { CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } ¼¡¡§iPhone3D¹ÖºÂ2²ó
|