Reading from Texture2D filled by the FBO

Started by
-1 comments, last by GloW_on_dub 14 years ago
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,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);
}


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.

This topic is closed to new replies.

Advertisement