美文网首页
几何变换_扭曲01

几何变换_扭曲01

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

1.空白shader


Shader "Unlit/niuqu"
{
    SubShader{

            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

            v2f vert(appdata_base v )
                {
                    v2f o;
                    o.pos= UnityObjectToClipPos(v.vertex);      
                    o.color= fixed4(1,1,1,1);       
                    return o; 
                }   
            fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
                {
                    return i.color;
                }
            ENDCG
            }
    }   
}



Shader "Unlit/niuqu"
{
    SubShader{

            pass{
                
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

            

            v2f vert(appdata_base v )

                {
                    float angle=length(v.vertex)*_SinTime.w ;           //模长计算

                    //加入旋转矩阵
                    float4x4 m = 

                    {
                        float4(cos(angle),0,sin(angle),0),
                        float4(0,1,0,1),
                        float4(-sin(angle),0,cos(angle),0),
                        float4(0,0,0,1)
                    };

                    float4x4 p = UNITY_MATRIX_MVP;

                    m =mul(p,m);
                    v2f o;
                    o.pos= mul(m,v.vertex);     //传入矩阵变换
                    o.color= fixed4(0,1,1,1);       //以高度作为颜色
                    return o; 
                }   
            fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
                {
                    return i.color;
                }
            ENDCG
            }
    }   
}
效果参考

矩阵优化


Shader "Unlit/niuqu"
{
   SubShader{

           pass{
               
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "UnityCG.cginc"

           struct a2v
           {
                float4 vertex : POSITION;
           };

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


           v2f vert(appdata_base v )

               {
                   float angle=length(v.vertex)*_SinTime.w ;           //模长计算

                   float x = cos(angle)*v.vertex.x + sin(angle)*v.vertex.z;
                   float z = cos(angle)*v.vertex.z - sin(angle)*v.vertex.x;
                   v.vertex.x = x;
                   v.vertex.z = z;
                   
                   v2f o;
                   float4x4 p = UNITY_MATRIX_MVP;      //用MVP矩阵去变换新矩阵
                   o.pos= mul(p,v.vertex);             //传入矩阵变换
                   o.color= fixed4(0,1,1,1);           //以高度作为颜色
                   return o; 
               }   
           fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
               {
                   return i.color;
               }
           ENDCG
           }
   }   
}

Z方向顶点缩放 效果


矩阵公式

Shader "Unlit/niuqu"
{
    SubShader{
            pass{               
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            struct a2v
            {
                 float4 vertex : POSITION;
            };
 
            struct v2f {                
                float4 pos:POSITION;
                float4 color:COLOR;
            };          

            v2f vert(appdata_base v )
                {
                    float angle=length(v.vertex)*_SinTime.w ;           //模长计算

                    // float x = cos(angle)*v.vertex.x + sin(angle)*v.vertex.z;
                    // float z = cos(angle)*v.vertex.z - sin(angle)*v.vertex.x;
                    // v.vertex.x = x;
                    // v.vertex.z = z;
                     float4x4 m = 
                    {
                        float4(sin(angle),0,0,0),
                        float4(0,1,0,1),
                        float4(0,0,1,0),
                        float4(0,0,0,1)
                    };
                    v.vertex = mul(m,v.vertex);
                    v2f o;
                    float4x4 p = UNITY_MATRIX_MVP;      //用MVP矩阵去变换新矩阵
                    o.pos= mul(p,v.vertex);             //传入矩阵变换
                    o.color= fixed4(0,1,1,1);           //以高度作为颜色
                    return o; 
                }   
            fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
                {
                    return i.color;
                }
            ENDCG
            }
    }   
}

效果

通过给 x值做效果限制 限制在0-1之间


