объект framebuffer, проблемы с рендерингом и передачей текстуры в шейдер - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь визуализировать простую сцену в кадровый буфер, а затем передать ее в качестве текстуры в мой шейдер.Тем не менее, мой визуализированный объект выглядит черным.Я не могу понять, что я сделал неправильно.

В приведенном ниже коде я создаю FBO и присоединяю к нему буфер глубины и текстуру.

GLuint fbo, fboDepth,fboTexture;

// Create the texture
glGenTexturesEXT(1, &fboTexture);
glBindTextureEXT(GL_TEXTURE_2D, fboTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(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_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR );
// Create and bind an FBO
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbo);

// Create depth renderbuffer
glGenRenderbuffersEXT(1, &fboDepth);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepth);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 512, 512);

glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fboTexture, 0);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepth);

GLenum fboStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER_EXT);                                   

if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
    std::cout << "Couldn't create frame buffer" << std::endl;                               
    exit(0);                                                                                
} else {
    cout << fbo << fboTexture << fboDepth << endl;
}

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Reset framebuffer binding

Код ниже - мой метод рендеринга.Я пробовал его с текстурами TGA, и он хорошо работает.

 void Renderer::render(Geometry* geo) {
glUseProgram(geo->shader->program);

// Bind our frame buffer for rendering 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
glViewport(0, 0, 512, 512);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // render a triangle to the fbo
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex2f(-1,0);

glColor3f(0,1,0);
glVertex2f(1,-1);

glColor3f(0,0,1);
glVertex2f(.5,.5);
glEnd();

glPopAttrib(); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

GLuint texUniLoc = glGetUniformLocation(geo->shader->program, "Tex");

glActiveTexture(GL_TEXTURE0 + 1);
glBindTextureEXT(GL_TEXTURE_2D, fboTexture);
glUniform1i(texUniLoc, 1);

GLuint vpm = glGetUniformLocation(geo->shader->program, "ViewProjectionMatrix");
glUniformMatrix4fv(vpm, 1, GL_TRUE, ViewProjectionMatrix.vec);

float * m = (float*)malloc(sizeof(float)*16);
m[0] = 1;   m[1] = 0;   m[2] = 0;   m[3] = 0;
m[4] = 0;   m[5] = 1;   m[6] = 0;   m[7] = 0.0;
m[8] = 0;   m[9] = 0;   m[10] = 1;  m[11] = 0.0;
m[12] = 0;  m[13] = 0;  m[14] = 0;  m[15] = 1.0;

    GLuint model = glGetUniformLocation(geo->shader->program, "ModelMatrix");
glUniformMatrix4fv(model, 1, GL_TRUE, m);

// activate and specify pointer to vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_INDEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, geo->vertices);
glTexCoordPointer(2, GL_FLOAT, 0, geo->texcoords);
glDrawElements(GL_TRIANGLES,  2*3*32*32, GL_UNSIGNED_SHORT, geo->indices);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glUseProgram(0);
}

Я пробовал текстуры .TGA и шейдер работает хорошо.Я использую glfw и glew.Также я не уверен в разнице между glSomeFunction и glSomeFunctionEXT

1 Ответ

0 голосов
/ 13 марта 2012

Я исправил это. Я не должен вызывать glUseProgram перед рисованием треугольника.

...