2013-01-07 162 views
1

我已經寫了一個類,目前允許通過數組和變量(指定數組中的變量的數量)加載3D模型。代碼對我來說似乎很好,但不會在屏幕上繪製任何東西。OpenGL ES不會繪製

這是頂點結構。

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

這是如何初始化模型。

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

這兩個類變量在標頭中聲明像這樣。

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

它在我的視圖控制器中被調用如此。

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]; 

Model類在標頭中聲明像這樣。

@property (strong, nonatomic) VModel *model; 

VBO是通過這種方法創建的。

- (void)CreateVBO 
{ 
    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*self.count, self.Vertices, GL_STATIC_DRAW); 
} 

它在模型在視圖控制器中初始化後調用,如下所示。

[self.model CreateVBO]; 

該模型是通過此方法呈現的。

- (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); 
} 

它在這個方法中被調用。

- (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]; 
} 

任何幫助將非常感激。

回答

1

我弄明白了,在合併前一個項目的代碼時,我不小心忽略了這些行。

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