ShaderLab学习小结(二)通过Shader变换物体形状
  5WVVrgL6K2nc 2023年11月02日 37 0

运行环境: Win10 x64 Unity 5.5.4 目的:在场景中建立plane平板,通过shader使平板在y坐标上有突起,且随y值定义不同的颜色 先看下效果:

Shader代码如下:

Shader "Custom/ChangeShapeY" {
	Properties{					//定义变量,这些可在物体Inspector面板中进行调整
		_R("R", range(0,5)) = 2	//半径
		_Center("Center",range(-5,5)) = 0	//中心点
		_Scale("Scale", range(1,5)) = 1		//缩放尺度
	}
	SubShader {
		pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "unitycg.cginc"
			float _R;			//上面在Properties里定义的变量必须在这里声明,底下的程序才能用
			float _Center;
			float _Scale;
			struct v2f {
				float4 pos:POSITION;
				float4 vpos:TEXCOORD0;	//记录变化后的物体坐标(物体坐标系)
			};
			v2f vert(appdata_base v)
			{
				v2f o;
				o.vpos = v.vertex;
				//计算物体在xz平面上点与所定义的中心点 float2(_Center,_Center) 的距离
				float dist = distance(o.vpos.xz, float2(_Center,_Center));
				//用定义的半径减去上面求得的距离
				float factor = _R - dist;
				factor = factor < 0 ? 0 : factor;//判断如果小于0则等于0
				o.vpos.y = factor*_Scale;		 //以这个值作为物体的y坐标
				o.pos = mul(UNITY_MATRIX_MVP, o.vpos);//变换至投影空间
				return o;
			}
			fixed4 frag(v2f IN):COLOR
			{
				//以物体y坐标来决定物体颜色的三个分量
				float y = saturate(IN.vpos.y);	//saturate取0到1之间的数
				return fixed4(y, y, y, 1);
			}
			ENDCG
		}
	}
}

如图,定义了一个xz平面上的中心点float2(_Center,_Center),在中心点y坐标最高,距中心点为_R的地方y坐标降至0。且y为0时,颜色是黑,y从0到1之间为从黑到白的渐变,高于1则始终为纯白。 改变y坐标还是在物体坐标系下改变,改好后依然用UNITY_MATRIX_MVP变换到投影坐标系。 最终效果是形成如图中的这样一个圆锥体。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jo5M4GCiOHdG   2023年11月12日   15   0   0 Unity教程Unity
5WVVrgL6K2nc