WebGLRenderingContext: texImage2D() 方法
注意:此功能在 Web Workers 中可用。
WebGL API 的 WebGLRenderingContext 接口的 texImage2D() 方法指定了一个二维纹理图像。
语法
// WebGL 1:
texImage2D(target, level, internalformat, width, height, border, format, type, srcData)
texImage2D(target, level, internalformat, format, type, source)
// Additionally available in WebGL 2:
texImage2D(target, level, internalformat, width, height, border, format, type, srcData, srcOffset)
texImage2D(target, level, internalformat, width, height, border, format, type, source)
texImage2D(target, level, internalformat, width, height, border, format, type, offset)
参数
目标-
一个
GLenum,指定活动纹理的绑定点(目标)。可能的值有:gl.TEXTURE_2D:一个二维纹理。gl.TEXTURE_CUBE_MAP_POSITIVE_X:立方体贴图纹理的正 X 面。gl.TEXTURE_CUBE_MAP_NEGATIVE_X:立方体贴图纹理的负 X 面。gl.TEXTURE_CUBE_MAP_POSITIVE_Y:立方体贴图纹理的正 Y 面。gl.TEXTURE_CUBE_MAP_NEGATIVE_Y:立方体贴图纹理的负 Y 面。gl.TEXTURE_CUBE_MAP_POSITIVE_Z:立方体贴图纹理的正 Z 面。gl.TEXTURE_CUBE_MAP_NEGATIVE_Z:立方体贴图纹理的负 Z 面。
level-
一个
GLint,指定细节级别。级别 0 是基本图像级别,级别 n 是第 n 个 mipmap 缩减级别。 internalformat-
一个
GLenum,指定纹理加载后应如何存储。可用值见下文。 width-
一个
GLsizei,指定纹理的宽度(以 texel 为单位)。 height-
一个
GLsizei,指定纹理的高度(以 texel 为单位)。 border-
一个
GLint,指定边框的宽度。必须为 0。 格式(format)-
一个
GLenum,指定原始 texel 数据中的每个整数元素应如何解释为颜色分量。在 WebGL 1 中,这必须与internalformat相同。可用值见下文。 type-
一个
GLenum,指定原始 texel 数据中每个整数元素的大小。internalformat、format和type值必须相互兼容。WebGL 1 和 WebGL 2 中可能的组合(这些内部格式是*无大小限制*的,因为你无法指定每个像素在内部占用多少字节)internalformat格式(format)type每个像素的输入字节数 输入像素布局(每通道位数) RGBRGBUNSIGNED_BYTE3 (R, G, B) = (8, 8, 8) RGBRGBUNSIGNED_SHORT_5_6_52 (R, G, B) = (5, 6, 5) RGBARGBAUNSIGNED_BYTE4 (R, G, B, A) = (8, 8, 8, 8) RGBARGBAUNSIGNED_SHORT_4_4_4_42 (R, G, B, A) = (4, 4, 4, 4) RGBARGBAUNSIGNED_SHORT_5_5_5_12 (R, G, B, A) = (5, 5, 5, 1) LUMINANCE_ALPHALUMINANCE_ALPHAUNSIGNED_BYTE2 (L, A) = (8, 8) LUMINANCELUMINANCEUNSIGNED_BYTE1 (L) = (8) ALPHAALPHAUNSIGNED_BYTE1 (A) = (8) 当
OES_texture_float扩展启用时,type还可以是FLOAT。当OES_texture_half_float扩展启用时,type还可以是ext.HALF_FLOAT_OES(由扩展提供的常量)。当
EXT_sRGB扩展启用时,internalformat还可以是ext.SRGB_EXT或ext.SRGB_ALPHA_EXT。在 WebGL 2 中,当将源指定为
srcData或offset时,还可使用以下组合(这些内部格式是*有大小限制*的,因为内部像素布局已精确指定;我们在此省略输入布局,因为它与上述类似)internalformat格式(format)type内部像素布局 可渲染颜色 可过滤纹理 R8REDUNSIGNED_BYTE(R) = (8) Y Y R8_SNORMREDBYTE(R) = (s8) Y R16FREDHALF_FLOAT,FLOAT(R) = (f16) Y R32FREDFLOAT(R) = (f32) R8UIRED_INTEGERUNSIGNED_BYTE(R) = (ui8) Y R8IRED_INTEGERBYTE(R) = (i8) Y R16UIRED_INTEGERUNSIGNED_SHORT(R) = (ui16) Y R16IRED_INTEGERSHORT(R) = (i16) Y R32UIRED_INTEGERUNSIGNED_INT(R) = (ui32) Y R32IRED_INTEGERINT(R) = (i32) Y RG8RGUNSIGNED_BYTE(R, G) = (8, 8) Y Y RG8_SNORMRGBYTE(R, G) = (s8, s8) Y RG16FRGHALF_FLOAT,FLOAT(R, G) = (f16, f16) Y RG32FRGFLOAT(R, G) = (f32, f32) RG8UIRG_INTEGERUNSIGNED_BYTE(R, G) = (ui8, ui8) Y RG8IRG_INTEGERBYTE(R, G) = (i8, i8) Y RG16UIRG_INTEGERUNSIGNED_SHORT(R, G) = (ui16, ui16) Y RG16IRG_INTEGERSHORT(R, G) = (i16, i16) Y RG32UIRG_INTEGERUNSIGNED_INT(R, G) = (ui32, ui32) Y RG32IRG_INTEGERINT(R, G) = (i32, i32) Y RGB8RGBUNSIGNED_BYTE(R, G, B) = (8, 8, 8) Y Y SRGB8RGBUNSIGNED_BYTE(R, G, B) = (8, 8, 8) Y RGB565RGBUNSIGNED_BYTE,UNSIGNED_SHORT_5_6_5(R, G, B) = (5, 6, 5) Y Y RGB8_SNORMRGBBYTE(R, G, B) = (s8, s8, s8) Y R11F_G11F_B10FRGBUNSIGNED_INT_10F_11F_11F_REV,HALF_FLOAT,FLOAT(R, G, B) = (f11, f11, f10) Y RGB9_E5RGBUNSIGNED_INT_5_9_9_9_REV,HALF_FLOAT,FLOAT(R, G, B) = (f9, f9, f9), 5 个共享位 Y RGB16FRGBHALF_FLOAT,FLOAT(R, G, B) = (f16, f16, f16) Y RGB32FRGBFLOAT(R, G, B) = (f32, f32, f32) RGB8UIRGB_INTEGERUNSIGNED_BYTE(R, G, B) = (ui8, ui8, ui8) Y RGB8IRGB_INTEGERBYTE(R, G, B) = (i8, i8, i8) Y RGB16UIRGB_INTEGERUNSIGNED_SHORT(R, G, B) = (ui16, ui16, ui16) Y RGB16IRGB_INTEGERSHORT(R, G, B) = (i16, i16, i16) Y RGB32UIRGB_INTEGERUNSIGNED_INT(R, G, B) = (ui32, ui32, ui32) Y RGB32IRGB_INTEGERINT(R, G, B) = (i32, i32, i32) Y RGBA8RGBAUNSIGNED_BYTE(R, G, B, A) = (8, 8, 8, 8) Y Y SRGB8_ALPHA8RGBAUNSIGNED_BYTE(R, G, B, A) = (8, 8, 8, 8) Y Y RGBA8_SNORMRGBABYTE(R, G, B, A) = (s8, s8, s8, s8) Y RGB5_A1RGBAUNSIGNED_BYTE,UNSIGNED_SHORT_5_5_5_1,UNSIGNED_INT_2_10_10_10_REV(R, G, B, A) = (5, 5, 5, 1) Y Y RGBA4RGBAUNSIGNED_BYTE,UNSIGNED_SHORT_4_4_4_4(R, G, B, A) = (4, 4, 4, 4) Y Y RGB10_A2RGBAUNSIGNED_INT_2_10_10_10_REV(R, G, B, A) = (10, 10, 10, 2) Y Y RGBA16FRGBAHALF_FLOAT,FLOAT(R, G, B, A) = (f16, f16, f16, f16) Y RGBA32FRGBAFLOAT(R, G, B, A) = (f32, f32, f32, f32) RGBA8UIRGBA_INTEGERUNSIGNED_BYTE(R, G, B, A) = (ui8, ui8, ui8, ui8) Y RGBA8IRGBA_INTEGERBYTE(R, G, B, A) = (i8, i8, i8, i8) Y RGBA10_A2UIRGBA_INTEGERUNSIGNED_INT_2_10_10_10_REV(R, G, B, A) = (ui10, ui10, ui10, ui2) Y RGBA16UIRGBA_INTEGERUNSIGNED_SHORT(R, G, B, A) = (ui16, ui16, ui16, ui16) Y RGBA16IRGBA_INTEGERSHORT(R, G, B, A) = (i16, i16, i16, i16) Y RGBA32UIRGBA_INTEGERUNSIGNED_INT(R, G, B, A) = (ui32, ui32, ui32, ui32) Y RGBA32IRGBA_INTEGERINT(R, G, B, A) = (i32, i32, i32, i32) Y 在 WebGL 2 中,当将源指定为
srcData或offset时,还可以使用以下组合,并且可以通过WEBGL_depth_texture扩展在 WebGL 1 中启用它们internalformat格式(format)type内部像素布局 DEPTH_COMPONENT16DEPTH_COMPONENTUNSIGNED_SHORT,UNSIGNED_INT(D) = (16) DEPTH_COMPONENT24DEPTH_COMPONENTUNSIGNED_INT(D) = (24) DEPTH_COMPONENT32FDEPTH_COMPONENTFLOAT(D) = (f32) DEPTH24_STENCIL8DEPTH_STENCILUNSIGNED_INT_24_8(ext.UNSIGNED_INT_24_8_WEBGL)(D, S) = (24, 8) DEPTH32F_STENCIL8DEPTH_STENCILFLOAT_32_UNSIGNED_INT_24_8_REV(D, S) = (f32, 8) 当数据源是 DOM 像素源时,通常每个通道的表示都是至少 8 位的无符号整数类型。将这种表示转换为有符号整数或位数更多的无符号整数的定义不明确。例如,在将
RGBA8转换为RGBA16UI时,不清楚意图是否是将值按比例放大到 16 位无符号整数的完整范围。因此,只允许转换为最多 8 位的无符号整数、半浮点数或浮点数。
纹理源可以通过三种方式提供:通过 srcData 和 srcOffset 从 ArrayBuffer(可能共享);从 DOM 像素 source;或者,在 WebGL 2 中,从 gl.PIXEL_UNPACK_BUFFER 使用 offset。
srcData-
一个
TypedArray或DataView,包含压缩纹理数据。其类型必须与type参数匹配srcData类型type值Int8ArrayBYTEUint8Array,Uint8ClampedArrayUNSIGNED_BYTEInt16ArraySHORTUint16ArrayUNSIGNED_SHORT,UNSIGNED_SHORT_5_6_5,UNSIGNED_SHORT_5_5_5_1,UNSIGNED_SHORT_4_4_4_4,HALF_FLOATInt32ArrayINTUint32ArrayUNSIGNED_INT,UNSIGNED_INT_5_9_9_9_REV,UNSIGNED_INT_2_10_10_10_REV,UNSIGNED_INT_10F_11F_11F_REV,UNSIGNED_INT_24_8Float32ArrayFLOAT当
type为FLOAT_32_UNSIGNED_INT_24_8_REV时,srcData必须为null。 srcOffset可选-
(仅限 WebGL 2)一个整数,指定
srcData开始读取的索引。默认为0。 source-
从 DOM 像素源读取,它可以是以下之一:
ImageBitmapImageDataHTMLImageElementHTMLCanvasElementHTMLVideoElementOffscreenCanvasVideoFrame
在 WebGL 1 中,
width和height总是从源推断。在 WebGL 2 中,它们也可以显式指定。 offset-
(仅限 WebGL 2)一个
GLintptr,指定绑定到gl.PIXEL_UNPACK_BUFFER的缓冲区中的起始地址。
返回值
无(undefined)。
示例
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
规范
| 规范 |
|---|
| WebGL 规范 # 5.14.8 |
| WebGL 2.0 规范 # 3.7.6 |
浏览器兼容性
加载中…
另见
WebGLRenderingContext.createTexture()WebGLRenderingContext.bindTexture()WebGLRenderingContext.texSubImage2D()WebGLRenderingContext.compressedTexImage2D()WebGLRenderingContext.copyTexImage2D()WebGLRenderingContext.getTexParameter()WEBGL_depth_textureOES_texture_floatOES_texture_half_floatEXT_texture_norm16EXT_sRGB