Я пытаюсь реализовать базовый OpenGL в своем приложении, и при этом я использовал пример GLPaint, включенный в SDK, в качестве отправной точки. Мой код работает нормально сам по себе, но как только я перенесу все в свое приложение, тот же код завершится ошибкой.
В зависимости от того, что я пытаюсь сделать, проблема в том, что (1) примитивы кажутся сплющенными при первом рисовании, а затем всплывают в верхнюю часть экрана при рисовании последующих примитивов, или (2) примитивы вообще не появляются .
Я сузил его до того факта, что мое приложение требует изменения размера CAEAGLLayer. Он находится в UIScrollView и может быть перемещен и изменен в любое время (сжатие, перетаскивание и т. Д.). Как и в примере с GLPaint, я удаляю буфер кадра и воссоздаю его каждый раз, когда размер представления изменяется (через layoutSubviews), но это не т работа. (Так как пример GLPaint никогда не изменяет размеры, я подозреваю, что эта часть кода примера никогда не работала, так как в этом никогда не было необходимости.)
Только если я установлю CAEAGLLayer на постоянный размер 1024 x 768, код будет работать как положено:
self.layer.frame = CGRectMake(0, 0, 1024, 768);
Как только я изменю эту строку на:
self.layer.frame = self.bounds;
проблемы возвращаются. Остальная часть моего метода layoutSubviews выглядит так:
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];
if (needsClearView) {
[self clearView];
needsClearView = NO;
}
Методы destroyFramebuffer и createFramebuffer практически не отличаются от примера GLPaint. Единственный другой код, который ссылается на размер представления, это строки в initWithCoder:
glOrthof(0, self.bounds.size.width, 0, self.bounds.size.height, -1, 1);
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
Я пытался изменить значения здесь и переместить эти строки в другое место, но ничего из того, что я пробовал, не сработало. У кого-нибудь есть предложения для меня?