FBO не работают должным образом в OSX - PullRequest
0 голосов
/ 01 августа 2011

У меня была эта проблема в течение некоторого времени, и я не мог найти решение.

Здесь я инициализирую Framebuffer:

//Initialize buffers
    glGenBuffers(1, &primaryBuffer);
    glBindBuffer(GL_FRAMEBUFFER, primaryBuffer);

    glGenRenderbuffers(1, &depthBuffer);
    glBindBuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Statics::ScreenWidth, Statics::ScreenHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

    glGenTextures(1, &colorTexture);
    glBindTexture(GL_TEXTURE_2D, colorTexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,  Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    glGenTextures(1, &depthTexture);
    glBindTexture(GL_TEXTURE_2D, depthTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32,  Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);

    int res = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (res == GL_FRAMEBUFFER_COMPLETE)
    {
        printf("GOOD!\n");
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

Я использую его в функции рендеринга следующим образом:

glBindFramebuffer(GL_FRAMEBUFFER, primaryBuffer);
glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

SetCamera();
DrawScene1();

glBindFramebuffer(GL_FRAMEBUFFER, 0);

glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetCamera();
DrawScene2();

То, что здесь должно произойти, это то, что "scene1" визуализируется в прикрепленной текстуре Framebuffer. И «scene2» должен появиться на экране. «scene2» действительно появляется на экране, но когда я использую визуализированную текстуру Framebuffer, это то, что появляется: Looks like some GPU memory garbage! :)

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

1 Ответ

2 голосов
/ 21 августа 2011

Из того, что вы написали, я понял, что DrawScene2 () должен отрисовывать всю сцену, а DrawScene1 () - в части того, что было создано DrawScene2 ().

Поскольку вы не предоставили никаких подробностей (или всего кода) DrawScene2 (), я могу только сделать обоснованное предположение: проблема будет в DrawScene2 (). Поскольку вы используете результат DrawScene1 () в качестве источника рендеринга, вы, вероятно, просто ударили весь объект FBO по цели рендеринга, вместо того, чтобы рассматривать его как обычную текстуру, то есть настраивать надлежащий мир и координаты текстуры для него до того, как он получит визуализированный (то есть границы двери, отрисованной DrawScene2 (), которую вы хотите «нарисовать» с помощью функции DrawScene1 ()).

...