|
º£²ó¤Ï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²ó
|