WebGL学习(十二)绘制圆形点

150 阅读1分钟

1. 原理

默认情况下绘制的点是一个正方形。

image.png

每个点在光栅化(绘制到屏幕)的结果就是一些片元:

image.png

所以要画出圆形(看起来像是圆形),只需要摒弃圆圈外部的片元。操作片元的地方在片元着色器。

2. 实现

步骤很简单:

  1. 计算片元和中心的距离
  2. 如果超过半径就舍去片元

2.1. 计算片元和中心的距离

这里需要使用到一个片元着色器内置的变量gl_PointCoord,它是一个二维向量,表示的是这个顶点内部的归一化坐标。看起来像是这样:

image.png

这是一个顶点的光栅化后的片元们。如果你想深入渲染过程(渲染关系)后面章节会介绍。

这一个点的片元坐标被限制在了一个,原点在左上角,坐标范围[0, 1]的一个区域。

还有一个表示片元坐标的内置变量,gl_FragCoord,它指的是整个画布的坐标

所以对于这一个顶点,我们这样计算:

// 片元着色器
float dist = distance(gl_PointCoord, vec2(0.5, 0.5));

这个顶点的中心为(0.5,0.5),只需要计算片元和中心的距离distance

2.2. 舍去超出范围的点

这里使用一个内置函数discard,表示舍弃这个片元

// 片元着色器
if(dist > 0.5) {
  discard;
}else {
  gl_FragColor = v_Color;

}

2.3. 效果

image.png