// create shader const GLchar* vertexShaderSrc = "in float inValue; out float outValue; void main() { outValue = sqrt(inValue); } );"; GLuint shader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(shader, 1, &vertexShaderSrc, 0); glCompileShader(shader); GLuint program = glCreateProgram(); glAttachShader(program, shader); const GLchar* feedbackVaryings[] = { "outValue" }; glTransformFeedbackVaryings(program, 1, feedbackVaryings, GL_INTERLEAVED_ATTRIBS); glLinkProgram(program); glUseProgram(program); GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLfloat data[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f }; // create input buffer GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); GLint inputAttrib = glGetAttribLocation(program, "inValue"); glEnableVertexAttribArray(inputAttrib); glVertexAttribPointer(inputAttrib, 1, GL_FLOAT, GL_FALSE, 0, 0); // create output buffer GLuint tbo; glGenBuffers(1, &tbo); glBindBuffer(GL_ARRAY_BUFFER, tbo); glBufferData(GL_ARRAY_BUFFER, sizeof(data), 0, GL_STATIC_READ); // transform glEnable(GL_RASTERIZER_DISCARD); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo); glBeginTransformFeedback(GL_POINTS); glDrawArrays(GL_POINTS, 0, 5); glEndTransformFeedback(); glFlush(); // write output GLfloat *feedback; feedback = glMapBufferRange(GL_ARRAY_BUFFER, 0, sizeof(feedback), GL_MAP_READ_BIT); NSLog(@"%f %f %f %f %f\n", feedback[0], feedback[1], feedback[2], feedback[3], feedback[4]);
The value of data[] is never changed and NSLog crashes because glMapBufferRange returns a null pointer. How do you do transform feedback on iOS?