PDA

View Full Version : transform feedback buffer - drawing from it and printing from it



driver
10-27-2012, 08:34 PM
Hi

I seem to be able to draw from my transform feedback buffer but i cannot seem to print legit values from the buffer (i only seem to get zeros). also, what's strange is that when i try to check the number of primitves written out, i seem to be getting 0. If I can attach the transform feedback buffer to the GL_ARRAY_BUFFER and sucessfully draw it, then shouldn't the number of primitives written out using glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRIT TEN,one_query); return a non-zero value and shouldn't i be getting non-zero values from my buffer when i print it?

Below are the relevant portion of my code


GLuint tfbo,one_query,result;
GLfloat *printableData;
GLuint vao;

void renderScene(void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
gluLookAt(0.0,0.0,5.0,
0.0,0.0,-1.0,
0.0f,1.0f,0.0f);

glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glRotatef(a,0,1,1);

createTransformFeedback();

glBindVertexArray(vao); //this has data that i can use to draw out successfully
glEnable(GL_RASTERIZER_DISCARD);
glGenQueries(1,&one_query);
glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRIT TEN,one_query);


glBeginTransformFeedback(GL_TRIANGLES);

glDrawArraysInstanced(GL_TRIANGLES, 0, 4, 40);

glEndTransformFeedback();

glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTE N);
glGetQueryObjectuiv(one_query,GL_QUERY_RESULT,&result);

glDisable(GL_RASTERIZER_DISCARD);


//draws out from the transfer feedback buffer - THIS DRAWS WHEN UNCOMMENTED!!!!!
//glBindBuffer(GL_ARRAY_BUFFER,0);
//glBindBuffer(GL_ARRAY_BUFFER,tfbo);
//glDrawArraysInstanced(GL_TRIANGLES, 0, 4,12);


printBuffer();
printf("query result%d\n",result);


a+=0.1;

glutSwapBuffers();
}


void createTransformFeedback(){
//create the buffer that will store the tranform feedback data
glGenBuffers(1,&tfbo);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER,tfbo);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,sizeof(f loat)*16,NULL,GL_DYNAMIC_COPY);


//associated output from vertex shader to the transform feedback buffer
static const char* tf_varyings[]={"outpos"};
glTransformFeedbackVaryings(p,1,tf_varyings,GL_INT ERLEAVED_ATTRIBS);
glLinkProgram(p);
}

void printBuffer(){

printableData=(float *)malloc(16*sizeof(float));
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER,tfbo);

printableData=(GLfloat *)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_ONLY);
if(printableData!=(GLfloat *) NULL){
for(int i=0;i<16;i++)
printf("x y z : %0.2f %0.2f %0.2f\n ",printableData[i+2],printableData[2*i+2],printableData[3*i+2]);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
}


Inside main function,
glutDisplayFunc(renderScene);


I seem to get these print out results



x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
x y z : 0.00 0.00 0.00
query result0

Dark Photon
10-28-2012, 11:12 AM
Please use [ code ] ... [ /code ] or [ highlight=cpp ] ... [ /highlight ] tags (without quotes) to mark your source code -- keeps the indentation and makes it more readable. I've inserted them for you.

Also, check for GL errors with glGetError. For instance, call a function like this:


void check( const char header[] )
{
bool found = false;
int err;

while ( ( err = glGetError() ) != GL_NO_ERROR )
{
fprintf( stderr, "GL ERROR at %s: %s\n", header, gluErrorString(err) );
found = true;
}

if ( found )
exit(1);
}

Dan Bartlett
10-28-2012, 12:01 PM
This bit of code:

//draws out from the transfer feedback buffer - THIS DRAWS WHEN UNCOMMENTED!!!!!
//glBindBuffer(GL_ARRAY_BUFFER,0);
//glBindBuffer(GL_ARRAY_BUFFER,tfbo);
//glDrawArraysInstanced(GL_TRIANGLES, 0, 4,12);
won't be drawing using data from tfbo, because changing GL_ARRAY_BUFFER by itself doesn't change where the vertex data is pulled from, it requires a glVertexAttribPointer call or changing the current VAO to do that. The triangles drawn will probably still be coming from your original data.