- Äɲ䵤줿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
- ºï½ü¤µ¤ì¤¿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
º£²ó¤ÏiPhone¤Ç¤ÎOpenGLES2¤Î½é´ü²½¤ò¤·¤Þ¤¹¡£
&ref(screenshot1.PNG);
º£²ó¤Î¥×¥í¥°¥é¥à°ì¼°¤Ï¤³¤Á¤é
¡¦&ref(OpenGLES2Initialize.zip);
OpenGLES¤ò»È¤¦¤¿¤á¤Ë¤Ï
°Ê²¼¤Îframework¤¬É¬ÍפǤ¹¤Î¤Ç¥×¥í¥¸¥§¥¯¥È¤ËÄɲä·¤Þ¤¹¡£
¡¦OpenGLES.framework
¡¦QuartzCore.framework
&ref(framework.png);
¶ñÂÎŪ¤Ê½é´ü²½½èÍý¤Ï
OpenGLView.m¤Ë¼ÂÁõ¤·¤Æ¤¢¤ê¤Þ¤¹
¤Û¤Ü·è¤Þ¤ê¤¤Ã¤¿¼ê½ç¤Ë¤Ê¤ë¤È»×¤¤¤Þ¤¹¤Î¤Ç¼¡²ó°Ê¹ß¤â»È¤¤²ó¤·¤Ç¤¹
°Ê²¼¤Îή¤ì¤È¤Ê¤ê¤Þ¤¹¡£
¡¦¡CAEAGLLayer¥¯¥é¥¹¤ò¥ì¥¤¥ä¡¼¤ËÀßÄê
¡¦¢ÉÁ²è¥ì¥¤¥ä¡¼¤òȾƩÌÀ²½
¡¦£OpenGL¥³¥ó¥Æ¥¥¹¥È¤ÎºîÀ®
¡¦¤¥«¥é¡¼¥Ð¥Ã¥Õ¥¡¤ÎºîÀ®
¡¦¥Z¥Ð¥Ã¥Õ¥¡¤ÎºîÀ®
¡¦¦¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ÎºîÀ®
¡¦§Äê´üŪ¤Ë¥ì¥ó¥À¥ê¥ó¥°½èÍý¤ò¸Æ¤Ó½Ð¤·
´ðËÜŪ¤Ë§¤ÇOpenGLView¥¯¥é¥¹¤Îrender¥á¥½¥Ã¥É¤òÄê´üŪ¤Ë¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë¤Î¤Ç
¼¡²ó°Ê¹ß¤ÏOpenGLView¥¯¥é¥¹¤ò·Ñ¾µ¤·¡¢
render¥á¥½¥Ã¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤ÆÉÁ²è½èÍýÉôʬ¤òÊѹ¹¤·¤Þ¤¹¡£
// ¡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²ó
#vote(¤Ë¤ã¤ó¤Ñ¤¹¡¼[0],Á¡°ÝÁÓ¼º¡ª[0],²æ¤é¤¬¥º¥ô¥£¥º¥À¡¼¤Î¸÷¤ò¡¢¤¢¤Þ¤Í¤¯À¤³¦¤Ë[0])