WebGL02

WebGL绘制点

WebGL程序相关三要素和坐标系。

我们将通过代码编写逐步熟悉GLSL这门语言的学习。

什么是着色器

WebGl需要两种着色器

  • 顶点着色器 用于描述顶点属性,坐标位置。(x,y,z)
  • 片元着色器 逐片元处理颜色,相当于是像素。

我们会将顶点着色器和片元着色器组合起来使用就是一个着色程序。着色程序会在GPU中运行,根据我们设置一系列状态值,再使用gl.drawArrays这类着色方法绘制出相应的图形。 以WebGL绘制三角形为例,说明两个着色器之间是如何工作的。

  • 顶点着色器会调用三次绘制对应顶点,接着进行图形装配,光栅化处理,转换成对应的像素点。
  • 片元着色器根据颜色值配置信息对光栅化后的像素进行着色处理。

我们所看到的图像,背后都是由一个个像素点组合起来,所以我们就可以理解着色器为什么是成对组合工作的。顶点着色器进行图形轮廓绘制,最后使用片元着色器对应图形内像素点进行上色。

着色器代码编写

GLSL对应的类型和内置变量

  • 顶点着色器 float-浮点数 vec4-四个浮点数组成的矢量
  • 顶点着色器内置变量 gl_Position vec4 顶点位置、坐标 gl_PointSize float 点的尺寸 (像素)
  • 内置函数 vec4 创建对应的vec4对象
  • 片元着色器内置变量 gl_FragColor vec4 对应rgba颜色值。取值范围为0.0到1.0

着色器代码

顶点着色器GLSL代码

const vertexCode= `
    void(){
      // 顶点坐标
      gl_Position= vec4(0.0,0.0,0.0,1.0);
      // 顶点渲染像素大小
      gl_PointSize=24.0;
    }
`

片元着色器

const fragmentCode=`
    void main(){
      // 顶点颜色
      gl_FragColor=vec4(0.0,1.0,0.0,1.0)
    }
`

清空绘图区

  • 设置背景色 clearColor 参数值:(r,g,b,a)
  • 清空画布 clear 参数值:(buffer) gl.COLOR_BUFFER_BIT

清空绘图区就是清空颜色缓存区,调用gl.clear暂时只考虑使用gl.COLOR_BUFFER_BIT

 gl.clearColor(1.0,0.0,0.0,1.0)
 gl.clear(gl.COLOR_BUFFER_BIT)

绘制一个点

// 绘图环境获取
const canvas = document.querySelector('#ice-2_2')
const gl = canvas.getContext('WebGL')

// 创建顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER)
// 传入我们编写好的顶点着色器字符串代码
gl.shaderSource(vertexShader, vertexCode)
// 编译着色器
gl.compileShader(vertexShader)

// 除了一些参数不一样,整体流程均可参考上述顶点着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
// 传入我们编写好的顶点着色器字符串代码
gl.shaderSource(fragmentShader, fragmentCode)
// 编译着色器
gl.compileShader(fragmentShader)

// 创建着色器程序
const program = gl.createProgram();
// 为程序添加 顶点着色器
gl.attachShader(program, vertexShader);
// 为程序添加 片元着色器
gl.attachShader(program, fragmentShader);
// 连接 顶点着色器 和 片元着色器,也就是组合成对
gl.linkProgram(program);
// 应用着色器程序,告诉 WebGL 绘制的时候使用这个着色程序
gl.useProgram(program);

// 最后调用绘制函数 gl.drawArrays方法
gl.drawArrays(gl.POINTS, 0, 1)

gl.drawArrays 参数值 (mode, first, count) mode-gl.POINTS绘制单个点 first 指定开始绘制的点 count 指定绘制多少个点

写在最后

未完待续…
希望大家好好生活,健康快乐。