@@ -838,6 +838,7 @@ function loadTexture(gl, n, texture, u_Sampler, image) {
838838 | 错误 | 描述 |
839839 | --------------| -------------|
840840 | INVALID_ENUM | pname不是合法的值 |
841+
8418422 . ** 激活纹理单位(gl.activeTexture())**
842843
843844 WebGL通过一种称作** 纹理单位(texture unit)** 的机制来同时使用多个纹理。每个纹理单元有一个单元编号来管理一张纹理图像。
@@ -860,6 +861,7 @@ function loadTexture(gl, n, texture, u_Sampler, image) {
860861 | INVALID_ENUM | texUnit的值不合法 |
861862
862863 ![ 原理图] ( ../images/activeTexture.png )
864+
8638653 . ** 绑定纹理对象(gl.bindTexture())**
864866
865867 接下来,还需要告诉WebGL系统纹理对象使用的是哪种类型的纹理。在对纹理对象进行操作之前,我们需要绑定纹理对象,这一点与缓冲区很像:在对缓冲区对象进行操作之前,也需要绑定缓冲区对象。WebGL支持两种类型的纹理
@@ -887,3 +889,166 @@ function loadTexture(gl, n, texture, u_Sampler, image) {
887889 此方法完成了两个任务:开启纹理对象,以及纹理对象绑定到纹理单元上。
888890 ![ 原理图] ( ../images/bindTexture.png )
889891
892+ 4 . ** 配置纹理对象的参数(gl.texParameteri())**
893+
894+ 如何根据纹理坐标获取纹素颜色、按哪种方式重复填充纹理。
895+
896+ ` gl.texParameteri(target, pname, param) `
897+
898+ | 参数 | 描述 |
899+ | ---------| -----------------------------------|
900+ | target | gl.TEXTURE_2D或gl.TEXTURE_CUBE_MAP |
901+ | pname | 纹理参数 |
902+ | param | 纹理参数值 |
903+
904+ | 返回值 | 描述 |
905+ | -----| ----|
906+ | 无 | |
907+
908+ | 错误 | 描述 |
909+ | -------------------| ---------------|
910+ | INVALID_ENUM | target不是合法的值 |
911+ | INVALID_OPERATION | 当前目标上没有绑定纹理对象 |
912+
913+ ** pname 纹理参数**
914+
915+ - 放大方法(gl.TEXTURE_MAG_FILTER): 当纹理的绘制范围比纹理本身更大时,如何获取纹素颜色。如,将16x16的纹理图像映射到32x32像素的空间里时,纹理尺寸就边成了原始的两倍。WebGL需要填充由于放大而造成的像素间的空隙,该参数就是表示填充这些空隙的具体方法
916+ - 缩小方法(gl.TEXTURE_MIN_FILTER): 当纹理的绘制范围比纹理本身更小时,如何获取纹素颜色。如,将32x32的纹理图像映射到16x16像素的空间里,纹理的尺寸就只有原始的一半。为了将纹理缩小,WebGL需要剔除纹理图像中的部分像素,该参数就表示具体的剔除像素的方法
917+ - 水平填充方法(gl.TEXTURE_WRAP_S): 如何对纹理图像左侧或右侧的区域进行填充
918+ - 垂直填充方法(gl.TEXTURE_WARP_T): 如何对纹理图像上方和下方的区域进行填充
919+
920+ ** 纹理参数及它们的默认值**
921+
922+ | 纹理参数 | 描述 | 默认值 |
923+ | -----------------------| --------| --------------------------|
924+ | gl.TEXTURE_MAG_FILTER | 纹理方大 | gl.LINEAR |
925+ | gl.TEXTURE_MIN_FILTER | 纹理缩小 | gl.NEAREST_MIPMAP_LINEAR |
926+ | gl.TEXTURE_WRAP_S | 纹理水平填充 | gl.REPEAT |
927+ | gl.TEXTURE_WRAP_T | 纹理垂直填充 | gl.REPEAT |
928+
929+ ** 可以赋值给` gl.TEXTURE_MAG_FILTER ` 和 ` gl.TEXTURE_MIN_FILTER ` 的非金字塔纹理类型常量**
930+
931+ | 值 | 描述 |
932+ | ------------| ---------------------------------------------------------------------|
933+ | gl.NEAREST | 使用原纹理上距离映射后像素(新像素)中心最近的那个像素的颜色值,作为新像素的值(使用曼哈顿距离) |
934+ | gl.LINEAR | 使用距离新像素中心最近的四个像素的颜色值的加权平均,作为新像素的值(与gl.NEAREST相比,该方法的图像质量更好,当会有较大的开销 |
935+
936+ ** 可以赋值给` gl.TEXTURE_WRAP_S ` 和 ` gl.TEXTURE_WRAP_T ` 的常量**
937+
938+ | 值 | 描述 |
939+ | --------------------| ------------|
940+ | gl.REPEAT | 平铺式的重复纹理 |
941+ | gl.MIRRORED_REPEAT | 镜像对称式的重复纹理 |
942+ | gl.CLAMP_TO_EDGE | 使用纹理图像边缘值 |
943+
944+ ![ 原理图] ( ../images/texParameteri.png )
945+
946+ 5 . 将纹理图像分配给纹理对象(gl.texImage2D())
947+
948+ ` gl.texImage(target, level, internalformat, format, type, image) `
949+
950+ | 参数 | 描述 |
951+ | ----------------| -----------------------------------|
952+ | target | gl.TEXTURE_2D或gl.TEXTURE_CUBE_MAP |
953+ | level | 传入0(实际上,该参数是为金字塔纹理准备的) |
954+ | internalformat | 图像的内部格式 |
955+ | format | 纹理数据的格式,必须使用与internalformat相同的值 |
956+ | type | 纹理数据类型 |
957+ | image | 包含纹理图像的Image对象 |
958+
959+ | 返回值 | 描述 |
960+ | -----| ----|
961+ | 无 | |
962+
963+ | 错误 | 描述 |
964+ | -------------------| ----------------|
965+ | INVALID_ENUM | target不是合法的值 |
966+ | INVALID_OPERATION | 当前目标上没有绑定的纹理对象 |
967+
968+ ![ 原理图] ( ../images/texImage.png )
969+
970+ ** 图像内部格式**
971+
972+ | 格式 | 描述 |
973+ | --------------------| ----------------------|
974+ | gl.RGB | 红、绿、蓝 |
975+ | gl.RGBA | 红、绿、蓝、透明度 |
976+ | gl.ALPHA | (0.0, 0.0, 0.0, 透明度) |
977+ | gl.LUMINANCE | L、 L、 L、 1L: 流明 |
978+ | gl.LUMINANCE_ALPHA | L、 L、 L、 透明度 |
979+
980+ ** 流明** 表示我们感知的物体表面的亮度。通常使用物体表面红、绿、蓝颜色分量值的加权平均来计算流明
981+
982+ type参数指定了纹理数据类型。通常我们使用` gl.UNSIGNED_BYTE ` 数据类型。当然也可以使用其他数据类型。
983+
984+ | 格式 | 描述 |
985+ | ---------------------------| -------------------------------|
986+ | gl.UNSIGNED_BYTE | 无符号整型,每个颜色分量占据1字节 |
987+ | gl.UNSIGNED_SHORT_5_6_5 | RGB: 每个分量分别占据5、6、5比特 |
988+ | gl.UNSIGNED_SHORT_4_4_4_4 | RGBA: 每个分量分别占据4,4,4,4比特 |
989+ | gl.UNSIGNED_SHORT_5_5_5_1 | RGBA: RGB每个分量各占据5个比特,A分量占据1比特 |
990+
991+ 6 . ** 将纹理单元传递给片元着色器(gl.uniform1i())**
992+ 一旦将纹理图像传入了WebGL系统,就必须将其传入片元着色器并映射到图形的表面上去。
993+ ``` js
994+ const VSHADER_SOURCE =
995+ ' attribute vec4 a_Position;\n ' +
996+ ' attribute vec2 a_TexCoord;\n ' +
997+ ' varying vec2 v_TexCoord;\n ' +
998+ ' void main() {\n ' +
999+ ' v_TexCoord = a_TexCoord;\n ' +
1000+ ' gl_Position = a_Position;\n ' +
1001+ ' }\n ' ;
1002+
1003+ ```
1004+ 使用uniform变量来表示纹理,因为纹理图像不会随着片元变化
1005+
1006+ ** 专用于纹理的数据类型**
1007+
1008+ | 类型 | 描述 |
1009+ | ------------ - | -------------------------------- |
1010+ | sampler2D | 绑定到gl .TEXTURE_2D 上的纹理数据类型 |
1011+ | samplerCube | 绑定到gl .TEXTURE_CUBE_MAP 上的纹理数据类型 |
1012+
1013+ ` gl.uniform1i(u_Sampler, 0)` 将0 号纹理传递给着色器中的取样变量
1014+
1015+ ! [原理图](../ images/ unifrom1i .png )
1016+
1017+ 7. ** 从顶点着色器向片元着色器传输纹理坐标**
1018+
1019+ 通过attribute变量` a_TexCoord` 接收顶点的纹理坐标,所以将数据赋值给` varying` 变量` v_TexCoord` 并将纹理坐标传入片元着色器是可行的。
1020+ 片元着色器和顶点着色器内的同名、同类型的` varying` 变量可用来在两者之间传输数据。顶点之间片元的纹理坐标会在光栅化的过程中内插出来,所以在片元着色器中,使用的是内插后的纹理坐标
1021+ ** 在片元着色器中获取纹理像素颜色(texture2D ())**
1022+
1023+ ` ` ` js
1024+ const FSHADER_SOURCE =
1025+ 'precision mediump float;\n '+
1026+ 'uniform sampler2D u_Sampler;\n ' +
1027+ 'varying vec2 v_TexCoord;\n ' +
1028+ 'void main(){' +
1029+ 'gl_FragColor = texture2D(u_Sampler, v_TexCoord);\n ' +
1030+ '}';
1031+ ` ` `
1032+ ` vec4 texture2D(sampler2d smapler, vec2 coord)`
1033+
1034+ | 参数 | 描述 |
1035+ | -------- - | ---------- |
1036+ | sampler | 指定纹理单元编号 |
1037+ | coord | 指定纹理坐标 |
1038+
1039+ | 返回值 | 描述 |
1040+ | -------------------------------------------------------- | ---- |
1041+ | 纹理坐标处像素的颜色值,其格式由 ` gl.texImage2D()` 的internalformat参数决定。 | |
1042+
1043+ ** texture2D ()的返回值**
1044+
1045+ | internalformat | 返回值 |
1046+ | -------------------- | -------------------- |
1047+ | gl .RGB | (R ,G ,B ,1.0 ) |
1048+ | gl .RGBA | (R ,G ,B ,A ) |
1049+ | gl .ALPHA | (0.0 , 0.0 , 0.0 ,A ) |
1050+ | gl .LUMINANCE | (L , L , L , 1.0 ) |
1051+ | gl .LUMINANCE_ALPHA | (L , L , L ,A ) |
1052+
1053+
1054+
0 commit comments