2011-05-15 48 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