几何变换_山峰隆起

2020-07-02  本文已影响0人  Rayson

1.基于屏幕变换过后的顶点变换


Shader "Unlit/V2f35"
{

        Properties{

            _R("R",Range(0,5))=1
        }
    SubShader{
            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float dis; //动态范围
            float r;    //动态半径
            float _R;   //

            struct a2v
            {
                 float4 vertex : POSITION;
            };

            struct v2f {                
                float4 pos:POSITION;
                float4 color:COLOR;
            };          

            v2f vert(appdata_base v )
                {
                    float2 xy = v.vertex.xz;                        //取得二维向量xz
                    float d = _R - length(xy);                      //计算模长      

                    d= d<0 ? 0 : d;                                 //判断d值是不是为0或者 比率为 0 否则直接取d
                    float height =1;

                    float4 uppos=float4(v.vertex.x, height*d , v.vertex.z ,v.vertex.w);//改写顶点数据里面的内容   新的位置信息 

                    v2f o;

                    o.pos= UnityObjectToClipPos(uppos);     

                        float x= o.pos.x / o.pos.w;
                        if(x > dis && x < dis + r)
                            o.color=fixed4(1,0,0,1);
                        else if(x>1)
                            o.color=fixed4(0,0,1,1);
                        else
                            o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);
                    return o; 
                }   

            fixed frag(v2f i):SV_TARGET
                {
                    return i.color;
                }
            ENDCG
            }
    }
    
}

效果

2.让凸起来的部分(越高的颜色越白),需要基于新的顶点数据进行变换(模型空间)


Shader "Unlit/V2f35"
{

        Properties{

            _R("R",Range(0,5))=1
        }
    SubShader{
            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float dis; //动态范围
            float r;    //动态半径
            float _R;   //

            struct a2v
            {
                 float4 vertex : POSITION;
            };
 
            struct v2f {                
                float4 pos:POSITION;
                float4 color:COLOR;
            };          

            v2f vert(appdata_base v )
                {
                    float2 xy = v.vertex.xz;                        //取得二维向量xz
                    float d = _R - length(xy);                      //计算模长      

                    d= d<0 ? 0 : d;                                 //判断d值是不是为0或者 比率为 0 否则直接取d
                    float height =1;

                    float4 uppos=float4(v.vertex.x, height*d , v.vertex.z ,v.vertex.w);//改写顶点数据里面的内容   新的位置信息 

                    v2f o;

                    o.pos= UnityObjectToClipPos(uppos);     

                        // float x= o.pos.x / o.pos.w;
                        // if(x > dis && x < dis + r)
                        //  o.color=fixed4(1,0,0,1);
                        // else if(x>1)
                        //  o.color=fixed4(0,0,1,1);
                        // else
                        //  o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);

                    o.color= fixed4(uppos.y, uppos.y, uppos.y ,1);      //以高度作为颜色
                    return o; 
                }   

            fixed frag(v2f i):SV_TARGET
                {
                    return i.color;
                }
            ENDCG
            }
    }
    
}


基于世界空间

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'


Shader "Unlit/V2f35"
{

        Properties{

            _R("R",Range(0,5))=1
        }
    SubShader{
            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float dis; //动态范围
            float r;    //动态半径
            float _R;   //

            struct a2v
            {
                 float4 vertex : POSITION;
            };
 
            struct v2f {                
                float4 pos:POSITION;
                float4 color:COLOR;
            };          

            v2f vert(appdata_base v )
                {
                    float4 wpos =mul(unity_ObjectToWorld,v.vertex);     //将模型空间装换成世界

                    float2 xy = wpos.xz;                        //取得二维向量xz
                    float d = _R - length(xy);                      //计算模长      

                    d= d<0 ? 0 : d;                                 //判断d值是不是为0或者 比率为 0 否则直接取d
                    float height =1;

                    float4 uppos=float4(v.vertex.x, height*d , v.vertex.z ,v.vertex.w);//改写顶点数据里面的内容   新的位置信息 

                    v2f o;

                    o.pos= UnityObjectToClipPos(uppos);     

                        // float x= o.pos.x / o.pos.w;
                        // if(x > dis && x < dis + r)
                        //  o.color=fixed4(1,0,0,1);
                        // else if(x>1)
                        //  o.color=fixed4(0,0,1,1);
                        // else
                        //  o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);

                    o.color= fixed4(uppos.y, uppos.y, uppos.y ,1);      //以高度作为颜色
                    return o; 
                }   

            fixed frag(v2f i):SV_TARGET
                {
                    return i.color;
                }
            ENDCG
            }
    }
    
}

image.png

改变中心点

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'


Shader "Unlit/V2f35"
{

        Properties{

            _R("R",Range(0,5))=1
            _OX ("OX",Range(-5,5))=0            //添加中心点控制杆
        }
    SubShader{
            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float dis; //动态范围
            float r;    //动态半径
            float _R;   //
            float _OX; //添加中心

            struct a2v
            {
                 float4 vertex : POSITION;
            };
 
            struct v2f {                
                float4 pos:POSITION;
                float4 color:COLOR;
            };          

            v2f vert(appdata_base v )
                {
                    float4 wpos =mul(unity_ObjectToWorld,v.vertex);     //将模型空间装换成世界

                    float2 xy = wpos.xz;                        //取得二维向量xz
                    float d = _R - length(xy - float2(_OX,0));                      //计算模长       float2(_OX,0)为中心点到世界中心的距离 

                    d= d<0 ? 0 : d;                                 //判断d值是不是为0或者 比率为 0 否则直接取d
                    float height =1;

                    float4 uppos=float4(v.vertex.x, height*d , v.vertex.z ,v.vertex.w);//改写顶点数据里面的内容   新的位置信息 

                    v2f o;

                    o.pos= UnityObjectToClipPos(uppos);     

                        // float x= o.pos.x / o.pos.w;
                        // if(x > dis && x < dis + r)
                        //  o.color=fixed4(1,0,0,1);
                        // else if(x>1)
                        //  o.color=fixed4(0,0,1,1);
                        // else
                        //  o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);

                    o.color= fixed4(uppos.y, uppos.y, uppos.y ,1);      //以高度作为颜色
                    return o; 
                }   

            fixed frag(v2f i):SV_TARGET
                {
                    return i.color;
                }
            ENDCG
            }
    }
    
}

image.png
上一篇下一篇

猜你喜欢

热点阅读