UnityShader 总是朝着摄像机的帧动画 Billboard

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Achonor/Billboard"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_RowAmount ("Row Amount", Float) = 4
		_ColumnAmount ("Column Amount", Float) = 4
		_AnimSpeed ("Anim Speed", Range(10, 100)) = 30
	}
	SubShader
	{
		Tags { 
			"Queue" = "Transparent"
			"RenderType"="Transparent"
			"IgnoreProjector" = "True"
		}
		Pass
		{
			Cull Off
			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct a2v
			{
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _RowAmount;
			float _ColumnAmount;
			float _AnimSpeed;

			
			v2f vert (a2v v)
			{
				v2f o;
				float3 center = float3(0, 0, 0);
				//模型空间下的摄像机坐标
				float4 cameraObjPos = mul(unity_W
### 如何在Unity Shader Graph 中实现 Billboard 效果 Billboard 是一种常见的技术,用于使对象始终面向摄像机。这种效果广泛应用于粒子系统、植被模拟以及 UI 元素等场景中。以下是关于如何利用 UnityShader Graph 实现这一功能的具体方法。 #### 创建自定义着色器 首先,在项目中创建一个新的 **Unlit Shader Graph** 或者基于 URP 的 Lit Shader Graph 文件[^2]。打开该文件并设置其输入节点以便接收必要的顶点数据(如世界空间位置和法线)。为了实现 Billboard 功能,需要修改顶点的位置使其总是朝向摄像机方向。 #### 添加 Vertex Position 和 Camera Direction 节点 在 Shader Graph 编辑界面中拖入以下两个重要节点: - `Position` (Vertex): 获取当前网格模型的空间坐标。 - `Camera Position`: 提供摄像机的世界空间位置。 接着计算每个顶点相对于摄像机的方向矢量,并将其标准化作为新的旋转轴来调整物体姿态[^1]。 ```csharp // 计算从顶点指向相机的方向 float3 directionToCamera = normalize(_WorldSpaceCameraPos - i.position); ``` #### 修改顶点位置逻辑 通过矩阵变换或者直接操作 XYZ 坐标的方式重新定位几何体上的每一个点使之围绕中心保持固定距离但改变角度以匹配上述求得的方向向量。具体做法如下: 1. 使用 Vector3.Dot() 函数检测原始局部坐标的 XZ 平面投影与目标正面之间的夹角余弦值; 2. 应用 atan2(y,x) 方法得到确切的角度差值; 3. 将此偏移应用回最终输出的 world space position 上完成整个过程。 注意这里假设你的 billboarding 对象原本就是居中的球形或其他对称形状;如果不是,则可能还需要额外考虑原点平移等问题。 #### 设置材质属性 最后一步是将新构建好的 shader graph 关联至实际使用的 material asset 上,并指定给相应的 game object 。这样当运行时引擎就会动态更新这些元素的姿态从而达到预期的效果——无论玩家视角怎么变化它们都会持续正对着镜头展示自己最完整的面貌。 ```python material.SetTexture("_MainTex", texture); // Example of setting a texture property in script. ``` 以上就是在 Unity Shader Graph 下达成基本 billboard 行为的主要流程概述。当然根据个人需求还可以进一步扩展比如加入淡入淡出过渡动画或是支持多层纹理混合等功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

achonor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值