Dessin avec GLKit
Je suis en train d'écrire un jeu à l'aide d'opengl, mais je vais avoir beaucoup de mal avec la nouvelle glkit classes et le modèle par défaut d'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
Avec cette le tampon efface(couleur grise), mais rien de le vertex array rend. Je n'ai aucune idée de quoi faire à partir d'ici, et en raison de l'âge de la technologie, il n'y a pas beaucoup de renseignements sur la façon d'utiliser correctement glkit.
OriginalL'auteur botptr | 2011-10-18
Vous devez vous connecter pour publier un commentaire.
Je ne vois rien dans votre code de programme d'installation de chargement de votre shaders - je présume que vous faites cela quelque part dans votre code?
En outre, dans votre code de programme d'installation, vous créez votre framebuffer. Le
GLKView
fait cela pour vous - vous le dire à la vue d'utiliser un 24-bit depth buffer dans votreviewDidLoad
méthode:Jusqu'à ce que votre
glkView:drawInRect:
code ci-dessus est en train de faire est de dire: "Lier ma main framebuffer, et de tirer des trucs". LeGLKView
alors automatiquement se présente, mais rien n'a été tiré, vous avez attiré dans votre main de la mémoire tampon. Sauf si vous avez besoin de plus framebuffer objets pour des tâches telles que le rendu de la texture, alors vous n'avez pas besoin de vous préoccuper avec le framebuffer de la création de tout laisser leGLKView
le faire automatiquement.Ce que vous devez faire dans votre
setupGL
de la méthode (ou n'importe où vous le souhaitez dans le setup) est la création de vos vertex array objet(s) que se souvenir de l'état openGL nécessaire pour effectuer un tirage au sort. Puis, dans laglkView:drawInRect:
de la méthode:glClear()
.approprié vertex attrib pointeurs).
glDrawArrays()
ouglDrawElements()
.La
GLKView
définit automatiquement son contexte actuel, et se lie à son objet framebuffer avant chaque tirage cycle.Peut-être essayer de penser à
GLKView
plus comme unUIView
. Il gère la plupart du code openGL derrière les coulisses pour vous, vous laissant tout simplement de dire ce dont il a besoin pour dessiner. Il a sondrawRect:
code comme unUIView
- avec unUIView
dansdrawRect:
que vous venez de lui dire ce qu'il devrait s'inspirer, par exemple à l'aide de Graphiques de Base fonctions - vous n'avez pas ensuite, dites-lui de se présenter.La
GLKViewController
est alors considéré comme de la manipulation de la mécanique de la boucle de rendu dans les coulisses. Vous n'avez pas besoin de mettre en œuvre les compteurs à zéro, ou même de s'inquiéter à propos de la suspension de l'animation sur votre demande d'entrer dans l'arrière-plan. Vous avez juste besoin de remplacer laupdate
ouglkViewControllerUpdate:
méthode (selon que vous êtes sous-classement ou de délégation) pour mettre à jour l'état de l'openGL objets ou de la matrice de vue.OriginalL'auteur Stuart
J'ai fait un post sur la façon de mettre en place un projet de base de modèle à l'aide de GLKit. Vous pouvez le trouver ici:
Steve Zissou de Programmation du Blog
OriginalL'auteur Gabriel G. Roy
Je n'ai pas utilisé le GLKit encore, mais il semble que vous ne présentez pas votre framebuffer après le dessin.
Dans une application en utilisant OpenGL ES 2 sous iOs, mais sans GLKit, je l'utilise pour appeler le code suivant à la fin de la boucle de rendu.
}
Comme je l'ai dit je n'ai pas utilisé GLKit encore donc j'espère que ça peut être utile.
L'importation de QuartzCore fixe construire mon problème, mais je ne suis toujours pas dans la gestion de dessiner quoi que ce soit.
Dans GLKit, le GLKView va automatiquement se jeter inutiles renderbuffers à la fin de chaque rendu de cycle. Ce n'est pas le problème avec le code. Voir ma réponse pour plus de détails.
OriginalL'auteur JimN
Je crois que vous avez oublié d'appeler
juste avant
OriginalL'auteur Germano
Comme GLKit imite l'OpenGL ES 1.1 pipeline de rendu, vous n'avez pas besoin d'inclure des routines pour définir Shader. GLKit en fait cela pour vous, si vous souhaitez utiliser la base de pipeline comme l'OpenGL ES1.1
Oui vous avez raison dans un certain sens, nous allons configurer ces paramètres à l'aide de GLKit de GLKBaseEffect. Mon point ici est que Vous n'avez pas à impliquer vous-même écrit les shaders explicitement si vous souhaitez utiliser la base de pipeline.
OriginalL'auteur Sagar Ranglani