uniform float rotation;
uniform vec2 center;
void main() {
// 得到矩阵里的位移信息
vec4 mvPosition = modelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0);
vec2 scale;
// 得到缩放信息
scale.x = length(vec3(modelMatrix[0].x, modelMatrix[0].y, modelMatrix[0].z));
scale.y = length(vec3(modelMatrix[1].x, modelMatrix[1].y, modelMatrix[1].z));
#ifndef USE_SIZEATTENUATION
// 无论相机远近 保证大小不变
// 在透视投影中,最后一步透视除法会将齐次坐标转换为NDC坐标,除数为-Z,因此这里提前乘以-Z,那么透视除法之后,得到的还是之前的缩放系数
bool isPerspective = isPerspectiveMatrix(projectionMatrix);
if (isPerspective) scale *= - mvPosition.z;
#endif
// 按照用户指定的center进行缩放 得到缩放后的顶点位置
vec2 alignedPosition = (position.xy - (center - vec2(0.5))) * scale;
vec2 rotatedPosition;
// 顶精灵旋转(沿Z轴)
rotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y;
rotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y;
mvPosition.xy += rotatedPosition;
gl_Position = projectionMatrix * mvPosition;
}
总结:点精灵其实就是一个平面,渲染时忽略模型和视图矩阵中的旋转信息,只按照固定的旋转角度呈现,平面始终面向相机。