Hi all
I wasn’t sure where to post this, since the topic is advanced but I am not an expert in OpenGL.
Anyways, here it goes.
I am working on a deferred shader and I am trying to get the depth pass working but so far I can’t manage to draw in the screen with the frame buffer.
Here is the code:
void initFBO(int w, int h){
GLenum FBOstatus;
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0 );
//create FBO
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depthTexture, 0 );
FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) {
printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO
");
checkFramebufferStatus(FBOstatus);
}
glClear(GL_DEPTH_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
void draw_depth(){
glBindTexture(GL_TEXTURE_2D, depthTexture);
glDepthMask(true);
glmDraw(model, GLM_NONE);
}
void bindFBO() {
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0); //Bad mojo to unbind the framebuffer using the texture
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glClear(GL_DEPTH_BUFFER_BIT);
//glColorMask(false,false,false,false);
glEnable(GL_DEPTH_TEST);
}
void setTextures() {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//glColorMask(true,true,true,true);
glDisable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);
}
void display(void){
bindFBO();
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glDisable(GL_BLEND);
glEnable(GL_DEPTH);
glEnable(GL_DEPTH_TEST);
//glDepthFunc(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthRange(0.0, 1.0);
glDisable(GL_TEXTURE_2D);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glClearColor(0.0f,0.0f,0.0f,1.0f);
//glClearDepth(1.0);
glColorMask(true,true,true,true);
//glDepthMask(true);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, 1.0, 0.1, 10000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
setTextures();
draw_depth();
glutPostRedisplay();
glutSwapBuffers();
}
void init() {
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f, 0.0f, 0.0f,1.0f);
}
//Loads the model by calling the corresponding glm function
void loadModel(){
char file_path[200];
char filename[50];
std::cin >> filename;
strcpy(file_path,path);
strcat(file_path,filename);
model = glmReadOBJ(file_path);
}
int main (int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
width = 600;
height = 600;
glutInitWindowSize(width,height);
glutCreateWindow("Deferred Shading");
//glewInit();
GLenum err = glewInit();
if (GLEW_OK != err)
{
/* Problem: glewInit failed, something is seriously wrong. */
cout << "glewInit failed, aborting." << endl;
exit (1);
}
cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << endl;
cout << "OpenGL version " << glGetString(GL_VERSION) << " supported
" << endl;
initFBO(width, height);
init();
//getting and loading the model
loadModel();
while(!model){
printf( "
Model wasn't loaded. Try again.
" );
loadModel();
}
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
My guess is that either I am doing something wrong in the display function or it has something to do with the obj loader i am using, which is glm and rather old. It uses glBegin and glEnd to draw, but I am not sure if this should be done in another way.
Thanks