【Unity3D】广告牌特效
2023-08-10 01:24:00 来源:博客园
1 前言
广告牌特效是指:空间中的一个 2D 对象始终(或尽可能)面向相机,使得用户能够尽可能看清楚该 2D 物体。广告牌特效一共有以下 3 种:
- 正视广告牌:广告牌始终以正视图姿态面向相机,即广告牌的 x、y、z 轴正方向始终指向相机的 x、y、z 轴正方向;
- 血条广告牌:游戏中的血条效果广告牌,广告牌可以绕世界坐标系的 y 轴旋转,使其尽可能面向相机,即广告牌的 x 轴正方向始终指向相机的 x 轴正方向,y 轴正方向始终指向 (0, 1, 0) 方向,z 轴正方向可以随相机位置和姿态变动;
- 测距广告牌:测距时显示距离效果的广告牌,广告牌可以绕局部坐标系的 x 轴旋转,使其尽可能面向相机,即广告牌的 x 轴正方向固定不变,y、z 轴正方向可以随相机位置和姿态变动。
本文完整资源见→Unity3D广告牌特效。
【资料图】
2 正视广告牌
正视广告牌是指:广告牌始终以正视图姿态面向相机,即广告牌的 x、y、z 轴正方向始终指向相机的 x、y、z 轴正方向。
FrontView.shader
Shader "MyShader/Billboard/FrontView" { // 正视广告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材质纹理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材质颜色 } SubShader{ // 批处理会合并所有相关的模型, 导致模型各自的模型空间丢失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材质纹理 float4 _MainTex_ST; // 材质纹理的缩放和偏移 fixed4 _Color; // 材质颜色 struct a2v { float4 vertex : POSITION; // 模型空间顶点坐标 half2 texcoord : TEXCOORD0; // 顶点纹理坐标 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空间顶点坐标 half2 uv : TEXCOORD0; // 顶点纹理坐标 }; v2f vert(a2v v) { v2f o; float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐标系中模型中心坐标 float3 right = mul(unity_MatrixInvV, float4(1, 0, 0, 0)).xyz; // 世界坐标系中相机的right向量(广告牌的x轴) float3 up = mul(unity_MatrixInvV, float4(0, 1, 0, 0)).xyz; // 世界坐标系中相机的up向量(广告牌的y轴) float3 forward = mul(unity_MatrixInvV, float4(0, 0, 1, 0).xyz); // 世界坐标系中相机的forward向量(广告牌的z轴) float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐标系中模型中心指向顶点的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐标系中顶点坐标经过广告牌变换后的坐标 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐标系中顶点坐标 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 纹理uv坐标 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit"}
运行效果:
3 血条广告牌
血条广告牌是指:游戏中的血条效果广告牌,广告牌可以绕世界坐标系的 y 轴旋转,使其尽可能面向相机,即广告牌的 x 轴正方向始终指向相机的 x 轴正方向,y 轴正方向始终指向 (0, 1, 0) 方向,z 轴正方向可以随相机位置和姿态变动。
Lifebar.shader
Shader "MyShader/Billboard/Lifebar" { // 血条广告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材质纹理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材质颜色 } SubShader{ // 批处理会合并所有相关的模型, 导致模型各自的模型空间丢失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材质纹理 float4 _MainTex_ST; // 材质纹理的缩放和偏移 fixed4 _Color; // 材质颜色 struct a2v { float4 vertex : POSITION; // 模型空间顶点坐标 half2 texcoord : TEXCOORD0; // 顶点纹理坐标 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空间顶点坐标 half2 uv : TEXCOORD0; // 顶点纹理坐标 }; v2f vert(a2v v) { v2f o; float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐标系中模型中心坐标 float3 right = mul(unity_MatrixInvV, float4(1, 0, 0, 0)).xyz; // 世界坐标系中相机的right向量(广告牌的x轴) float3 up = float3(0, 1, 0); // 广告牌的y轴 float3 forward = cross(right, up); // 广告牌的z轴 float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐标系中模型中心指向顶点的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐标系中顶点坐标经过广告牌变换后的坐标 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐标系中顶点坐标 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 纹理uv坐标 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit"}
运行效果:
4 测距广告牌
测距广告牌是指:测距时显示距离效果的广告牌,广告牌可以绕局部坐标系的 x 轴旋转,使其尽可能面向相机,即广告牌的 x 轴正方向固定不变,y、z 轴正方向可以随相机位置和姿态变动。
MeasureDist.shader
Shader "MyShader/Billboard/MeasureDist" { // 测距广告牌 Properties{ _MainTex("Main Tex", 2D) = "white" {} // 材质纹理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 材质颜色 } SubShader{ // 批处理会合并所有相关的模型, 导致模型各自的模型空间丢失 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"} Pass { Tags { "LightMode" = "ForwardBase" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" sampler2D _MainTex; // 材质纹理 float4 _MainTex_ST; // 材质纹理的缩放和偏移 fixed4 _Color; // 材质颜色 struct a2v { float4 vertex : POSITION; // 模型空间顶点坐标 half2 texcoord : TEXCOORD0; // 顶点纹理坐标 }; struct v2f { float4 pos : SV_POSITION; // 裁剪空间顶点坐标 half2 uv : TEXCOORD0; // 顶点纹理坐标 }; v2f vert(a2v v) { v2f o; float3 forwardDire = mul(unity_ObjectToWorld, float4(0, 0, 1, 0)).xyz; // 世界坐标系中模型的forward向量 float3 center = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; // 世界坐标系中模型中心坐标 float3 viewDire = normalize(center - _WorldSpaceCameraPos.xyz); // 观察向量, 相机指向顶点 float3 right = normalize(mul(unity_ObjectToWorld, float4(1, 0, 0, 0)).xyz) * sign(dot(viewDire, forwardDire)); // 世界坐标系中模型的right向量(广告牌的x轴) float3 up = cross(viewDire, right); // 广告牌的y轴 float3 forward = cross(right, up); // 广告牌的z轴 float3 worldVec = mul(unity_ObjectToWorld, v.vertex).xyz - center; // 世界坐标系中模型中心指向顶点的向量 float3 worldPos = center + worldVec.x * right + worldVec.y * up + worldVec.z * forward; // 世界坐标系中顶点坐标经过广告牌变换后的坐标 o.pos = mul(unity_MatrixVP, float4(worldPos, 1)); // 裁剪坐标系中顶点坐标 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 纹理uv坐标 return o; } fixed4 frag(v2f i) : SV_Target { fixed4 color = tex2D(_MainTex, i.uv); color.rgb *= _Color.rgb; return color; } ENDCG } } FallBack "Transparent/VertexLit"}
运行效果:
声明:本文转自【Unity3D】广告牌特效。
关键词:
相关阅读
-
【Unity3D】广告牌特效
1前言广告牌特效是指:空间中的一个2D对象始终(或尽可能)面向相 -
六安最新印发,新增5个!事关住房公积金!
六安最新印发,新增5个!事关住房公积金!,贷款,购房,管理部,六安市,住 -
常见的胃肠病有哪些 太原胃肠病医院
常见的胃肠病有哪些,太原胃肠病医院一、症状胃肠病的症状是多样的,可 -
今年上半年临清市服务业回升向好
齐鲁网·闪电新闻8月9日讯 记者从聊城市发展和改革委员会了解到,... -
7月CPI同比跌入负值,国家统计局:阶段...
7月CPI同比跌入负值,国家统计局:阶段性回落,有望逐步回升,cpi,价格 -
江西省石城县发布暴雨黄色预警
石城县气象台2023年08月09日19时49分发布暴雨黄色预警信号:预计未来6 -
湖南体彩发布2022年社会责任报告
《2022年湖南省体育彩票社会责任报告》8月9日发布。湖南日报·新湖... -
u盘杀毒专家怎么样 u盘杀毒专家优势介...
随着科技的发展,给人们生活带来了许多的方便,同时给我们带来了越来越 -
美国银行业第二季度贷款损失近190亿美元...
美国银行业第二季度贷款损失近190亿美元创三年来最高水平,美国,银行业, -
明天别忘吃这个!咱河北有老讲究
头伏饺子二伏面,三伏烙饼摊鸡蛋。明天就是三伏第一天啦!河北老话说得 -
dell笔记本怎么恢复出厂设置(dell笔记...
1、Dell笔记本一键还原的方法:开机进入系统前,按F8键,进入高级启动 -
【市州县传真】循化县开展防汛抢险综合...
近日,海东市循化县开展2023年防汛抢险应急综合应急演练。演练模拟循化 -
全民tv是哪个公司的
全民tv是一款热门的直播视频的应用平台,指在人人成为游戏主播,目前已经 -
国华网安将于8月15日解禁737.12万股
国华网安将于2023年8月15日解禁737 12万股,占总股本比例5 57%,解禁比 -
自治区第十四届运动会开幕 乌鲁木齐女...
8月8日晚上,自治区第十四届运动会在库尔勒市开幕。本届运动会设置竞技 -
21世纪教育(01598.HK):石家庄理工职业...
格隆汇8月9日丨21世纪教育(01598 HK)公告,于2023年8月9日,石家庄理工 -
刚刚,莆田又上央视啦!完整视频来了~
刚刚莆田又上央视啦!今晚,央视财经频道(CCTV-2)《消费主张》重磅播 -
奥运冠军王濛被带走调查?最新回应!她...
日前,有爆料称“前世界冠军,奥运金牌运动员被带走配合调查了”。... -
陕建股份下属子公司中标多项重大项目
挖贝网8月9日,陕建股份(600248)发布公告称,2023年7月,陕西建工集 -
如何与同事打交道?说好这六句话就行,...
如何与同事打交道打开方式:建立良好的沟通和合作关系是在职场中与同事