Unity Billboard shader

billboard在游戏里挺常用的,下面是个unity的billboard shader。在顶点着色器中把顶点旋转到合视角平行

首先在tag中加上一句修饰防止billboard被batch掉,这里非常坑,其实billboard算法挺简单的

Tags {"DisableBatching" = "True" }

然后是顶点着色器的变换

//billboard construct 
float3 vpos = mul((float3x3)unity_ObjectToWorld, v.vertex.xyz);
float4 worldCoord = float4(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23, 1);
float4 viewPos = mul(UNITY_MATRIX_V, worldCoord) + float4(vpos.x ,vpos.y, 0, 0);
float4 outPos = mul(UNITY_MATRIX_P, viewPos);
o.vertex = outPos;

Enjoy it

### 如何在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 行为的主要流程概述。当然根据个人需求还可以进一步扩展比如加入淡入淡出过渡动画或是支持多层纹理混合等功能特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值