Как отвязать glBindFramebuffer в C ++ OpenGLES IOS - PullRequest
0 голосов
/ 27 июня 2019

Я портирую программу на Windows и Android на iOS.следующий код работает на обеих платформах, но на ios он останавливается рендерингом после выполнения этого кода, я подозреваю, что привязка никогда не разворачивается, каков правильный способ сделать это?

цель кодачтобы получить текстуры пикселей.

это код:

void Texture::Bind()
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, mTextureID);
}

GLubyte* Texture::GetPixels()
{
    Bind();

    int data_size = mWidth * mHeight * 4;

    GLubyte* pixels = new GLubyte[data_size];
#ifdef _WIN32
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
#else
    GLuint fbo;
    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureID, 0);

    glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glDeleteFramebuffers(1, &fbo);
#endif 
    return pixels;
}

1 Ответ

0 голосов
/ 27 июня 2019

iOS не работает с кадровым буфером по умолчанию с индексом 0. Вам нужно привязать буфер, который вы используете в качестве основного. Это зависит от используемого вами инструмента, но если вы используете UIView, то вы должны найти код, подобный следующему:

- (instancetype)initWithView:(UIView *)view {

    if((self = [super init])) {
        {
            GLuint bufferID = 0;
            glGenFramebuffers(1, &bufferID);
            glBindFramebuffer(GL_FRAMEBUFFER, bufferID);
            self.frameBufferID = bufferID;
        }
        {
            GLuint bufferID = 0;
            glGenRenderbuffers(1, &bufferID);
            glBindRenderbuffer(GL_RENDERBUFFER, bufferID);
            view.layer.contentsScale = UIScreen.mainScreen.scale;
            [[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)view.layer];
            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, bufferID);
            self.colorBufferID = bufferID;

            GLint width, height;
            glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &width);
            glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);

            self.bufferWidth = width;
            self.bufferHeight = height;
        }
    }
    return self;

}

Вы ищете звонок для renderbufferStorage:fromDrawable:. Рядом с ним должен быть создан кадровый буфер, который связан с этим буфером рендеринга. Идентификатор этого буфера кадра - это то, что вам нужно связать.

Так что в приведенном выше примере вы бы использовали self.frameBufferID.

Что касается опубликованного фрагмента, то он является частью проекта, который генерирует фрейм и буфер рендеринга из заданного UIView. Сначала он генерирует кадровый буфер и связывает его. Следующий буфер рендеринга создан и привязан. Буфер рендеринга затем настраивается через собственный код iOS со слоем. Мы прикрепляем буфер рендеринга к кадровому буферу. В конце ширина и высота извлекаются.

Перед рисованием к этому объекту вызывается следующий bind метод:

- (void)bind {
    glBindFramebuffer(GL_FRAMEBUFFER, self.frameBufferID);
    glBindRenderbuffer(GL_RENDERBUFFER, self.colorBufferID);
}
...