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 } } }
浙公网安备 33010602011771号