TA 广告牌 ShaderLab
参考冯乐乐《Shader入门精要》
首先有几个点先说一下
- 首先就是开始构建 变换矩阵 用于将模型顶点旋转到面向摄像机 也即是法向量面向它
- 然后还有将相机转换到模型空间下,因为是以模型中心为原点进行旋转,所以将相机转换到模型空间下好算点,其实也可以在世界空间下,就是记得最后旋转的时候要处理一下
- 最后就是将模型顶点与变换矩阵相乘 最后得出面向摄像机的顶点,然后正常采样纹理就好了
- 那个剔除功能要打开, 这个其实我也不是很理解 反正就是不打开的话,我这个写法正面是无法看到的,只能看到背面,省事的话也可以直接 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
}