Three Sprite Shader

该博客介绍了3D图形学中点精灵的渲染技术,通过忽略模型和视图矩阵中的旋转信息,仅按照固定角度进行旋转,确保平面始终面向相机。同时,详细阐述了如何获取矩阵的位移和缩放信息,以及如何根据用户指定的中心进行旋转和缩放操作,以实现点精灵的动态效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值