WebGL 基础知识点

1. 语言基础

  • 着色器:由顶点着色器和片源着色器组成。顶点着色器处理顶点数据,片源着色器处理像素颜色。
  • 缓冲区:用于存储顶点数据、索引数据等,可以通过WebGL的API进行管理和上传到GPU。
  • 着色器程序:由编译后的顶点着色器和片段着色器组成,是WebGL执行图形渲染的核心。

1.1 语法特点

  • 大小写敏感:变量和函数名称区分大小写。
  • 分号结尾:每条语句结束时必须加上分号。
  • main函数:每个着色器程序都必须包含一个main函数,它是程序执行的入口点。
  • 注释:单行注释使用//,多行注释使用/* */。
  • 数据类型:支持整数(int)、浮点数(float)、布尔值(bool)等基本数据类型。

1.2 变量和类型

  • 变量声明:需要指定变量类型,如 float f = 1.1。
  • 变量命名:不能以数字开头,不能使用关键字或保留字作为变量名。
  • 类型转换:可以通过类型转换函数进行数据类型之间的转换。

1.3 运算符和控制流

  • 运算符:包括算术运算符、赋值运算符、比较运算符等,语法与C语言类似。
  • 控制流:支持if、for、while等控制语句,用于控制程序的执行流程。

2. 矢量和矩阵

2.1 矢量

  • vec2、vec3、vec4 具有2,3,4个浮点数元素的矢量
  • ivec2、ivec3、ivec4具有2,3,4个整型元素的矢量
  • bvec2、bvec3、bvec4具有2,3,4个布尔值元素的矢量
2.1.1 通过构造函数来进行赋值
// vec4 就是矢量的构造函数
vec4 position=vec4(0.0,0.0,0.0,1.0);
2.1.2 访问分量
  • x,y,z,w 访问顶点坐标的分量
  • s,t,p,q  访问纹理坐标分量
// 访问单个矢量
vec4 position=vec4(0.1,0.2,0.3,1.0)
position.x // 0.1
position.y // 0.2
position.z // 0.3

// 访问多个矢量
vec4 position=vec4(0.1,0.2,0.3,1.0)
position.xy  // vec2(0.1,0.2)
position.yx  // vec2(0.2,0.1)
position.zyx // vec3(0.3,0.2,0.1)

2.2 矩阵

  • mat2、mat3、mat42*2,3*3,4*4的浮点数元素矩阵
  • 矩阵入参,注意:矩阵参数是列主序的
mat4 m = mat4(
    1.0, 5.0,  9.0, 13.0,
    2.0, 6.0, 10.0, 14.0,
    3.0, 7.0, 11.0, 15.0,
    4.0, 8.0, 12.0, 16.0,
);

3.纹理取样器

3.1 纹理取样器的类型

  • sampler2D:用于二维纹理。
  • samplerCube:用于立方体纹理。

3.2 创建和使用纹理取样器

纹理取样器变量通常声明为uniform类型

// 声明二维纹理
uniform sampler2D uSampler;

// 声明立方体纹理
uniform samplerCube uSamplerCube;

使用gl.uniform1i来指定取样器应该引用哪个纹理单元

// 将uSampler与纹理单元0关联
gl.uniform1i(uSampler, 0); 

3.3 纹理采样函数

在着色器中,纹理采样函数texture2D用于从纹理中获取颜色值。

gl_FragColor = texture2D(uSampler, vTex);

这里的vTex是从顶点着色器传递到片元着色器的纹理坐标。

3.4 纹理参数

在WebGL中,可以通过gl.texParameteri函数设置这些参数。

  • TEXTURE_MIN_FILTER
  • TEXTURE_MAG_FILTER
  • TEXTURE_WRAP_S
  • TEXTURE_WRAP_T

3.5 传纹理图像数据

// 二维纹理 只传入一面图像
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img);

// 立方体纹理 需要处理六个面
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[0]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[1]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[2]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[3);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[4]);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, gI.RGB, gI.RGB, gI.UNSIGNED BYTE, images[5]);

4. 存储限定词

  • attribute:用于从顶点属性传递数据到顶点着色器,这些变量是逐顶点的,并且只能在顶点着色器中声明和使用。
  • uniform:用于传递统一的值给所有顶点着色器和片元着色器,这些变量在整个着色器程序中共享。
  • varying:用于在顶点着色器和片元着色器之间传递数据,这些变量在顶点着色器中声明,在片元着色器中声明,并且在图形管线的光栅化阶段会进行插值。

5. 精度限定

  • highp(高精度)
  • mediump(中精度)
  • lowp(低精度)

在片源着色器中,可以通过precision关键字来声明变量的默认精度。

precision mediump float;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值