BillBoard shader实现

本文介绍了一种BillBoard shader的实现方法,使Quad始终面向相机并保持正前方位置,不仅限于垂直方向。通过计算Quad的中心点、Up方向、LookAt方向及Right方向,并根据纹理坐标调整位置。

BillBoard shader实现
当前效果是Quad始终处于相机正前方, 而不只是方向垂直。去掉m_vOffset就是一般意义上的billboard了。

Vert程序

uniform mat4 g_WorldViewProjectionMatrix;
uniform mat4 g_WorldMatrix;
uniform mat4 g_ProjectionMatrix;
uniform mat4 g_ViewMatrix;

uniform vec3 m_vOffset;
uniform vec3 m_CamPos;

attribute vec3 inPosition;
attribute vec2 inTexCoord;

varying vec2 texCoord;


void main(){

//    gl_Position =   g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);

    //  billboard实现
    // Quad中心点的世界坐标
    vec4 vCenter = g_WorldMatrix * vec4(0,0,0,1) + vec4(m_vOffset, 0) ;
    // Quad自身坐标系的Up方向
    vec3 vUp = vec3(0,1,0); 
    // 中心点到相机的LookAt方向
    vec3 vEye = normalize( m_CamPos  - vCenter);
    // Quad自身坐标系的Right方向
    vec3 vRight = cross(vUp, vEye);
    vUp = normalize(cross(vEye, vRight));
    vRight = normalize(vRight);

    // 根据纹理坐标偏移,10为Quad的scale size
    vec3 vTmpPos = vCenter.xyz;
    vTmpPos += (inTexCoord.x - 0.5) *10 * vRight;
    vTmpPos += (inTexCoord.y - 0.5) *10 * vUp;

    gl_Position = g_ProjectionMatrix * g_ViewMatrix * vec4(( vTmpPos), 1);

    texCoord = inTexCoord;  

}

Frag程序

varying vec2 texCoord;
uniform sampler2D m_ColorMap;
uniform vec4 m_Color;

void main(){
    gl_FragColor= texture2D(m_ColorMap, texCoord);
}

### 如何在Unity Shader Graph 中实现 Billboard 效果 Billboard 是一种常见的技术,用于使对象始终面向摄像机。这种效果广泛应用于粒子系统、植被模拟以及 UI 元素等场景中。以下是关于如何利用 Unity 的 Shader 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值