<script id="shader-feed-vs" type="x-shader/x-vertex">#version 300 es in vec4 aPos; void main(void) { gl_PointSize = 20.; gl_Position = vec4(-aPos.x, aPos.yzw); } </script>transformFeedbackVaryings links gl_Position to transformFeedback output
... var prog = gl.createProgram() gl.attachShader(prog, getShader( gl, "shader-feed-vs" )) gl.attachShader(prog, getShader( gl, "shader-fs" )) gl.transformFeedbackVaryings( prog, ["gl_Position"], gl.SEPARATE_ATTRIBS ) gl.linkProgram(prog)We prepare 2 buffers, create TransformFeedback object and call draw() function
... bufA = gl.createBuffer() gl.bindBuffer(gl.ARRAY_BUFFER, bufA) gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([.8,0,0,1]), gl.DYNAMIC_COPY) bufB = gl.createBuffer() gl.bindBuffer(gl.ARRAY_BUFFER, bufB) gl.bufferData(gl.ARRAY_BUFFER, 4*4, gl.DYNAMIC_COPY) var transformFeedback = gl.createTransformFeedback() gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback) draw() }In draw() we bind 2 buffers, begin TransformFeedback and draw points
function draw(){ gl.clear(gl.COLOR_BUFFER_BIT) gl.bindBuffer(gl.ARRAY_BUFFER, bufA) gl.vertexAttribPointer(aPosLoc, 4, gl.FLOAT, gl.FALSE, 0, 0) gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, bufB) gl.beginTransformFeedback(gl.POINTS) gl.drawArrays(gl.POINTS, 0, 1) gl.endTransformFeedback() gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null) var t = bufA; bufA = bufB; bufB = t }Points from vertex shader output are transfered into bufB. Then we unbind it and swap buffers for the next draw.
[1] D.Ginsburg, B.Purnomo
OpenGL ES 3.0 Programming Guide. Second Edition
[2] D.Shreiner, G.Sellers, J.Kessenich, B.Licea-Kane
OpenGL Programming Guide. Eighth Edition
The Official Guide to Learning OpenGL, Version 4.3