установить свойства CAEAGLLayer для OpenGL ES? - PullRequest
1 голос
/ 28 января 2012

Используя объекты кадрового буфера для рендеринга на 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;
}

1 Ответ

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

Правильный ответ:

UIKit объединяет воедино определенные операции и откладывает их до поздней стадии в цикле выполнения.Это потому, что у вас может быть код, который изменяет размер представления и изменяет различные фрагменты текста внутри него.Вы, вероятно, хотите, чтобы это происходило атомарно.

Для вас это, вероятно, означает, что слой еще не был измерен.Вы пытались переместить то, что у вас есть, на - (void)layoutSubviews?

Если вы планируете использовать только iOS 5, вы можете просто использовать GLKView и избегать написания какого-либо из этих материалов длясебя.

Другие комментарии:

glRenderbufferStorage создаст хранилище в непрозрачном месте, в которое OpenGL может нарисовать, но как ОС должна угадать, какой из ваших кадровых буферов вы хотитепоказать пользователю, а не просто быть промежуточным результатом?Спецификация OpenGL явно не определяет, как вы сообщаете это вашей конкретной ОС.В iOS это достигается с помощью renderbufferStorage:fromDrawable: - это говорит о том, что нужно добавить хранилище, равное CALayer, которое iOS знает, как составлять.Метод Apple не является заменой glRenderbufferStorage, он делает то, что glRenderbufferStorage не может и не должен, и часто вы используете его вместо этого даже при программировании только для iOS.

- (id)initWithFrame: - это инициализатор, который вы бы использовали, если бы создавали представление вручную.- (id)initWithCoder: используется системой для загрузки вида из NIB.

Ваш UIView определенно указал layerClass как CAEAGLLayer?Если нет, то вызов вашего контекста EAGL будет разрешен с ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...