Невозможно правильно отобразить текстуру из объекта буфера закадрового кадра в квад

Я работаю над проектом, в котором мне нужно получить поверхность из частицы SPH, имитирующей воду, чтобы сделать ее в мультяшном стиле. Чтобы сделать это, я следую методу, первым шагом которого является получение карты глубины из этого набора частиц, которую я пытаюсь визуализировать вне экрана, в объекте буфера кадра, и визуализировать на экране как тест, чтобы увидеть результаты. Пока что я не рендерил никаких частиц, так как сначала пытаюсь рендерить что-то на этом FBO и рендерить его на экране на четырехугольнике, следуя инструкции с сайта Swiftless. Конечно, я добавил метод, описанный там, в проект, над которым я работаю.

Моим первым шагом было нарисовать зеленый экран с серым чайником, который работал без проблем, как вы можете видеть здесь.

Затем я попытался вывести его за пределы экрана в FBO, а они отрисовали его в квад в середине экрана, но все, что я получил, - это зеленый квад, как вы можете видеть здесь.

Код, который я использую, взят из учебника, о котором я упоминал ранее, а именно:

Переменные:

GLuint fbo;
GLuint fbo_depth;
GLuint fbo_texture;

int windowWidth  = 1024;
int windowHeight = 768;

Настройка FBO и его текстур:

void initFrameBufferDepthBuffer () 
{
    glGenRenderbuffersEXT(1, &fbo_depth); // Generate one render buffer and store the ID in fbo_depth
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_depth); // Bind the fbo_depth render buffer  
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, windowWidth, windowHeight); // Set the render buffer storage to be a depth component, with a width and height of the window  

    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo_depth); // Set the render buffer of this buffer to the depth buffer  
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); // Unbind the render buffer 
}

void initFrameBufferTexture () 
{  
    glGenTextures(1, &fbo_texture); // Generate one texture  

    glBindTexture(GL_TEXTURE_2D, fbo_texture); // Bind the texture fbo_texture  

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, windowWidth, windowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // Create a standard texture with the width and height of our window  

    // Setup the basic texture parameters  
    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_TEXTURE_MAG_FILTER, GL_LINEAR);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  

    // Unbind the texture  
    glBindTexture(GL_TEXTURE_2D, 0);  
}

void initFrameBuffer () {  
    glEnable(GL_TEXTURE_2D); // Enable texturing so we can bind our frame buffer texture  
    glEnable(GL_DEPTH_TEST); // Enable depth testing

    initFrameBufferDepthBuffer(); // Initialize our frame buffer depth buffer  
    initFrameBufferTexture(); // Initialize our frame buffer texture  

    glGenFramebuffersEXT(1, &fbo); // Generate one frame buffer and store the ID in fbo  
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer  
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_texture, 0); // Attach the texture fbo_texture to the color buffer in our frame buffer
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo_depth); // Attach the depth buffer fbo_depth to our frame buffer

    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); // Check that status of our generated frame buffer  

    if (status != GL_FRAMEBUFFER_COMPLETE_EXT) // If the frame buffer does not report back as complete  
    {  
        printf ( "Couldn't create frame buffer\n");
    }  

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Unbind our frame buffer  

    glDisable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
} 

Рендеринг чайника на FBO:

void renderTeapotScene () 
{  
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer for rendering  
    glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); // Push our glEnable and glViewport states  
    glViewport(0, 0, windowWidth, windowHeight); // Set the size of the frame buffer view port  

    glClearColor (0.0f, 1.0f, 0.0f, 1.0f); // Set the clear colour  
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the depth and colour buffers  

    glLoadIdentity();  // Reset the modelview matrix  

    glTranslatef(0.0f, 0.0f, -5.0f); // Translate back 5 units  

    glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
    glutSolidTeapot(1.0f); // Render a teapot  

    glPopAttrib(); // Restore our glEnable and glViewport states  
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Unbind our texture  
} 

Настройка FBO для процесса, который происходит только один раз в начале приложения:

initFrameBuffer(); // Create our frame buffer object 

И весь процесс, который происходит в каждом кадре:

glEnable(GL_TEXTURE_2D); // Enable texturing so we can bind our frame buffer texture  
glEnable(GL_DEPTH_TEST); // Enable depth testing 

renderTeapotScene();

glLoadIdentity(); // Load the Identity Matrix to reset our drawing locations  
glTranslatef(0.0f, 0.0f, -10.0f);  

glBindTexture(GL_TEXTURE_2D, fbo_texture);  

glBegin(GL_QUADS);  
    glTexCoord2f(0.0f, 0.0f);  glVertex3f(-1.0f, -1.0f, 0.0f); // The bottom left corner  
    glTexCoord2f(0.0f, 1.0f);  glVertex3f(-1.0f, 1.0f, 0.0f); // The top left corner  
    glTexCoord2f(1.0f, 1.0f);  glVertex3f(1.0f, 1.0f, 0.0f); // The top right corner  
    glTexCoord2f(1.0f, 0.0f);  glVertex3f(1.0f, -1.0f, 0.0f); // The bottom right corner  
glEnd();  

glBindTexture(GL_TEXTURE_2D, 0);

glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);

Конечно, эти фрагменты кода находятся в гораздо более крупном проекте, и я думаю, что, возможно, он разрешает что-то, что может вызвать такое поведение, но я не знаю, что это могло бы быть. Я думаю, что важно сказать, что мой FBO имеет ту же ширину и высоту, что и буфер кадра экрана.

Ну, это мой сценарий сейчас. Кто-то знает, как я могу визуализировать первое изображение в квад по середине второго изображения в качестве текстуры?

0 ответов

Другие вопросы по тегам