gl-pixel-stream
v1.2.0
Published
streaming gl.readPixels from an FBO
Downloads
110
Maintainers
Readme
gl-pixel-stream
Streams chunks of gl.readPixels
from the specified FrameBuffer Object. This is primarily useful for exporting WebGL scenes and textures to high resolution images (i.e. print-ready).
Before calling this method, ensure your FBO is populated with the content you wish to export. On each chunk, this will bind the given FBO, set the viewport, read the new pixels, and then unbind all FBOs.
The following image was generated with the demo.js in this module. This approach can render upwards of 10000x10000 images on a late 2013 MacBookPro.
(download full 3200x1800 image)
Install
npm install gl-pixel-stream --save
Example
A simple example with gl-fbo might look like this:
var pixelStream = require('gl-pixel-stream')
// bind your FBO
fbo.bind()
// draw your scene to it
drawScene()
// get a pixel stream
var stream = pixelStream(gl, fbo.handle, fbo.shape)
// pipe it out somewhere
stream.pipe(output)
A more practical example involves streaming through png-stream/encoder to a write stream. See demo.js for an example of this, which uses Electron (through hihat) to merge the WebGL and Node.js APIs.
See Running From Source for details.
Usage
stream = glPixelStream(gl, fboHandle, shape, [opts])
Creates a new stream which streams the data from gl.readPixels
, reading from the given FrameBuffer. It is assumed to already be populated with your scene/texture.
The stream emits a Buffer
containing the uint8 pixels, default RGBA.
gl
(required) the WebGL contextfboHandle
(required) the handle for the WebGLFramebuffer instanceshape
(required) an Array, the[width, height]
of the outputopts
(optional) additional settings
The additional settings can be:
chunkSize
(Number) the number of rows to fetch from the GPU in a single call togl.readPixels
, defaults to 128flipY
(Boolean) whether to flip the output image on the Y axis (default false)format
a WebGL format likegl.RGBA
orgl.RGB
for reading, defaultgl.RGBA
stride
(Number) the number of channels in a pixel, guessed from the specifiedformat
, or defaults to4
onProgress
(Function) a function that has anevent
parameter withcurrent
andtotal
chunk count, as well asbounds
array with[ x, y, width, height ]
from readPixels
Running from Source
Clone and install:
git clone https://github.com/Jam3/gl-pixel-stream.git
cd gl-pixel-stream
npm install
To run the tests:
npm run test
To run the demo in "production" mode (no DevTools window). This will output an image.png
in the current folder.
npm run start
To run the demo in "development" mode. This opens a DevTools window and reloads the bundle on demo.js
file-save.
npm run dev
The output image.png
should look like this, and be the size specified in the demo.js
file:
License
MIT, see LICENSE.md for details.