广告牌 Shader

TA 广告牌 ShaderLab

参考冯乐乐《Shader入门精要》
首先有几个点先说一下

  1. 首先就是开始构建 变换矩阵 用于将模型顶点旋转到面向摄像机 也即是法向量面向它
  2. 然后还有将相机转换到模型空间下,因为是以模型中心为原点进行旋转,所以将相机转换到模型空间下好算点,其实也可以在世界空间下,就是记得最后旋转的时候要处理一下
  3. 最后就是将模型顶点与变换矩阵相乘 最后得出面向摄像机的顶点,然后正常采样纹理就好了
  4. 那个剔除功能要打开, 这个其实我也不是很理解 反正就是不打开的话,我这个写法正面是无法看到的,只能看到背面,省事的话也可以直接 Cull Off
Pass{
            Tags { "LightMode"="ForwardBase" }
			
            Cull front
			ZWrite off
            blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
            // a: application v: vertex shader 从应用到顶点阶段 a2 f:fraction  顶点到片元阶段
            struct a2v{
                float4 position: POSITION;
                float2 uv: TEXCOORD;
            };
            
            struct v2f{
                float4 position: SV_POSITION;
                float2 uv: TEXCOORD0;
            };
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _Color;

            v2f vert(a2v i){
                v2f o;
                // 法线方向和 朝向摄像机 
                float3 normal = normalize( mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1)));
                //然后假设一个向上的方向 以次来计算向右的方向,
                float3 upDir = abs(normal.y)> 0.99? float3(0, 0, 1): float3(0, 1, 0);
                float3 rightDir = normalize(cross(upDir, normal));
                //  然后就是用向右和向前的方向叉乘得到向上的方向
                upDir = normalize(cross(normal, rightDir));
                // 得到变换矩阵、
                float3x3 rotateMATRIX = float3x3(rightDir, upDir, normal);
                // 然后乘于上面转置矩阵,下面这个写法相当于
                //mul((rotateMATRIX)^T , i.position.xyz)  
                float3 tem= mul( i.position.xyz,rotateMATRIX); 
               	// 其实也可以这样写
                //float3 tem= rightDir * i.position.x +
                  upDir * i.position.y + normal * i.position.z;
                
                o.position = UnityObjectToClipPos(float4(tem, 1));

                o.uv = TRANSFORM_TEX(i.uv, _MainTex);
                return o;
            }
            fixed4 frag(v2f i):SV_TARGET
            {
                fixed4 albedo = tex2D(_MainTex, i.uv)*_Color;
                return albedo;
            }

            ENDCG
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值