OpenGL ES больше не отображает объект - PullRequest
0 голосов
/ 23 января 2012

Я новичок в программировании OpenGL ES. Я нашел хороший учебник для начала, и проект отображал квадрат. Затем я попытался переместить большую часть кода OpenGL из View Controller в объект Model, который будет хранить вершины, цвет и т. Д., А затем в View Controller я бы просто вызвал:

[model update];
[model load];

Таким образом, было бы больше практики, если бы у меня было несколько моделей для показа. И с тех пор как я это сделал, куб больше не отображается на экране. Я думаю, что я обнаружил ошибку в методе обновления, где все вычисления матрицы представления модели происходят, потому что, когда я закомментирую этот метод, куб отображает, но он просто заполняет экран.

-(void)update: (int)width And:(int)height{
float aspect = (width/height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(
                                      GLKMathDegreesToRadians(65.0f), aspect,
                                      4.0f, 10.0f);
self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 6.0f);   
rotation += 90;
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix,
                                       GLKMathDegreesToRadians(rotation), 0, 0, 1);
self.effect.transform.modelviewMatrix = modelViewMatrix;
}  

А вот способ загрузки:

- (void)load{
self.effect = [[GLKBaseEffect alloc] init];

NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithBool:YES],
                          GLKTextureLoaderOriginBottomLeft, 
                          nil];

NSError * error;    
NSString *path = [[NSBundle mainBundle] pathForResource:@"tile_floor" ofType:@"png"];
GLKTextureInfo * info = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];
if (info == nil) {
    NSLog(@"Error loading file: %@", [error localizedDescription]);
}
self.effect.texture2d0.name = info.name;
self.effect.texture2d0.enabled = true;

glGenVertexArraysOES(1, &vertexArray);
glBindVertexArrayOES(vertexArray);

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);        
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));

glBindVertexArrayOES(0);
}

А вот способ рендеринга:

- (void)render{
[self.effect prepareToDraw];
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

glBindVertexArrayOES(vertexArray);
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
}

Любая помощь будет оценена. Благодарю.

1 Ответ

1 голос
/ 23 января 2012

Здесь на самом деле нет «ошибки». Проблема заключается в том, что вы на самом деле не настраиваете матрицы проекции и вида модели, чтобы они хорошо подходили к вашей модели. Там нет волшебного решения. Вы должны рассмотреть вершины в модели, которую вы рисуете (они поднимаются до 100? 1000? Просто 0,5?) И выбрать соответствующие настройки для GLKMatrix4MakePerspective, которые помещают их прямо на экране.

В качестве краткого описания (поскольку вы сказали, что без перевода и поворота он заполняет весь экран), вы можете заменить эти преобразования командой масштабирования, чтобы уменьшить размер объекта.

Что-то вроде:

GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.1f, 0.1f, 0.1f);   

В качестве общего совета постарайтесь рассмотреть влияние каждой команды в отдельности. Если вы ищете введение в концепции проекции / преобразования, я нашел эту ссылку: http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-3:-3D-transformation-and-projection.html Перейдите к разделу, который называется Проекция и мировое пространство.

...