icon
KOKI

WebGL2でFloatテクスチャを使う

2020/08/19

何度も間違えるのでメモ

1. 拡張機能をオンにする

const gl = c.getContext( 'webgl2' );
gl.getExtension( 'EXT_color_buffer_float' );

参考

EXT_color_buffer_float - Web APIs | MDN

2. gl.texImage2D()で適切なフォーマットを指定する

以下のようなコードであれば、

gl.texImage2D(
  gl.TEXTURE_2D,
  0,
  gl.RGBA,
  width,
  height,
  0,
  gl.RGBA,
  gl.UNSIGNED_BYTE,
  null,
);

以下のように書き換える。

gl.texImage2D(
  gl.TEXTURE_2D,
  0,
  gl.RGBA16F,
  width,
  height,
  0,
  gl.RGBA16F,
  gl.FLOAT,
  null,
);

RGBA の 4 チャンネルではなく、RED の 1 チャンネルだけ必要な場合など

void gl.texImage2D(target, level, internalformat, width, height, border, format, type, GLintptr offset);

引用: WebGLRenderingContext.texImage2D() - Web APIs | MDN

上のコードのinternalformat, format, type部分を下の表を参考に適切な組み合わせを選ぶ。

Internal Format Format Type
RGB RGB UNSIGNED_BYTE
UNSIGNED_SHORT_5_6_5
RGBA RGBA UNSIGNED_BYTE
UNSIGNED_SHORT_4_4_4_4
UNSIGNED_SHORT_5_5_5_1
LUMINANCE_ALPHA LUMINANCE_ALPHA UNSIGNED_BYTE
LUMINANCE LUMINANCE UNSIGNED_BYTE
ALPHA ALPHA UNSIGNED_BYTE
R8 RED UNSIGNED_BYTE
R16F RED HALF_FLOAT
FLOAT
R32F RED FLOAT
R8UI RED_INTEGER UNSIGNED_BYTE
RG8 RG UNSIGNED_BYTE
RG16F RG HALF_FLOAT
FLOAT
RG32F RG FLOAT
RG8UI RG_INTEGER UNSIGNED_BYTE
RGB8 RGB UNSIGNED_BYTE
SRGB8 RGB UNSIGNED_BYTE
RGB565 RGB UNSIGNED_BYTE
UNSIGNED_SHORT_5_6_5
R11F_G11F_B10F RGB UNSIGNED_INT_10F_11F_11F_REV
HALF_FLOAT
FLOAT
RGB9_E5 RGB HALF_FLOAT
FLOAT
RGB16F RGB HALF_FLOAT
FLOAT
RGB32F RGB FLOAT
RGB8UI RGB_INTEGER UNSIGNED_BYTE
RGBA8 RGBA UNSIGNED_BYTE
SRGB8_ALPHA8 RGBA UNSIGNED_BYTE
RGB5_A1 RGBA UNSIGNED_BYTE
UNSIGNED_SHORT_5_5_5_1
RGB10_A2 RGBA UNSIGNED_INT_2_10_10_10_REV
RGBA4 RGBA UNSIGNED_BYTE
UNSIGNED_SHORT_4_4_4_4
RGBA16F RGBA HALF_FLOAT
FLOAT
RGBA32F RGBA FLOAT
RGBA8UI RGBA_INTEGER UNSIGNED_BYTE

引用: WebGL 2.0 Specification

参考文献

目次
© NAGASHIMA Koki 2022