glkView drawInRect не вызывается

Я изучаю OpenGLES и пытаюсь поместить GLKViewer в UIViewController.

Я знаю, что могу решить основные проблемы с помощью GLViewController, но я пытаюсь научиться делать это таким образом.

Я нашел этот вопрос, вложение GLKView в UIViewController и Вложенные GLKView и GLKViewController, но я должен что-то упустить, хотя я думаю, что делаю все правильные шаги, потому что когда я запускаю свой проект, я не доходит до строки печати drawInRect.

В раскадровке я указываю ViewController как делегата компонента glkview.

Я старался сделать код максимально простым, и любая помощь будет оценена по достоинству:

MyController.h

#import <Foundation/Foundation.h>
#import <GLKit/GLKit.h>

@interface MyGLController : UIViewController <GLKViewDelegate>
{
    GLuint vertexBufferID;

}

@property (weak, nonatomic) IBOutlet GLKView *glview;

@property (strong, nonatomic) GLKBaseEffect *baseEffect;

@end

MyGLController.m

#import "MyGLController.h"

@implementation MyGLController

//@synthesize baseEffect;

-(void) viewDidLoad{
    [super viewDidLoad];

    self.glview.context = [[EAGLContext alloc] initWithAPI:
     kEAGLRenderingAPIOpenGLES2];

     [EAGLContext setCurrentContext:self.glview.context];
    printf("View Loaded");
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    printf("DrawInRect");
}

@end

* Обновление *

Насколько я могу судить, glkview подключен правильно, как было предложено, и добавлен josh-knapp и вызван setNeedsDisplay.

На случай, если я что-то упустил, я загрузил копию проекта здесь: https://github.com/jcrogel/OpenGLDebug.git

Я полный нуб в этом, поэтому прошу прощения за любую глупую оплошность :)


person Juan Carlos Moreno    schedule 12.11.2012    source источник
comment
Хорошо, я заметил, что получил «закрытое» голосование и 2 голоса против без дальнейшего объяснения того, что не так в вопросе или как мой вопрос был бы лучше. Любая обратная связь, чтобы вернуть мои баллы, будет оценена по достоинству.   -  person Juan Carlos Moreno    schedule 12.11.2012
comment
Я думаю, что минусующие должны объяснить свою причину, а не слепо отмечать это как близкое. ОП, очевидно, приложил здесь усилия, чтобы предоставить как объяснение, так и код. Простой комментарий, запрашивающий недостающую информацию, помог бы.   -  person jdi    schedule 12.11.2012
comment
Для меня я не инициализировался контекстом, и поэтому он не вызывался.   -  person Sam Soffes    schedule 19.02.2014


Ответы (3)


Вы не сказали, что подключили свойство glview MyGLController в раскадровке, так что проверьте это.

Затем вы настраиваете контекст glview после его загрузки. Без GLKViewController ничто не сообщает glview, что его нужно отрисовывать. Убедитесь, что вы вызываете [self.glview setNeedsDisplay] где-то после настройки контекста.

person Josh Knapp    schedule 12.11.2012
comment
Спасибо, я попробовал, но это не сработало, я обновил вопрос, добавив дополнительную информацию и ссылку на репозиторий github, который я добавил вместе с самим проектом. - person Juan Carlos Moreno; 13.11.2012
comment
Просто чтобы уточнить, мне нужно было сделать вызов: self.glview.setNeedsDisplay = YES; - person Juan Carlos Moreno; 13.11.2012
comment
Это должно быть: self.glview.enableSetNeedsDisplay = YES; - person inwit; 08.04.2014
comment
Мне пришлось сделать и то, и другое: self.glview.enableSetNeedsDisplay = YES; [self.glview setNeedsDisplay]; - person Yahel; 10.04.2017

У меня была аналогичная проблема.

По умолчанию xcode устанавливает флажок enable setNeedsDisplay на NO в списке свойств GLKView.
Как только я его изменил, все заработало.

person ashabtay    schedule 09.01.2014
comment
Большое спасибо. Вы спасли меня. Я была такая же проблема. Установка флажка устранила проблему. - person techgentsia; 30.11.2017

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

Описание проблемы

При использовании GLKView и GLKViewController функция цикла рендеринга (drawInRect) вызывается один раз, но не вызывается повторно.

Возможная причина

Некоторые методы CViewController реализованы некорректно, без вызова их надстроек. Следующий код иллюстрирует три такие функции. В приведенных ниже примерах три функции реализованы правильно, вызывая их надстройки.

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:NO];
}
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:NO];
}
person MikeyE    schedule 07.01.2013