ios opengl-es ios5 glkit

ios - Dibujando con GLKit



opengl-es ios5 (5)

Como GLKit imita el canal de renderizado de OpenGL ES 1.1, no necesita incluir las rutinas para definir Shader. GLKit en realidad lo hace por usted, si desea utilizar una tubería básica como OpenGL ES1.1

Intento escribir un juego usando opengl, pero estoy teniendo muchos problemas con las nuevas clases de glkit y la plantilla predeterminada de iOS.

- (void)viewDidLoad { [super viewDidLoad]; self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; if (!self.context) { NSLog(@"Failed to create ES context"); } if(!renderer) renderer = [RenderManager sharedManager]; tiles = [[TileSet alloc]init]; GLKView *view = (GLKView *)self.view; view.context = self.context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; [self setupGL]; } - (void)setupGL { int width = [[self view] bounds].size.width; int height = [[self view] bounds].size.height; [EAGLContext setCurrentContext:self.context]; self.effect = [[GLKBaseEffect alloc] init]; self.effect.light0.enabled = GL_TRUE; self.effect.light0.diffuseColor = GLKVector4Make(0.4f, 0.4f, 0.4f, 1.0f); //Configure Buffers glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glGenRenderbuffers(2, &colourRenderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, colourRenderBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colourRenderBuffer); glGenRenderbuffers(3, &depthRenderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer); //Confirm everything happened awesomely GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; if(status != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete framebuffer object %x", status); } glEnable(GL_DEPTH_TEST); // Enable the OpenGL states we are going to be using when rendering glEnableClientState(GL_VERTEX_ARRAY); } - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { glClearColor(0.4f, 0.4f, 0.4f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); float iva[] = { 0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0, }; glVertexPointer(3, GL_FLOAT, sizeof(float) * 3, iva); glDrawArrays(GL_POINTS, 0, 4); } @end

Con esto, el buffer se borra (a un color gris), pero nada de la matriz de vértices se renderiza. No tengo idea de qué hacer aquí y, debido a la antigüedad de la tecnología, no hay mucha información disponible sobre cómo usar Glkit correctamente.


Creo que olvidaste llamar

[self.effect prepareToDraw];

justo antes

glDrawArrays(GL_POINTS, 0, 4);



No veo nada en su código de configuración que cargue sus sombreadores. Supongo que está haciendo esto en algún lugar de su código.

Además, en su código de configuración, está creando su framebuffer. El GLKView hace por usted; de hecho, le está diciendo a la vista que use un buffer de 24 bits en su método viewDidLoad :

GLKView *view = (GLKView *)self.view; view.context = self.context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

Entonces, ¿cuál es tu glkView:drawInRect: código anterior está diciendo: "Enlazar mi framebuffer hecho a mano, y dibujar algunas cosas en él". El GLKView se presenta automáticamente, pero no se ha dibujado nada, solo has dibujado en tu buffer hecho a mano. A menos que necesite objetos framebuffer adicionales para tareas tales como renderizar en texturas, entonces no necesita preocuparse por la creación de framebuffer, deje que GLKView haga automáticamente.

Lo que debe hacer en su método setupGL (o en cualquier lugar que desee en la configuración) es crear sus objetos de matriz de vértices que recuerden el estado de OpenGL requerido para realizar un sorteo. Luego, en el glkView:drawInRect: debes:

  1. Borrar usando glClear() .
  2. Habilita tu programa
  3. Enlace el objeto de matriz de vértices (o, si no usó un VAO, habilite los punteros attrib de vértice apropiados).
  4. Dibuje sus datos usando glDrawArrays() o glDrawElements() .

GLKView establece automáticamente su contexto como actual y vincula su objeto framebuffer antes de cada ciclo de extracción.

Tal vez trates de pensar en GLKView más como un UIView regular. Maneja la mayor parte del código OpenGL detrás de las escenas para usted, dejándolo simplemente para decirle lo que necesita dibujar. Tiene su código drawRect: como un UIView normal, con un UIView regular en drawRect: simplemente dígale lo que debe dibujar, por ejemplo, utilizando las funciones de Core Graphics, no le dirá que se presente.

El GLKViewController es mejor pensado como el manejo de la mecánica del ciclo de renderizado detrás de escena. No es necesario que implemente los temporizadores, o incluso se preocupe por detener la animación de la aplicación que ingresa al fondo. Solo tiene que anular la update o el método glkViewControllerUpdate: (dependiendo de si está glkViewControllerUpdate: subclases o delegando) para actualizar el estado de los objetos OpenGL o la matriz de vista.


Todavía no he usado GLKit, pero parece que no presentas tu framebuffer luego de dibujarlo. En una aplicación que usa OpenGL ES 2 bajo iOs pero sin GLKit, utilizo para llamar al siguiente código al final del ciclo de representación.

if(context) { [EAGLContext setCurrentContext:context]; glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER];

}

Como dije, aún no he usado GLKit, así que espero que esto pueda ser útil.