Используя объекты кадрового буфера для рендеринга на iOS, который, по-видимому, является предпочтительным способом рендеринга для iOS на iOS в соответствии с Руководством по программированию OpenGL ES для iOS от Apple, следует использовать glRenderbufferStorage () для указания таких свойств, как ширина и высотав соответствии с Руководством по программированию OpenGL ES 2.0 от Munshi, Ginsburg и Shreiner.Apple заменяет это на renderbufferStorage: fromDrawable: сообщение, отправленное на EAGLContext в вышеприведенном руководстве.
Затем Apple продолжает запись, чтобы выбрать ширину и высоту из Renderbuffer, поскольку этот буфер устанавливает их при создании без дополнительных подробностей.
Хотя ширина и высота равны 0.
Ссылка на класс CAEAGLLayer пишет: «Установите границы слоя в соответствии с размерами дисплея».Класс CAEAGLLayer - это класс, который Apple хочет использовать в качестве базового класса представления, которое он использует.Это делается путем возврата его из метода layerClass в views.Этот CAEAGLLayer имеет только 1 свойство "drawableProperties", которое является NSDictionary.К сожалению, эта документация скудна.Размеры не могут быть установлены.
Таким образом: как продолжить установку свойств CAEAGLLayer для OpenGL ES?
Вот мой код до сих пор (Обратите внимание, что старый пример Apple использует initWithCoder, я либо догадался, либополучил откуда-то, я не помню, чтобы использовать initWithFrame):
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code
theCAEAGLLayer = (CAEAGLLayer*)self.layer;
theCAEAGLLayer.opaque = YES;
theEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:theEAGLContext];
glGenFramebuffers(1, &theFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, theFramebuffer);
glGenRenderbuffers(1, &theColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, theColorRenderbuffer);
[theEAGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:theCAEAGLLayer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, theColorRenderbuffer);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &widthOfTheColorRenderbuffer);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &heightOfTheColorRenderbuffer);
glGenRenderbuffers(1, &theDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, theDepthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, widthOfTheColorRenderbuffer, heightOfTheColorRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, theDepthRenderbuffer);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
}
}
return self;
}