2011-05-15 45 views
0

我正在制作一个简单的游戏(使用“iPhone和iPad的傻瓜游戏开发”一书),但是我无法使它工作,我正在制作本书中使用的示例应用程序,所以我认为我有正确的。代码这里是我把对OpenGL ES代码中的问题正确使用OpenGL ES?

,但我得到了很多的警告这里是代码

.h文件中:。

#import <UIKit/UIKit.h> 
#import <OpenGLES/ES2/gl.h> 
#import <OpenGLES/ES2/glext.h> 
#import <QuartzCore/QuartzCore.h> 
#import <CoreGraphics/CoreGraphics.h> 

@interface OpenGL : UIView { 
EAGLContext *context; 
GLuint *framebuffer; 
GLuint *colorRenderBuffer; 
GLuint *depthBuffer; 
} 

- (void) prepareOpenGL; 
- (void) render; 

@end 

。 m文件:

#import "OpenGL.h" 


@implementation OpenGL 

- (void) awakeFromNib; { 
    [self prepareOpenGL]; 
    [self render]; 
} 

- (void) prepareOpenGL; { 
    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    [EAGLContext setCurrentContext:context]; 

    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_RENDERBUFFER, framebuffer); 
    glGenRenderbuffers(1, &colorRenderBuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); 
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderBuffer); 

GLint height, width; 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); 

glGenRenderbuffers(1, &depthBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if (status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"Failed to create a complete render buffer!"); 
} 
} 

- (void) render; { 
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height); 
glClearColor(0.5, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

+ (Class) layerClass; { 
    return [CAEAGLLayer class]; 
} 

这些都是类型的我得到警告(我不能把他们都在,因为有很多他们):

Passing argument 2 of 'glGenFramebuffers' from incompatible pointer type. Passing argument 2 of 'glBindFramebuffers' from incompatible pointer type. Passing argument 2 of 'glGenRenderbuffers' from incompatible pointer type. Passing argument 2 of 'glBindRenderbuffers' from incompatible pointer type.

所以,如果所有这一切都来了在书中,为什么我会收到这些警告?我没有导入正确的文件?我真的不能给你提供比这更多的信息,因为我不知道是什么导致了这一点,而我对OpenGL ES完全陌生。感谢您的帮助!

编辑:还有一件事。无论使用什么类似glGenFramebuffers的地方,我都会收到警告。

+0

这个警告很明显,我怀疑你是否真的第一次试图解决问题。 – 2011-05-16 00:34:21

+0

正如我所说,我对OpenGL一无所知。我正在使用这本书,所以我可以学到一点。然而,写这本书的人并没有对这些警告说任何话。 – Justin 2011-05-16 16:29:19

+0

所以看Matias Valdenegro的回答。只是说我复制了本书中的所有内容,并没有让你不去思考,这些函数将什么作为参数,以及你调用它们的变量类型是什么。 – 2011-05-16 17:01:28

回答

3

glGen *函数获取GLuint的大小和指针,并将指针的地址传递给GLuint(GLuint **),这就是触发警告的原因。

只需直接传递指针,这样的:

glGenFramebuffers(1,帧缓冲器); glGenRenderbuffers(1,colorRenderBuffer); glGenRenderbuffers(1,depthBuffer);

另外不要忘记在传递给OpenGL之前分配内存。

+0

甚至更​​好,保持你的语法,只需将你的缓冲区变量声明为GLuint。所以你不必在每次使用它们时分配内存和解引用变量。 – 2011-05-16 00:31:45