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.
Reading from Texture2D filled by the FBO
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) :
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement