Визуализация в текстуру или закадровый кадровый буфер - PullRequest
6 голосов
/ 03 мая 2010

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

alt text http://j.imagehost.org/0923/IMG_0020.png alt texthttp://j.imagehost.org/0725/IMG_0019.png

Первое изображение показывает плитки маджонга, визуализированные непосредственно в 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)Функция смешивания. Я не использую буфер глубины (во всех случаях).

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

1 Ответ

0 голосов
/ 18 июня 2015

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

Буфер рендеринга, прикрепленный к 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);

надеюсь, что помогает

...