Shader "Unlit/niuqu"
{
    SubShader{
            pass{               
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

            v2f vert(appdata_base v )
                {
                    float angle=length(v.vertex)*_SinTime.w ;           //模长计算

                    // float x = cos(angle)*v.vertex.x + sin(angle)*v.vertex.z;
                    // float z = cos(angle)*v.vertex.z - sin(angle)*v.vertex.x;
                    // v.vertex.x = x;
                    // v.vertex.z = z;
                     float4x4 m = 
                    {
                        float4(sin(angle)/8+0.5 ,0,0,0),  //X/2+0.5 把值限制在0 - 1之间
                        float4(0,1,0,1),
                        float4(0,0,1,0),
                        float4(0,0,0,1)
                    };
                    v.vertex = mul(m,v.vertex);
                    v2f o;
                    float4x4 p = UNITY_MATRIX_MVP;      //用MVP矩阵去变换新矩阵
                    o.pos= mul(p,v.vertex);             //传入矩阵变换
                    o.color= fixed4(0,1,1,1);           //以高度作为颜色
                    return o; 
                }   
            fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
                {
                    return i.color;
                }
            ENDCG
            }
    }   
}


随时间因子做匀速变化


Shader "Unlit/niuqu"
{
    SubShader{
            pass{               
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

            v2f vert(appdata_base v )
                {
                //  float angle=length(v.vertex)*_SinTime.w ;           //模长计算

                    // float x = cos(angle)*v.vertex.x + sin(angle)*v.vertex.z;
                    // float z = cos(angle)*v.vertex.z - sin(angle)*v.vertex.x;
                    // v.vertex.x = x;
                    // v.vertex.z = z;
                    float angle = v.vertex.z+_Time.y ;          //z值+缩放时间因子 会得出随着时间叠加不断变 匀速扭曲的效果

                     float4x4 m = 
                    {
                        float4(sin(angle)/8+0.5 ,0,0,0),  //X/2+0.5 把值限制在0 - 1之间
                        float4(0,1,0,1),
                        float4(0,0,1,0),
                        float4(0,0,0,1)
                    };
                    v.vertex = mul(m,v.vertex);
                    v2f o;
                    float4x4 p = UNITY_MATRIX_MVP;      //用MVP矩阵去变换新矩阵
                    o.pos= mul(p,v.vertex);             //传入矩阵变换
                    o.color= fixed4(0,1,1,1);           //以高度作为颜色
                    return o; 
                }   
            fixed4 frag(v2f i):SV_TARGET            //返回类型要统一 传入传出类型一定要一致
                {
                    return i.color;
                }
            ENDCG
            }
    }   
}

image.png

相关文章

  • 几何变换_扭曲01

    1.空白shader 矩阵优化 Z方向顶点缩放 效果 通过给 x值做效果限制 限制在0-1之间 随时间因子做匀速变化

  • 几何变换

    几何变换是指将一幅图像映射到另一副图像内的操作,根据映射关系的不同,有缩放、翻转、仿射变换、透视、重映射等。 1....

  • 几何变换

    几何变换详解在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),...

  • 几何变换

    相对于点操作改变了图像的值域范围,几何变换关注于改变图像的定义域。原先采用的方法是全局参数化2D变换,之后...

  • 几何变换

    缩放 在shape属性中,第一个值对应的是行数,第二个值对应的是列数 在dsize参数中,第一个值对应的是列数,第...

  • OpenCV实现图像的几何变换

    图像的几何变换 几何变换主要包括缩放、平移、旋转、仿射变换、透视变换和图像裁剪等。执行这些几何变换的两个关键函数是...

  • 研修日志——20180110

    一、几何变换 图形与几何板块必须严格的通过几何变换学几何,在几何变换中,保持不变的性质。 图形与几何学习的第一阶段...

  • 001.opencv图像几何变换

    1. 数学背景 1. 几何变换的含义:改变图像的几何位置、形状、尺寸等几何特征 1.1 位置变换:(刚性变换) 平...

  • 5- OpenCV+TensorFlow 入门人工智能图像处理-

    图片的几何变换 图片的几何变换章节介绍 图片位移 & 图片缩放 图片剪切 & 图片镜像 图片仿射变换 Hog + ...

  • Homography|单应性

    几何变换类型 保距变换 isometry 相似变换 similarity 仿射变换 affine 射影变换 pro...

网友评论

      本文标题:几何变换_扭曲01

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