UnityShader学习6 vertexShader的入门

//笔记1 基本的结构
Shader "ShaderLearn/vf2" { Properties{ _MainColor("Main Color", color) = (1,1,1,1) } SubShader{ pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" fixed4 _MainColor; uniform fixed4 _SecondColor; // struct appdata_base//输入结构体 unity一般会为我们的gpu传输位置、颜色、法线、切线 ;不需要我们写,可以直接引用#include "UnityCG.cginc"来使用 // { // float2 pos : POSITION; // fixed4 col : COLOR; // }; struct v2f{//顶点输入struct包装 一定要打 ‘;’ 号!!!! float4 pos : POSITION; float2 objPos : TEXCOORD0; fixed4 col : COLOR; }; v2f vert(appdata_full v) { int a; v2f o; o.pos = v.vertex; o.objPos = float2(1, 0); o.col = v.color; //o.pos; return o; } fixed4 frag(v2f IN) : COLOR { //col = float4(1,1,0,1); //return _MainColor * _SecondColor;//IN.col; return _MainColor * 0.5 + _SecondColor * 0.5; } ENDCG } } }

 

 

笔记2:

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

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

//笔记2 根据顶点在模型空间位置,改变颜色
Shader "ShaderLearn/vf4" {
    
    SubShader{

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

            float4x4 rm;//从c#脚本获取的旋转矩阵
            float4x4 mvp;//从C#脚本获取的模型到相机到投影的转换矩阵
            float4x4 sm;//从c#脚本获取的缩放矩阵

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

            v2f vert(appdata_base v) 
            {
                v2f o;
                //o.pos = mul(mvp, v.vertex);//第一种方式:从脚本获取变换矩阵

                //float4 rmPos = mul(v.vertex, /*rm*/sm);//第二种:用unity自带的mvp矩阵
                //o.pos = UnityObjectToClipPos(rmPos);//mul(v.vertex,rm );
        
                o.pos = UnityObjectToClipPos(v.vertex);//普通,什么都没有的
                /*if (v.vertex.x > 0)
                {
                    o.color = fixed4(0, 0, 1, 1);
                }
                else
                {
                    o.color = fixed4(1, 0, 0, 1);
                }*/
                if (v.vertex.x == 0.5 && v.vertex.y == .5 && v.vertex.z == -0.5)
                {
                    o.color = fixed4(_SinTime.w/2 + 0.5, _CosTime.w/2 + 0.5, _SinTime.y + 0.5, 1);
                }
                else
                {
                    o.color = fixed4(_SinTime.w / 2 + 0.5,1 , 1, 1);
                }

                /*float4 wpos = mul(unity_ObjectToWorld, v.vertex);
                if (wpos.x > 0)
                {
                    o.color = fixed4(1, 0, 0, 1);
                }
                else
                {
                    o.color = fixed4(0, 0, 1, 1);
                }*/


                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                return IN.color;
            }


            ENDCG

        }
        
    }
}

 

 

笔记3:

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

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

//笔记3 根据顶点在屏幕空间位置,改变颜色

Shader "ShaderLearn/vf5" {
    
    SubShader{

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

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

            v2f vert(appdata_base v) 
            {
                v2f o;
                
                o.pos = UnityObjectToClipPos(v.vertex);
                
                float x = o.pos.x / o.pos.w;//齐次除法

                if (x <= -1)
                {
                    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;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                return IN.color;
            }


            ENDCG

        }
        
    }
}

 

 

笔记4:

//笔记4 根据顶点在世界空间的位置,改变高度和颜色
Shader "ShaderLearn/vf6" { Properties{ _R("R", range(0, 5)) = 1 _OX("OX",range(0, 5)) = 1 } SubShader{ pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _R; float _OX; struct v2f{ float4 pos : POSITION; fixed4 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));//高度比率,这里对xy作一个偏移 d = d < 0 ? 0 : d;//因为可能会出现负数,所以要做一个处理 float height = 1; float4 upPos = float4(v.vertex.x, height * d, v.vertex.z, v.vertex.w);//d越大,高度越高 v2f o; o.pos = UnityObjectToClipPos(upPos); //根据坐标设置不同颜色 float x = o.pos.x / o.pos.w; if (x <= -1) { 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.x, upPos.y, upPos.z, 1); float y = o.pos.y / o.pos.w; if (y > 0 && y < 0.5) { o.color = fixed4(0.5, 0.5, 1, 1); } else { o.color = fixed4(1, 1, 1, 1); } return o; } fixed4 frag(v2f IN) : COLOR { return IN.color; } ENDCG } } }

 

笔记5:

//笔记5 x方向的边的波浪扭曲

Shader "ShaderLearn/vf7" {
    
    SubShader{

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

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

            v2f vert(appdata_base v) 
            {
                v2f o;
                //优化前
                float angle = length(v.vertex) + _Time.y;
                /*float4x4 m = {
                    float4(cos(angle), 0, sin(angle), 0),
                    float4(0, 1, 0, 0),
                    float4(-sin(angle), 0, cos(angle), 0),
                    float4(0, 0, 0, 1)
                };
                v.vertex = mul(v.vertex, m);*/
                
                //优化后
                /*float x = cos(angle) * v.vertex.x + sin(angle) * v.vertex.z;
                float z = -sin(angle) * v.vertex.x + cos(angle) * v.vertex.z;
                v.vertex.x = x;
                v.vertex.z = z;*/

                //x方向的波浪扭曲
                float x = (sin(angle) / 8 + 0.5) * v.vertex.x;
                v.vertex.x = x;
                o.pos = UnityObjectToClipPos(v.vertex);
                
                o.color = fixed4(1, 1, 1, 1);
                
                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                return IN.color;
            }


            ENDCG

        }
        
    }
}

 

笔记6:

//笔记6: 波浪函数
Shader "ShaderLearn/vf8" {
    
    SubShader{

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

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

            v2f vert(appdata_base v) 
            {
                v2f o;
                //优化前
                //float angle = length(v.vertex) + _Time.y;
                /*float4x4 m = {
                    float4(cos(angle), 0, sin(angle), 0),
                    float4(0, 1, 0, 0),
                    float4(-sin(angle), 0, cos(angle), 0),
                    float4(0, 0, 0, 1)
                };
                v.vertex = mul(v.vertex, m);*/
                
                //优化后
                /*float x = cos(angle) * v.vertex.x + sin(angle) * v.vertex.z;
                float z = -sin(angle) * v.vertex.x + cos(angle) * v.vertex.z;
                v.vertex.x = x;
                v.vertex.z = z;*/

                //x方向的波浪扭曲
                /*float x = (sin(angle) / 8 + 0.5) * v.vertex.x;
                v.vertex.x = x;*/

                //v.vertex.y += 0.3 * sin(-length(v.vertex.zx) * 1.2 + _Time.w);//圆心波
                //两个正弦波模拟波浪
                v.vertex.y += 0.3 * sin((v.vertex.x + v.vertex.z) * 1.2 + _Time.w);
                v.vertex.y += 0.2 * sin((v.vertex.x - v.vertex.z) + _Time.y);
                o.pos = UnityObjectToClipPos(v.vertex);
                
                o.color = fixed4(v.vertex.y, v.vertex.y, 0.8, 1);
                
                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                return IN.color;
            }


            ENDCG

        }
        
    }
}

 

posted on 2019-05-30 16:46  炼金师  阅读(374)  评论(0)    收藏  举报

导航