Transform Feedback implementation

Hi !
I’m trying to implement an algorithm using Transform Feedback feature but I’m having trouble reading the data back to process them. I may do something wrong but I really can’t figure out what. Please help !

Here is the initialization stuff:


// Data structure to store Eye space position and Screen Space position
struct ES_AND_SS {
float x,y,z;
int u,v;
};

// Buffer to store data
ES_AND_SS* tabData;

// Varying names to be recorded from vertex shader output
static const char* varyingNames[] = {
“ESPosition”,
“ssCoord”
};

// Initializing data buffer
glTransformFeedbackVaryings(myProgramID,2,varyingNames,GL_INTERLEAVED_ATTRIBS);

glGenBuffers(1,&bufferID);
size = 1000;

// Allocate space
tabData = new ES_AND_SS[size];
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,size*sizeof(ES_AND_SS), NULL, GL_DYNAMIC_READ);


// When rendering:
myProgram->activate();
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER,bufferID);
glBeginTransformFeedback(GL_POINTS);

//… draw some vertices …

myProgram->deactivate();
glEndTransformFeedback();

// Reading back data
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, size*sizeof(ES_AND_SS), tabData);

// unbind
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER,0);


But when parsing my data buffer I just get crappy values.
What the hell am I doing wrong ?

Thanks for your answers

You must re-link your program after glTransformFeedbackVaryings call.

I tried this already and it fails in another way.
If I re-link my program I get no vertices transform !! I checked using a GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN query and it returns 0. Weird huh ?

Try to deactivate() your program after glEndTransformFeedback() not before.

Done… but it doesn’t solve the problem :frowning:

Ok I’ve got one of the answer: DO NOT FORGET TO BIND YOUR BUFFER BEFORE CALLING glBufferData(…)

So now the glGetBufferSubData(…) is ok but I still read 0.0 in all my data :frowning:

After many tests I realized that INTERLEAVED mode of transform feedback simply doesn’t work, whereas SEPARATE mode works very well (driver bug ?). So much time lost for this :frowning:

So don’t use GL_INTERLEAVED_ATTRIBS but GL_SEPARATE_ATTRIBS instead !!