Рендеринг в текстуру или закадровый буфер кадра

У меня проблема с отрисовкой текстуры и закадрового буфера кадра с OpenGLES на iPhone.

alt text
(источник: imagehost.org)
 alt text
(источник: imagehost.org)

Первое изображение показывает плитки маджонга, отрендеренные непосредственно в CAEAGLLayer, и это правильно. Второй показывает тайлы, отрендеренные в закадровый буфер кадра, скопированные в текстуру с использованием glCopyTexImage2D и текстуру, отрендеренную в CAEAGLLayer. Оба используют белый непрозрачный четырехугольник в качестве фона. Я также пробовал рендерить непосредственно в текстуру, но эффект был таким же, как и с закадровым буфером кадра.

Мой код для создания фреймбуфера:

    GLuint framebuffer;
    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    GLuint renderbuffer;
    glGenRenderbuffersOES(1, &renderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES,
            512, 512);

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
            GL_RENDERBUFFER_OES, renderbuffer);

Я рисую все плитки из атласа текстуры одним вызовом glDrawElements, используя VBO для передачи данных чересстрочных вершин (координаты, координаты текстуры, цвет). Я использую формат текстуры RGBA8888, рисуя каждое изображение на двух треугольниках (четырехугольниках) с функцией смешивания glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Я не использую буфер глубины (во всех случаях).

Может кто подскажет, в чем может быть проблема?


person sfider    schedule 03.05.2010    source источник
comment
Что не так в визуализированных изображениях? Как вы ожидаете, что они будут выглядеть?   -  person Frogblast    schedule 04.05.2010
comment
@Frogblast Первый, который не отображается ни в закадровом буфере кадра, ни в текстуре, является правильным.   -  person sfider    schedule 04.05.2010
comment
Показано недостаточно кода. Вероятно, проблема не в FBO.   -  person Razzupaltuff    schedule 22.08.2011
comment
возможно проблема с режимом наложения; проверьте настройки альфа-канала и режима наложения (или почтовый индекс здесь)   -  person    schedule 10.10.2011


Ответы (1)


Кажется, что вы не опубликовали достаточно кода, но из того, что было опубликовано, кажется, что вы объединили воедино роли текстуры и буфера рендеринга в своем FBO. (заголовок вашего поста сказал, что рендеринг в текстуру) Также вы забыли определить буферы отрисовки.

Буфер рендеринга, прикрепленный к FBO, обычно используется как буфер глубины. Поэтому попробуйте следующее:

GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

//set up the Depth Buffer
GLuint renderbuffer;
glGenRenderbuffersOES(1, &renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24,
        512, 512);

glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT,
        GL_RENDERBUFFER_OES, renderbuffer);
//set up the texture that you will be rendering to
glActiveTexture(GL_TEXTURE0);
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//add various other texture parameters here
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8_OES, 512,512);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
// define your draw buffers
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, drawBuffers);

надеюсь, это поможет

person Gal Kamar    schedule 18.06.2015