1. 原理
默认情况下绘制的点是一个正方形。
每个点在光栅化(绘制到屏幕)的结果就是一些片元:
所以要画出圆形(看起来像是圆形),只需要摒弃圆圈外部的片元。操作片元的地方在片元着色器。
2. 实现
步骤很简单:
- 计算片元和中心的距离
- 如果超过半径就舍去片元
2.1. 计算片元和中心的距离
这里需要使用到一个片元着色器内置的变量gl_PointCoord
,它是一个二维向量,表示的是这个顶点内部的归一化坐标。看起来像是这样:
这是一个顶点的光栅化后的片元们。如果你想深入渲染过程(渲染关系)后面章节会介绍。
这一个点的片元坐标被限制在了一个,原点在左上角,坐标范围[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;
}