Правильно ли используете OpenGL ES? - PullRequest
0 голосов
/ 16 мая 2011

Я делаю простую игру (использую книгу «Разработка игр для 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

.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.

1 Ответ

3 голосов
/ 16 мая 2011

Функции glGen * принимают размер и указатель на GLuint, и вы передаете адрес указателя на GLuint (GLuint **), что вызывает предупреждение.

Просто передайте указатель напрямую, вот так:

glGenFramebuffers (1, кадровый буфер); glGenRenderbuffers (1, colorRenderBuffer); glGenRenderbuffers (1, deepBuffer);

Также не забудьте выделить память перед ее передачей в OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...