Iphone 正确使用OpenGL ES?

Iphone 正确使用OpenGL ES?,iphone,objective-c,opengl-es,Iphone,Objective C,Opengl Es,我正在制作一个简单的游戏(使用《iPhone和iPad游戏开发傻瓜》一书),但我无法让它工作。我正在制作书中使用的示例应用程序,因此我认为我有正确的代码。问题是 我输入了OpenGL ES的代码,但是我收到了很多警告。下面是代码 .h文件: #import <UIKit/UIKit.h> #import <OpenGLES/ES2/gl.h> #import <OpenGLES/ES2/glext.h> #import <QuartzCore/Quart

我正在制作一个简单的游戏(使用《iPhone和iPad游戏开发傻瓜》一书),但我无法让它工作。我正在制作书中使用的示例应用程序,因此我认为我有正确的代码。问题是

我输入了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
以下是我收到的警告类型(我无法将它们全部放入,因为它们太多了):

从不兼容的指针类型传递'glGenFramebuffers'的参数2。
从不兼容的指针类型传递'glBindFramebuffers'的参数2。
从不兼容的指针类型传递'glGenRenderbuffers'的参数2。
从不兼容的指针类型传递'glBindRenderbuffers'的参数2。

所以,如果所有这些都是从书中出来的,为什么我会收到这些警告?我没有导入正确的文件吗?我真的不能给你比这更多的信息,因为我不知道是什么原因造成的,我对OpenGL ES是完全陌生的。感谢所有的帮助


编辑:还有一件事。我在使用
glGenFramebuffers
之类的东西的任何地方都会收到警告。

glGen*函数接受一个大小和一个指向GLuint的指针,并且您正在传递指向GLuint的指针的地址(一个GLuint**),这就是触发警告的原因

直接传递指针,如下所示:

GLGEN帧缓冲区(1,帧缓冲区); glGenRenderbuffers(1,colorRenderBuffer); glGenRenderbuffers(1,深度缓冲区)


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

glGen*函数接受一个大小和一个指向GLuint的指针,并且您正在将一个指针的地址传递给一个GLuint(一个GLuint**),这就是触发警告的原因

直接传递指针,如下所示:

GLGEN帧缓冲区(1,帧缓冲区); glGenRenderbuffers(1,colorRenderBuffer); glGenRenderbuffers(1,深度缓冲区)


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

或者更好,保持语法不变,只需将缓冲区变量声明为GLuint。这样,您就不必每次使用它们时都分配内存和取消引用变量。或者更好的是,保持语法不变,只需将缓冲区变量声明为GLuinto不必每次使用时都分配内存和取消引用变量。警告是很明显的,我怀疑你是否真的第一次尝试自己解决问题。正如我所说,我对OpenGL一无所知。我使用这本书是为了能学到一些东西。然而,写这本书的人没有说任何关于OpenGL的事情警告。所以请看Matias Valdenegro的回答。仅仅说我从书中复制了所有内容,并不能让你从思考中解脱出来,这些函数取什么作为参数,用什么类型的变量调用它们。这不是我想要说的。我想说的是,因为我不知道这一点,我无法正确地调试它y、 我正在学习它,所以我很快就能调试它。现在的问题是,尽管错误很明显,但我不知道如何修复它们。但是,您可能会注意到我说“我导入的文件不正确吗?”?“。这是因为我不知道我使用的东西是否正确,但来自错误的文件。我理解你的观点,但事实是,这些错误不是OpenGL特定的,而是纯Objective-C(甚至C)使用错误。我假设您在尝试学习OpenGL时适合Objective-C。我知道,你不可能知道这一点,但是看看函数签名和你的变量就足够了(警告会告诉你这一点),不管是不是OpenGL。如果你在问问题之前真的试图自己解决这个问题,那么请原谅。警告是很明显的,我怀疑你是否真的第一次尝试自己解决这个问题。正如我所说,我对OpenGL一无所知。我在用这本书,以便能学到一点。然而,写这本书的人并没有说任何关于警告的话。所以请看Matias Valdenegro的回答。仅仅说我从书中抄袭了所有内容,并不能让你从思考中解脱出来,这些函数取什么作为参数,以及你用什么类型的变量来调用它们。这不是我想要说的。我的意思是,因为我不知道这一点,我无法正确调试它。我正在学习它,所以我很快就能调试它了。现在的问题是,尽管错误很明显,但我不知道如何修复它们。但是,您可能会注意到,我说“我没有导入正确的文件吗?”。这是因为我不知道我使用的东西是否正确,而是来自错误的文件。我理解你的观点,但事实是这些错误不是OpenGL特有的,而是纯粹的Objective-C(甚至C)使用错误。我假设您在尝试学习OpenGL时适合Objective-C。我知道,你不可能知道这一点,但是看看函数签名和你的变量就足够了(警告会告诉你这一点),不管是不是OpenGL。如果你真的想在问问题之前自己解决它,那么请原谅我。
#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];
}