2013-01-07 4 views
1

J'ai écrit une classe qui permet actuellement le chargement de modèles 3D via un tableau et une variable (en spécifiant la quantité de variables dans le tableau). Le code me semble bien mais ne dessine rien à l'écran.OpenGL ES Wont draw

Voici le Vertex Struct.

typedef struct 
{ 
    float pos[3]; 
    float texCoord[2]; 
    float colour[4]; 
} Vertex; 

Voici comment le modèle est initialisé.

- (id)VModelWithArray:(Vertex[])Vertices count:(unsigned short)count 
{ 
    self.Vertices = Vertices; 
    self.count = count; 
    return self; 
} 

Les deux variables de classe sont déclarées dans l'en-tête comme tel.

@property (nonatomic, assign) Vertex *Vertices; 
@property (nonatomic, assign) unsigned short count; 

Il est appelé de mon point de vue comme contrôleur.

Vertex array[] = { 
     {{1, -1, 0}, {1, 0}, {1, 0, 0, 1}}, 
     {{1, 1, 0}, {1, 1}, {0, 1, 0, 1}}, 
     {{-1, 1, 0}, {0, 1}, {1, 1, 1, 1}} 
    }; 

    unsigned short elements = sizeof(array)/sizeof(Vertex); 
    self.model = [[VModel alloc] VModelWithArray:array count:elements]; 

La classe Model est déclarée dans l'en-tête comme tel.

@property (strong, nonatomic) VModel *model; 

Les VBO sont créées par cette méthode. Il est appelé après l'initialisation du modèle dans le contrôleur de vue comme tel.

[self.model CreateVBO]; 

Le modèle est rendu selon cette méthode.

- (void)Render 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, pos)); 
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, texCoord)); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, colour)); 
    glDrawArrays(GL_TRIANGLES, 0, self.count); 
    glDisableVertexAttribArray(GLKVertexAttribPosition); 
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glDisableVertexAttribArray(GLKVertexAttribColor); 
} 

Il est appelé dans cette méthode.

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glClearColor(0.5, 0.5, 0.5, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    [self.effect prepareToDraw]; 
    [self.model Render]; 
} 

Toute aide serait grandement appréciée.

Répondre

1

Je l'ai compris, j'ai accidentellement omis ces lignes lors de la fusion du code d'un projet précédent.

[EAGLContext setCurrentContext:self.context]; 
self.effect = [[GLKBaseEffect alloc] init];