i dont know why transform feedback isnt working :(

hi, i believe i am doing everything right for transform feedback but i am getting 0’s when i try to read the data back from the transform feedback buffer. Their is one thing i just realized i dont quite understand which is indexed binding points on a binding target, so that might be why, im gonna check my book to see what that means (i now understand this). its a short piece of code that i wrote and i would be grateful if someone would comb through it and tell me what is wrong. thanks :slight_smile:

if (glewInit() != GLEW_OK)
	{
		printf("glew could not load");
		exit(1);
	}
	
	const GLchar *varyings[] = {"colorstfout"};
	
        GLuint vao;
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);
	
	GLfloat feedback[12];
	
	glClearColor(0, 1, 0, 1);
	
	const char *vshaderambient = 
	"#version 430 core
"
	//"uniform vec4 colorobject;
"
	//"uniform vec4 colorlight;
"
	//"uniform float intensity;
"
	"vec4 colorstfout;
"
	"void main()
"
	"{
"
	"colorstfout = vec4(.5, .5, .5, .5);
"
	//"colorstfout = min(colorobject + (colorobject + colorlight * intensity), vec4(1, 1, 1, 1));
"
	"}
";
	
	GLuint progambient, vambient, tfo, buffercolorout;
	
	progambient = glCreateProgram();
	vambient = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vambient, 1, &vshaderambient, NULL);
	glCompileShader(vambient);
	glAttachShader(progambient, vambient);
	
	glLinkProgram(progambient);
	
	glGenTransformFeedbacks(1, &tfo);
	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo);
	
	glGenBuffers(1, &buffercolorout);
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffercolorout);
	glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(GLfloat) * 12, NULL, GL_STREAM_READ);
	
	glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffercolorout);
	
	glTransformFeedbackVaryings(progambient, 1, varyings, GL_SEPARATE_ATTRIBS);
	
	glLinkProgram(progambient);
	
	glBeginTransformFeedback(GL_TRIANGLES);
	
	glDrawArrays(GL_TRIANGLES, 0, 3);
	
	glEndTransformFeedback();
	
	glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(feedback), feedback);
	
	printf("
first vertex: %f, %f, %f, %f
", feedback[0], feedback[1], feedback[2], feedback[3]);
	printf("
second vertex: %f, %f, %f, %f
", feedback[4], feedback[5], feedback[6], feedback[7]);
	printf("
third vertex: %f, %f, %f, %f
", feedback[8], feedback[9], feedback[10], feedback[11]);

i changed the code a bit and it is now working. here is a copy of the code i wrote:

if (glewInit() != GLEW_OK)
	{
		printf("glew could not load");
		exit(1);
	}
	
	const GLchar *varyings[] = {"colorstfout"};
	
	GLfloat feedback[12];
	
	glClearColor(0, 1, 0, 1);
	
	const char *vshaderambient = 
	"#version 430 core
"
	//"uniform vec4 colorobject;
"
	//"uniform vec4 colorlight;
"
	//"uniform float intensity;
"
	"out vec4 colorstfout;
"
	"void main()
"
	"{
"
	"colorstfout = vec4(1, 1, 1, 1);
"
	//"colorstfout = min(colorobject + (colorobject + colorlight * intensity), vec4(1, 1, 1, 1));
"
	"}
";
	
	GLuint progambient, vambient, tfo, buffercolorout;
	
	progambient = glCreateProgram();
	vambient = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vambient, 1, &vshaderambient, NULL);
	glCompileShader(vambient);
	glAttachShader(progambient, vambient);
	
	glTransformFeedbackVaryings(progambient, 1, varyings, GL_SEPARATE_ATTRIBS);
	
	glLinkProgram(progambient);
	glUseProgram(progambient);
	
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);
	
	glGenBuffers(1, &buffercolorout);
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffercolorout);
	glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(GLfloat) * 12, NULL, GL_STREAM_READ);
	
	glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffercolorout, 0, sizeof(GLfloat) * 12);
	
	glEnable(GL_RASTERIZER_DISCARD);
	
	glBeginTransformFeedback(GL_TRIANGLES);
	
	glDrawArrays(GL_TRIANGLES, 0, 3);
	
	glEndTransformFeedback();
	
	glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(feedback), feedback);
	
	glFlush();
	
	printf("
first vertex: %f, %f, %f, %f
", feedback[0], feedback[1], feedback[2], feedback[3]);
	printf("
second vertex: %f, %f, %f, %f
", feedback[4], feedback[5], feedback[6], feedback[7]);
	printf("
third vertex: %f, %f, %f, %f
", feedback[8], feedback[9], feedback[10], feedback[11]);

im gonna compare the two and find out what i did wrong. PEEEEEACE :slight_smile: