webGL入门-着色器基本语法

435 阅读2分钟

接webGL入门-绘制一个点 juejin.cn/post/706527… 来分析其中的着色器语法

  // 顶点着色器程序
  const VSHADER_SOURCE = 
  `void main() {
    gl_Position = vec4(0.0, 0.0, 0.0, 1.0); // 设置坐标
    gl_PointSize = 10.0; // 设置尺寸
  }`

  // 片元着色器程序
  const FSHADER_SOURCE = 
  `void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 设置颜色
  }`

着色器基本语法

  • 1.着色器语法从void main()开始,和C语言程序一样,必须包含一个main()函数。
  • 2.main()前面的关键字 void 表示这个函数不会有返回值。
  • 3.main()不能指定参数
  • 4.着色器程序使用 '='操作符 为变量赋值

顶点着色器内置变量

类型和变量名描述
vec4 gl_Position表示顶点的位置 ----- gl_Position变量必须被赋值,否则着色器无法正常工作
float gl_PointSize表示点的尺寸(像素数) ----- 不赋值默认取1.0

片元着色器内置变量

类型和变量名描述
vec4 gl_FragColor指定片元颜色(RGBA格式)

GLSL中的数据类型

GLSL是一种强类型的编程语言,必须为变量指定类型,这样系统就能轻易理解变量中存储的是何种数据,进而优化处理这些数据

类型描述
float表示浮点数
vec4表示由四个浮点数组成的矢量

vec4()

着色器提供的内置函数vec4(),帮助你创建vec4类型的变量

/**
 * 根据 v0, v1, v2, v3 创建 vec4 对象
 * @param (v0, v1, v2, v3) 指定4个浮点型分量
 * @return 返回v0, v1, v2, v3 组成的 vec4 对象
 */
vec4 vec4(v0, v1, v2, v3)

齐次坐标

由于齐次坐标能够提高处理三维数据的的效率(矩阵运算),所以在三维图形中被大量使用

齐次坐标使用如下符号描述:(x, y, z, w)

齐次坐标(x, y, z, w) 等价于(x / w, y / w, z / w),所以如果齐次坐标的第4个分量是1,那么就可以将它当做三维坐标来使用

顶点着色器语法分析

gl_Position = vec4(0.0, 0.0, 0.0, 1.0); // 设置坐标

- 1.给定一个坐标位置(0.0, 0.0, 0.0),即XYZ坐标值,webGL坐标系统请看这篇文章 https://juejin.cn/post/7066968450169569288
- 2.gl_Position是 vec4 类型,所以使用vec4(0.0, 0.0, 0.0, 1.0)来设置坐标
- 3.由齐次坐标概念可知,vec4中前三个代表XYZ坐标值,最后一个赋值1.0,这样vec4(0.0, 0.0, 0.0, 1.0)就能设置顶点位置在(0.0, 0.0, 0.0)处
gl_PointSize = 10.0; // 设置尺寸

- 1.设置点的大小10.0

片元着色器语法分析

gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 设置颜色

- 1.vec4中前三个值代表rgba的值,最后一个1.0是齐次坐标
- 2.rgba范围是0-255,在webGL中对应0-1,即rgb(255, 100, 0) 对应vec4(255/255.0, 100/255.0, 0/255.0, 1.0)