弯曲跑道Shader

来源:互联网 发布:青岛网站排名seo 编辑:程序博客网 时间:2024/04/28 03:27

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_MVv.vertex);
               float zOff = vPos.z/_What;
                    vPos += float4(-15,0,0,0)*zOff*zOff;
               o.pos = mul (UNITY_MATRIX_PvPos);
               o.uv = v.texcoord;
               return o;
            }

            half4 frag (v2f i) : COLOR
            {
                half4 col = tex2D(_MainTexi.uv.xy);
                return col;
            }
            ENDCG
        }
    }
    
    FallBack "Diffuse"
}


4: 有趣的相关

将物体空间的顶点转化到相机空间。由此,相机为原点的坐标系内,开始计算弯曲。

float4 vPos = mul (UNITY_MATRIX_MVvertex);

抛物线公式。相机为原点的抛物线. 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

0 0