Skip to content

Commit 9de585b

Browse files
committed
颜色与纹理
纹理end
1 parent 312510d commit 9de585b

File tree

4 files changed

+165
-0
lines changed

4 files changed

+165
-0
lines changed

12.Texture/readme.md

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,7 @@ function loadTexture(gl, n, texture, u_Sampler, image) {
838838
| 错误 | 描述 |
839839
|--------------|-------------|
840840
| INVALID_ENUM | pname不是合法的值 |
841+
841842
2. **激活纹理单位(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+
863865
3. **绑定纹理对象(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+

images/texImage.png

493 KB
Loading

images/texParameteri.png

435 KB
Loading

images/unifrom1i.png

613 KB
Loading

0 commit comments

Comments
 (0)