With all of the buffers set up, we need two render passes. Before the first pass, we want to clear our buffers to default values (that is, empty lists), and to reset our atomic counter buffer to zero:
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, clearBuf); glBindTexture(GL_TEXTURE_2D, headPtrTex); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED_INTEGER, GL_UNSIGNED_INT, NULL); GLuint zero = 0; glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, counterBuffer); glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), &zero);
In the first pass, we'll render the full scene geometry. Generally, we should render all the opaque geometry first and store the results in a texture. However, we'll skip that step for this example ...