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];
}
任何幫助將非常感激。