mirror of
https://github.com/visgl/luma.gl.git
synced 2025-12-08 17:36:19 +00:00
* Docs: Fix hyperlinks * Update website link generation * Replace website links with actual file path
191 lines
7.7 KiB
Markdown
191 lines
7.7 KiB
Markdown
# Renderbuffer
|
|
|
|
`Renderbuffer`s are WebGL Objects that contain textures. They are optimized for use as render targets, while vanilla `Texture`s may not be, and are the logical choice when you do not need to sample (i.e. in a post-pass shader) from the produced image. If you do need to sample (such as when reading depth back in a second shader pass), use [`Texture`](/docs/api-reference/webgl/texture.md) instead. In addition, in WebGL2, `Renderbuffer` can do [Multisampling (MSAA)](https://www.khronos.org/opengl/wiki/Multisampling) just like standard framebuffer.
|
|
|
|
For additional information, see [OpenGL Wiki](https://www.opengl.org/wiki/Renderbuffer_Object)
|
|
|
|
|
|
## Usage
|
|
|
|
Creating a `Renderbuffer`
|
|
```js
|
|
const renderbuffer = new Renderbuffer(gl, {format: GL.RGBA4, width: 100, height: 100});
|
|
```
|
|
|
|
Reformatting/reinitializing a `Renderbuffer`
|
|
```js
|
|
const renderbuffer = new Renderbuffer(gl, {format: GL.RGBA4, width: 100, height: 100});
|
|
renderbuffer.initialize({format: GL.RGB565, width: 50, height: 50});
|
|
```
|
|
|
|
Resizing a `Renderbuffer`
|
|
```js
|
|
const renderbuffer = new Renderbuffer(gl, {format: GL.RGBA4});
|
|
renderbuffer.resize({width: 200, height: 200});
|
|
```
|
|
|
|
Attaching a `Renderbuffer` to a `Framebuffer` (automatically resizes the `Renderbuffer`)
|
|
```js
|
|
framebuffer.attach({
|
|
[GL.DEPTH_ATTACHMENT]: new Renderbuffer(gl, {format: GL.DEPTH_COMPONENT16})
|
|
});
|
|
```
|
|
|
|
## Members
|
|
|
|
* `id` (string) - id for debugging
|
|
* `handle` (`WebGLRenderbuffer`) - the underlying WebGLRenderbuffer object
|
|
* `width` (number) - width of renderbuffer in pixels
|
|
* `height` (number) - height of renderbuffer in pixels
|
|
* `format` (number) - internal format of the renderbuffer (e.g. `GL.DEPTH_COMPONENT16`)
|
|
* `samples` (number) - samples (always `0` in non-WebGL2 contexts)
|
|
|
|
|
|
## Methods
|
|
|
|
### getSamplesForFormat (static method)
|
|
|
|
Queries valid sample counts for a `Renderbuffer` format. The sample counts can be provided as a parameter to the `Renderbuffer` constructor.
|
|
|
|
`Renderbuffer.getSamplesForFormat({format})`
|
|
|
|
* `format` (GLenum) - internal format of the renderbuffer (e.g. `GL.DEPTH_COMPONENT16`)
|
|
|
|
Returns (Number[]) - An list of valid sample counts in descending order.
|
|
|
|
If multisampling is not supported the returned value will be `[0]`, e.g. signed and unsigned integer internal formats in WebGL2. Note that this method always returns `[0]` in WebGL1.
|
|
|
|
### constructor
|
|
|
|
Creates a new `Renderbuffer` and initalizes it by calling `initialize` with the provided parameters.
|
|
|
|
`new Renderbuffer(gl, {id=, format, width, height, samples=})`
|
|
|
|
* `gl` (WebGLRenderingContext) - gl context
|
|
* `id`= (String) - optional string id
|
|
* `format` (GLenum) - internal format of the renderbuffer (e.g. `GL.DEPTH_COMPONENT16`)
|
|
* `width`=`1` (GLint) - width of renderbuffer in pixels
|
|
* `height`=`1` (GLint) - height of renderbuffer in pixels
|
|
* `samples`=0 (GLint) - (WebGL2) number of samples to be used for storage.
|
|
|
|
WebGL References [gl.createRenderbuffer](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createRenderbuffer), also see `initialize`.
|
|
|
|
### initialize
|
|
|
|
Creates and initializes a renderbuffer object's data store. Used to update a `Renderbuffer`s format and size after it was initially created.
|
|
|
|
`Renderbuffer.initialize({format, width, height, samples=})`
|
|
|
|
* `format` (GLenum) - internal format of the renderbuffer (e.g. `GL.DEPTH_COMPONENT16`)
|
|
* `width`=`1` (GLint) - width of renderbuffer in pixels
|
|
* `height`=`1` (GLint) - height of renderbuffer in pixels
|
|
* `samples`=0 (GLint) - (WebGL2) number of samples to be used for storage.
|
|
|
|
Returns itself to enable chaining
|
|
|
|
* `initialize` erases the current content of the `Renderbuffer`.
|
|
|
|
|
|
WebGL References [gl.renderbufferStorage](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/renderbufferStorage), [gl.renderbufferStorageMultisample](https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/renderbufferStorageMultisample) (WebGL2), [gl.bindRenderbuffer](WebGLRenderingContext.bindRenderbuffer())
|
|
|
|
### resize
|
|
|
|
Reinitializes the `Renderbuffer`'s data store with the new `width` and `height` but unchanged `format` (and `samples`, if available).
|
|
|
|
`Renderbuffer.resize({width, height})`
|
|
|
|
* `width` (GLint) - width of `Renderbuffer` in pixels
|
|
* `height` (GLint) - height of `Renderbuffer` in pixels
|
|
|
|
Returns itself to enable chaining
|
|
|
|
* Checks if `width` or `height` have actually changed before calling `initialize`.
|
|
* If a resize happens, `resize` erases the current content of the `Renderbuffer`.
|
|
|
|
WebGL References see `initialize`.
|
|
|
|
## Renderbuffer Formats
|
|
|
|
The "internal" format of the `Renderbuffer`.
|
|
|
|
| Value | Description |
|
|
| --- | --- |
|
|
| `GL.RGBA4` | 4 red bits, 4 green bits, 4 blue bits 4 alpha bits |
|
|
| `GL.RGB565` | 5 red bits, 6 green bits, 5 blue bits |
|
|
| `GL.RGB5_A1` | 5 red bits, 5 green bits, 5 blue bits, 1 alpha bit |
|
|
| `GL.DEPTH_COMPONENT16` | 16 depth bits |
|
|
| `GL.STENCIL_INDEX8` | 8 stencil bits |
|
|
|
|
This table lists the basic formats supported in WebGL1. For a full table of formats supported in WebGL2 and via WebGL extensions, see [Texture](/docs/api-reference/webgl/texture.md).
|
|
|
|
| Sized Internal Format | Format | Type | Depth Bits | Stencil Bits |
|
|
| --- | --- | --- | --- | --- |
|
|
| `GL.DEPTH_COMPONENT16` | `GL.DEPTH_COMPONENT` | `GL.UNSIGNED_SHORT`, `GL.UNSIGNED_INT` | 16 | 0 |
|
|
| `GL.DEPTH_COMPONENT24` | `GL.DEPTH_COMPONENT` | `GL.UNSIGNED_INT` | 24 | 0 |
|
|
| `GL.DEPTH_COMPONENT32F` | `GL.DEPTH_COMPONENT` | `GL.FLOAT` | f32 | 0 |
|
|
| `GL.DEPTH24_STENCIL8` | `GL.DEPTH_STENCIL` | `GL.UNSIGNED_INT_24_8` | 24 | 8 |
|
|
| `GL.DEPTH32F_STENCIL8` | `GL.DEPTH_STENCIL` | `GL.FLOAT_32_UNSIGNED_INT_24_8_REV` | f32 | 8 |
|
|
|
|
|
|
When using the WEBGL_depth_texture extension:
|
|
`GL.DEPTH_COMPONENT`
|
|
`GL.DEPTH_STENCIL`
|
|
When using the EXT_sRGB extension:
|
|
`EXT.SRGB_EXT`
|
|
`EXT.SRGB_ALPHA_EXT`
|
|
|
|
When using a WebGL 2 context, the following values are available additionally:
|
|
* `GL.R8`
|
|
* `GL.R16F`
|
|
* `GL.R32F`
|
|
* `GL.R8UI`
|
|
* `GL.RG8`
|
|
* `GL.RG16F`
|
|
* `GL.RG32F`
|
|
* `GL.RGUI`
|
|
* `GL.RGB8`
|
|
* `GL.SRGB8`
|
|
* `GL.RGB565`
|
|
* `GL.R11F_G11F_B10F`
|
|
* `GL.RGB9_E5`
|
|
* `GL.RGB16F`
|
|
* `GL.RGB32F`
|
|
* `GL.RGB8UI`
|
|
* `GL.RGBA8`
|
|
* `GL.SRGB_APLHA8`
|
|
* `GL.RGB5_A1`
|
|
* `GL.RGBA4444`
|
|
* `GL.RGBA16F`
|
|
* `GL.RGBA32F`
|
|
* `GL.RGBA8UI`
|
|
|
|
|
|
## Parameters
|
|
|
|
| Parameter | Type | Read/Write |Description |
|
|
| --- | --- | --- | --- |
|
|
| `GL.RENDERBUFFER_WIDTH` | GLint | R | height of the image of renderbuffer |
|
|
| `GL.RENDERBUFFER_HEIGHT` | GLint | R | height of the image of renderbuffer |
|
|
| `GL.RENDERBUFFER_INTERNAL_FORMAT` | GLenum | R | See below |
|
|
| `GL.RENDERBUFFER_GREEN_SIZE` | GLint | R | resolution (bits) of green color |
|
|
| `GL.RENDERBUFFER_BLUE_SIZE` | GLint | R | resolution (bits) of blue color |
|
|
| `GL.RENDERBUFFER_RED_SIZE` | GLint | R | resolution (bits) of red color |
|
|
| `GL.RENDERBUFFER_ALPHA_SIZE` | GLint | R | resolution (bits) of alpha component |
|
|
| `GL.RENDERBUFFER_DEPTH_SIZE` | GLint | R | resolution (bits) of depth component |
|
|
| `GL.RENDERBUFFER_STENCIL_SIZE` | GLint | R | resolution (bits) of stencil component |
|
|
| `GL.RENDERBUFFER_SAMPLES` (WebGL2) | GLint | R | |
|
|
|
|
## Limits
|
|
|
|
| Limit | | WebGL2 | WebGL1 |
|
|
| --- |--- | --- | --- |
|
|
| `GL.MAX_RENDERBUFFER_SIZE` | Max renderbuffer width/height | `>=2048` | `>=1` |
|
|
| `GL.MAX_SAMPLES` | Max samples for multisampling | `>=4` | `0` |
|
|
|
|
|
|
## Remarks
|
|
|
|
* The only way to work with a renderbuffer, besides creating it, is to attach it to a [`Framebuffer`](/docs/api-reference/webgl/framebuffer.md).
|
|
* A `Renderbuffer` cannot be accessed by a shader in any way.
|
|
* Multisampling is only available in WebGL2
|