Three Sprite Shader

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;
}

总结:点精灵其实就是一个平面,渲染时忽略模型和视图矩阵中的旋转信息,只按照固定的旋转角度呈现,平面始终面向相机。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值