首页 > 其他分享 >【Unity3D】广告牌特效

【Unity3D】广告牌特效

时间:2023-08-09 21:22:33浏览次数:35  
标签:Unity3D 特效 广告牌 坐标 float4 顶点 坐标系 float3

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

​ 运行效果:

img

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

​ 运行效果:

img

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

​ 运行效果:

img

​ 声明:本文转自【Unity3D】广告牌特效

标签:Unity3D,特效,广告牌,坐标,float4,顶点,坐标系,float3
From: https://www.cnblogs.com/zhyan8/p/17615594.html

相关文章

  • 【Unity3D】调整屏幕亮度、饱和度、对比度
    1屏幕后处理流程​调整屏幕亮度、饱和度、对比度,需要使用到屏幕后处理技术。因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度、饱和度、对比度的实现。​本文完整资源见→Unity3D调整屏幕亮度、饱和度、对比度。​屏幕后处理即:渲染完所有对象后,得到一张屏幕图......
  • 高效控制轨道——折叠栅格化特效开
    第一个是折叠按钮我们在发现层太多了,我们不想看到他我们把需要的层先锁定起来,然后选中没用的层然后点上面的总控开关要注意,这里的层没有消失,只是让我们折叠起来了当我们把导入的东西放大后,会出现像素点但是我们选中栅格化后就变得清晰,也就是第二个按钮后面的哪个就......
  • JS中BOM事件,JS样式特效,表格对象和表单操作
    DOM事件1.DOM中的事件可以分为两类1.浏览器行为如:文档加载完成,图片加载完成2.用户行为如:输入框输入数据,点击按钮(2).常见的DOM事件onload浏览器已完成页面的加载支持事件的对象windowimageonchangeHTML元素改变onclick用户点击HTML元素o......
  • jQuery 自学笔记—10 常见特效 (终章)
    隐藏、显示、切换,滑动,淡入淡出,以及动画效果演示点击这里,隐藏/显示面板一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容。在这里,您可以通过一种易懂的便利的模式获得您需要的任何知识。实例jQueryhide()演示一个简单的jQueryhide()方法。jQueryhid......
  • GOM GEE引擎默认盛大衣服翅膀特效设置办法
     GOM引擎GEE引擎,默认盛大衣服翅膀特效,比如雷霆,火龙这些装备的翅膀特效。这种装备的特效如果你的客户端够新,就可以直接在DBC里改,我们打开DBC,找到你要改的衣服,再找到Anicount这段,这里就是设置默认有服翅膀的,比如3,3就是火龙翅膀,再比如1,1就是雷霆翅膀,改成0就是无特效,大家可以去试下。......
  • After Effects 2023 - 视频特效和动画制作软件mac/win版
    AfterEffects2023是一款功能强大的视频合成和特效制作软件,它被广泛用于电影、电视、广告和网络视频等领域。在这800字的介绍中,我将向您详细说明AfterEffects2023的特点、功能和优势。点击获取AfterEffects2023 首先,AfterEffects2023提供了一个直观而强大的界面,使......
  • DaVinci Resolve Studio 18.5 (macOS, Windows) - 剪辑、调色、特效和音频后期制作
    DaVinciResolveStudio18.5(macOS,Windows)-剪辑、调色、特效和音频后期制作BlackmagicDesignDaVinciResolveStudio18.5请访问原文链接:https://sysin.org/blog/davinci-resolve-18/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDaVinciResolve18免费......
  • Adobe After Effects 2023 v23.4 (macOS, Windows) - 后期特效
    AdobeAfterEffects2023v23.4(macOS,Windows)-后期特效Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访......
  • Unity3D___微信小游戏常用API总结
    获取用户信息游戏初始化WX.InitSDK((code)=>{//打印屏幕信息varsystemInfo=WX.GetSystemInfoSync();Debug.Log($"{systemInfo.screenWidth}:{systemInfo.screenHeight},{systemInfo.windowWidth}:{systemInfo.windowHeight},......
  • Unity3D_拯救死循环
    当我们无意间写了死循环,此时只能调出任务管理器重新打开Unity工程一个偶然的机会我得知了一个不用结束任务,就可以挽救死循环的方法,整理如下总体思路:首先,创建一个Cube,让它沿Y轴旋转,通过它是否旋转来判断程序是否进入了死循环;其次,创建一个bool类型的变量,默认值为false,通过按......