Unity Shader之广告牌

广告牌在实际游戏开发中使用非常广泛,可以用于草丛,云朵等,其实现的具体效果就是让摄像机在任意角度时,使用广告牌的物体都会面向摄像机,广告牌属于经典的顶点变换。

1. 创建相关场景,shader,材质球,和一个Quad,为了方便观察,我们将Quad沿x轴翻转50度并设置后位置,完成后效果如下:
2. 我们都知道如果想让一个物体面向摄像机的时候,需要表面法线和向上方向的垂直,但往往因物体角度的旋转导致两者并不垂直,此时我们需要固定一个方向来更正另一个方向
3. 打开shader文件,首先简单定义一下shder内属性和方法,其中_VerticalBillboarding字段用来固定一个视角
Shader "Youcai/test/BillBoard" {
    Properties{
        _MainTex("Main Tex", 2D) = "white"{}
        _Color("Main Color", Color) = (1,1,1,1)
        _VerticalBillboarding("Vertical Restraints", Range(0,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 "UnityCG.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            float _VerticalBillboarding;

            struct a2v
            {
                float4 vertex: POSITION;
                float4 texcoord : TEXCOORD0;
            };
            struct v2f
            {
                float4 pos: SV_POSITION;
                float2 uv: TEXCOORD0;
            };

            void vert(in a2v v, out v2f f)
            {
            }

            fixed4 frag(v2f f) : SV_Target
            {
            }
            ENDCG
        }

    }
    FallBack "Transparent/VertexLit"
}
4. 定义顶点着色器和片元着色器内容,其中顶点着色器内为核心部分
void vert(in a2v v, out v2f f)
{
     //计算以模型空间下原点为锚点,根据顶点位置最后做偏移
     float3 center = float3(0, 0, 0);
     //将摄像机位置转为模型空间位置
     float3 object_viewer = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
     /*
     1. 我们首先假定摄像机到锚点位置为表面法线(不理解可以看步骤2)
     2. 通过控制法线的y轴值来确定固定的视角为法线还是向上方向
     3. _VerticalBillboarding越接近1,normalDir值y值不偏移,则越强制偏向摄像机
     */
     float3 normalDir = object_viewer - center;
     normalDir.y = (normalDir.y * _VerticalBillboarding);
     normalDir = normalize(normalDir);
     //法线应与向上方向垂直,我们通过三元表达式获取一个向上方向的大致方向
     float3 upDir = abs(normalDir.y) > 0.999 ? float3(0, 0, 1) : float3(0, 1, 0);
     //通过向上方向和法线的叉乘获得向右方向
     float3 rightDir = normalize(cross(normalDir, upDir));
     //通过向右方向在求取正确的向上方向
     upDir = normalize(cross(normalDir, rightDir));
     //获取当前顶点距锚点偏移值
     float3 centerOffs = v.vertex.xyz - center;
     //求取正确顶点位置 向右对应x轴,向上对应y轴,法线对应z轴进行偏移
     float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.y + normalDir * centerOffs.z;
     //片元传递正确uv和坐标
     f.pos = UnityObjectToClipPos(float4(localPos, v.vertex.w));
     f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
}

fixed4 frag(v2f f) : SV_Target
{
     fixed4 c = tex2D(_MainTex, f.uv);
     c.rgb *= _Color.rgb;
     return c;
}
5. 赋予Quad材质球,通过更改Vertical Restraints属性来查看效果吧!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容