Sign in to follow this  
GloW_on_dub

OpenGL Reading from Texture2D filled by the FBO

Recommended Posts

Hello. I'm currently impementing Dpeht peeling algorithm. So i need to 1.render a scene. 2.Copy the depth buffer into a texture 3.give the texture to my fragment shader 4.rerender with activate depth test in my fragment shader I currently try to copy the depth buffer into a texture, i think it's working but i need to display the depth values to check it. in the same way, i have a color texture filled so by the fbo, before i display just the color_attachement0EXT with printf to check each pixel but now i'm trying to display the texture i suposed to be right atttached with the fbo. For this two case, i have incorrect results (seems like unallocated memory) here is my code (i dont know how to format it, please modo help) :
GLuint fbo;
GLuint img;	
GLuint txDepth;


int onlyFirst(const mesh_t *mesh,
face_t** boundary_face,
index_t* num_boundary_faces,real3 * origin, real3 * dir,real3 * up,unsigned int W,unsigned int H,float fovy,float near,float far)

{

    
    GLuint program;     /* notre program */

    int use_shaders = 0;/* booleen indiquant si l'on utilise les shaders */

    

    /* initialisation de la SDL en mode OpenGL */

    if(SDL_Init(SDL_INIT_VIDEO) < 0)

        exit(EXIT_FAILURE);

    if(SDL_SetVideoMode(W, H, 32, SDL_OPENGL) == NULL)

        ShutDown(EXIT_FAILURE);

    

    /* nom de la fenetre */

    SDL_WM_SetCaption("GLSL Shaders", NULL);



    /* initialisation de glew */

    glewInit();


     

  // Now setup a texture to render to

	glGenTextures(1, &img);

	glBindTexture(GL_TEXTURE_2D, img);

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  W, H, 0, GL_RGBA,          GL_UNSIGNED_BYTE, NULL);

		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);

		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);




//setup a depth texture
	glGenTextures(1, &txDepth);
	glBindTexture(GL_TEXTURE_2D, txDepth);
		

	
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
 //NULL means reserve texture memory, but texels are undefined
 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, W, H, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

glBindTexture( GL_TEXTURE_2D, 0 );


// Setup our FBO

	glGenFramebuffersEXT(1, &fbo);

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);


// And attach it to the FBO so we can render to it

	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, img, 0);
// And attach it to the FBO so we can render to it
	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, txDepth, 0);

	

GLubyte * data;
data = (GLubyte*)malloc(W*H*4*sizeof(GLubyte));
GLfloat * depthData;
depthData = (GLfloat*)malloc(W*H*sizeof(GLfloat));
int i;



GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);

	if(status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
printf("status :%u",status);

		exit(1);
}

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

// First we bind the FBO so we can render to it

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);

// Save the view port and set it to the size of the texture

 glEnable(GL_DEPTH_TEST);
glClearColor(255,255,255,255);



// S e t t h e p r o j e c t i o n t r a n s f o r m
glMatrixMode (GL_PROJECTION ) ;
glLoadIdentity ( ) ;
gluPerspective( fovy, (GLfloat)W/(GLfloat)H,near, far ); 


// S e t t h e camera o r i e n t a t i o n :
glMatrixMode (GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(origin->x, origin->y, origin->z,origin->x+dir->x,origin->y+dir->y,origin->z+dir->z, up->x, up->y, up->z);

 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

       


draw(mesh,
boundary_face,
num_boundary_faces);



   

//Recuperation des donées de la texture de rendu

/*glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
    glReadPixels(0, 0, W, H,GL_RGBA,GL_UNSIGNED_BYTE,data);   */
// the way i can get the pixel color before.

glBindTexture(GL_TEXTURE_2D, img);
   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA8, GL_UNSIGNED_BYTE, data);
//the way not working
printf("BEGIN_RESULTS ONLY_FIRST \n"); 
    for (i=0; i<(W*H*4); i=i+4) 
{
	printf("row =%u :",(i/4)/W);
	printf("column =%u :",(i/4)%W);
	printf("%u\n",indexConvert(data[i],data[i+1],data[i+2],data[i+3]));
}

glBindTexture(GL_TEXTURE_2D, txDepth);
   glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, depthData); 
printf("BEGIN_RESULTS ONLY_FIRST \n"); 
    for (i=0; i<(W*H*4); i=i+4) 
{
	printf("row =%u :",(i/4)/W);
	printf("column =%u :",(i/4)%W);
	printf("%f\n",depthData[i]);
}


printf("END_RESULTS ONLY_FIRST \n"); 



 
free(data);
free(depthData);
 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
	glDeleteFramebuffersEXT(1, &fbo);

	glDeleteTextures(1,&img);
	glDeleteTextures(1,&txDepth);

    

    return EXIT_SUCCESS;

}


void colorConvert(unsigned int index)
{
GLubyte * pIdx = (GLubyte*)&index;
glColor4ub(pIdx[0],pIdx[1],0,0);

}

int indexConvert(GLushort r,GLushort g, GLubyte b, GLubyte a)
{
unsigned int idx;
GLubyte * pIdx=(GLubyte*)&idx;
pIdx[0]=r;
pIdx[1]=g;
pIdx[2]=b;
pIdx[3]=a;

return idx;
}

void draw(
const mesh_t *mesh,
face_t** boundary_face,
index_t* num_boundary_faces)
{
glMatrixMode (GL_MODELVIEW) ;
     glBegin(GL_QUADS);
glPushMatrix();

            colorConvert(1001);
glVertex3f(-10, 0, 2 );
glVertex3f( 10,0, 2);
glVertex3f( 10,-10,2); 
glVertex3f( -10,-10,2); 

glPopMatrix();
glEnd();
}



i know there is some strange things in my code i havent explain, but there is no incidence on my current problem.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this