美文网首页
几何变换_山峰隆起

几何变换_山峰隆起

作者: Rayson | 来源:发表于2020-07-02 09:11 被阅读0次

    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

    相关文章

      网友评论

          本文标题:几何变换_山峰隆起

          本文链接:https://www.haomeiwen.com/subject/rlrlqktx.html