Unity

it2024-05-06  55

Shader代码如下:

Shader "Unlit/vf3" { //MVP 顶点颜色变换 Properties{ _MainColor("我是颜色呀",color) = (1,1,1,1) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" //声明一个4x4矩阵 通过C#脚本赋值 float4x4 mvp; float4x4 rm; fixed4 _MainColor; //声明方式二 取别名 用结构体代替 vert里的out输出 // typedef struct { // float4 pos:POSITION; // float4 col:COLOR0; // }v2f; //方式一 //输出结构体 struct v2f{ float4 pos:POSITION; fixed4 color:COLOR; }; //in 输入结构体 struct inInfo{ float2 objPos:POSITION; fixed4 col:COLOR; }; //vert 中in输入接收到物体传过来的 objPos物体坐标位置 // out将颜色信息 输出到frag中 进行颜色的下一步处理 //vert中可以有多个out输出 但语义不能重复 out float4 pos:POSITION,out float4 col:COLOR0 v2f vert(appdata_base v) { v2f o; float4x4 m = mul(rm,UNITY_MATRIX_MVP); o.pos = mul(m,v.vertex); // if(v.vertex.y > 0){ // o.color = fixed4(1,0.5,0.5,1); // }else{ // o.color = fixed4(0,0.5,0.5,1); // } //从自身顶点转换到世界坐标顶点 fixed4 wpos = mul(unity_ObjectToWorld,v.vertex); if(wpos.y > 0.5){ // _MainColor = fixed4(_SinTime.w / 2 +0.5,_CosTime.w / 2 +0.5,_SinTime.y / 2 +0.5,1); _MainColor = fixed4(_SinTime.w / 2 +0.5,0.5,0.5,1); //过渡改变颜色 _SinTime.w / 2 +0.5 将数值缩放在0-1的范围内 }else{ // _MainColor = fixed4(_SinTime.w / 2 +0.5,_CosTime.w / 2 +0.5,_SinTime.y / 2 +0.5,1); _MainColor = fixed4(_SinTime.w / 2 +0.5,_CosTime.y / 2 +0.5,1,1); //过渡改变颜色 _SinTime.w / 2 +0.5 将数值缩放在0-1的范围内 } o.color = _MainColor; return o; } //frag 里in输入 接收vert里传过来的数据 // out输出到游戏物体上 看到最终效果 inout float4 col:COLOR fixed4 frag (v2f info):COLOR //方法函数后跟 :语义 (意思就是给函数返回值定义一个语义) { return info.color; } ENDCG } } }

效果图(会随着时间自动改变颜色):

最新回复(0)