1: 在vertex and fragment shader中,在渲染阶段控制物体顶点的偏移,可以动态做出一些不错的效果,其一就是跑酷常见的路面弯曲效果。
2: 消耗~~几乎没增加什么渲染负担。
4:代码
Shader "Custom/TestCurved" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_What("what",float) = 200
}
SubShader {
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _What;
struct v2f {
float4 pos : POSITION;
float4 uv : TEXCOORD0;
};
v2f vert (appdata_full v)
{
v2f o;
float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
float zOff = vPos.z/_What;
vPos += float4(-15,0,0,0)*zOff*zOff;
o.pos = mul (UNITY_MATRIX_P, vPos);
o.uv = v.texcoord;
return o;
}
half4 frag (v2f i) : COLOR
{
half4 col = tex2D(_MainTex, i.uv.xy);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
4: 有趣的相关
将物体空间的顶点转化到相机空间。由此,相机为原点的坐标系内,开始计算弯曲。
float4 vPos = mul (UNITY_MATRIX_MV, vertex);
抛物线公式。相机为原点的抛物线. float4的x,y,z,w. 调整x,y,z可以实现道路在3d空间的弯曲程度。
(z轴正向指向屏幕内,x轴正向左->右,y轴正向下->上)
float zOff = vPos.z/200; // 不至于弯曲的过于厉害。
vPos += float4(0,-30,0,0)*zOff*zOff;
这里的:vPos += float4(-15,0,0,0)*zOff*zOff; float4数值,可以根据自定义需要修改相上下左右弯曲
原文链接:http://blog.csdn.net/guccang/article/details/45077223