欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity Shader 小白之旅(二)

程序员文章站 2022-06-10 21:13:43
...

原文写的确实挺好的,说的内容也挺详细,最主要是刚入门的小白能够看明白,不过有个别的地方有错误,不过我都在下方评论粘出来了,也是为了避免跟我一样的小白掉到坑里去。

Shader "Custom/Study"
{
   Properties
   {
	   _Color("Color",Color) = (1,1,1,1)
	   _MainTex("Texture",2D) = "white"{}
	   _Range("Range",Range(0,1)) = 1
	   _ExtrudeAmount("Extrue Amuount",float) = 0
   }
   SubShader
   {
	   Pass
	   {
		   CGPROGRAM
           #pragma vertex vertexFunction
		   #pragma fragment fragmentFunction
		   #include "UnityCG.cginc"
		   struct a2v
		   {
			   float4 vertex:POSITION;//顶点坐标
			   float2 uv:TEXCOORD0;//uv纹理
			   float3 normal:NORMAL;
		   };
		   struct v2f
		   {
			   float4 position:SV_POSITION;//sv指的是system value
			   float2 uv:TEXCOORD0;//uv 纹理
		   };
		   float4 _Color;
		   sampler2D _MainTex;//获取这个属性在cg中使用  sampler2D 2d图片关键字
		   float _Range;//range
		   float _ExtrudeAmount;
		   v2f vertexFunction(a2v v)
		   {
			   v2f o;
			   //顶点拉伸扩散
			   //sin(_Time.y) _Time是代表时间变量被包含在UnityCH.cginc中,y值代表秒
			   v.vertex.xyz+=v.normal.xyz*_ExtrudeAmount/**sin(_Time.y)*/;  //sin(_Time.y)pingbong
			   //Unity提供的APIUnityObjectToClipPos()
			   //(将世界空间的模型坐标转换成裁剪空间,
			   //函数内部封装了实现顶点坐标变换的具体细节,矩阵等等)
			   o.position = UnityObjectToClipPos(v.vertex);
			   o.uv = v.uv;
			   return o;
		   }
		   fixed4 fragmentFunction(v2f i):SV_TARGET
		   {
			   float4 _mT = tex2D(_MainTex,i.uv);
			   clip(_mT.rgb-_Range);
			   return _mT *_Color;//对纹理进行采样 tex2D()
		       //想让model显示color又显示贴图 在return的时候贴图跟color进行相乘
		  }
		   ENDCG
	   }
   }
   FallBack "Diffuse"
}

相关标签: Shader