使用shader效果

本文将介绍如何利用shader技术实现彩虹桥的颜色变化效果,通过深入理解shader的工作原理,你可以创建出炫酷的视觉特效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用shader实现地球旋转的效果微笑

Shader "CustomPractice/Earth"{
	Properties{
		//地球纹理
		_EarthTex("EarthTex",2D)= "white"{}
		//云的纹理
		_CloudTex("CloudTex",2D) = "white"{}

	}
	Subshader{
		 Tags{"RendrType" = "Transparent"}
		 pass{
		 	CGPROGRAM
		 	#pragma vertex vert
		 	#pragma fragment frag
		 	#include "UnityCG.cginc"
		 	sampler2D _EarthTex;
		 	sampler2D _CloudTex;
		 	struct v2f {
		 		float4 vertex:POSITION;
		 		float4 texcoord:TEXCOORD0;
		 	};
		 	void vert(inout v2f v){
		 		v.vertex = mul(UNITY_MATRIX_MVP,v.vertex);

		 	}
		 	fixed4 frag(v2f v):COLOR{
		 		//渲染球
		 		fixed u = v.texcoord.x +_Time*0.1;
		 		float2 uv = float2(u,v.texcoord.y);
		 		fixed4 earthColor = tex2D(_EarthTex,uv);
		 		//渲染层
		 		fixed uc=v.texcoord.x+ _Time*0.3;
		 		float2 uvc = float2(uc,v.texcoord.y);
		 		fixed4 cloudColor = tex2D(_CloudTex,uvc);
		 		cloudColor = cloudColor.r * fixed4(1,1,1,1);
		 		//取出地球颜色和云颜色的插值
		 		return lerp(earthColor,cloudColor,0.5);

		 	
		 	}
		

		 	ENDCG
		 }
	}
}








2.使用shader实现卡通人物透明

Shader "CustomPractice/David02"{
	Properties{
		_MainTex("Albedo(RGB)",2D) = "white"{}
		_LogoTex("LogoTex",2D) = "white"{}
	}
	Subshader{
		Tags{"RenderType" = "Transparent"}
		//透明设置
		Blend SrcAlpha OneMinusSrcAlpha
		pass{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
			sampler2D _MainTex;
			sampler2D _LogoTex;
			void vert(inout appdata_base v){
				v.vertex = mul(UNITY_MATRIX_MVP,v.vertex);

			}

			fixed4 frag (appdata_base v):COLOR{
			fixed4 col = tex2D(_MainTex,v.texcoord);
			fixed4 logo = tex2D(_LogoTex,v.texcoord);
			return col*logo;
			}

			ENDCG
		}
	}
	FallBack "diffuse"
}





3.使用shader实现河流流动的效果

Shader "CustomPractice/River"{
	//
	Properties{
		_Color("Color",color) = (1,1,1,1)
		_MainTex("Albeo(RGB)",2D) = "white"{}
		_RiverSpeedX("X_Speed",range(2,10)) = 7
		_RiverSpeedY("Y_Speed",Range(2,10)) = 7	
	}
	Subshader{
		Tags{"RenderType" = "Opaque"}
		CGPROGRAM
		#pragma surface surf Lambert
		sampler2D _MainTex;
		fixed4 _Color;
		fixed _RiverSpeedX;
		fixed _RiverSpeedY;
		//输入结构体
		struct Input{
			float2 uv_MainTex;

		};
		void surf (Input IN,inout SurfaceOutput o){
			//水流的速度
			//使用内置的_Time变量来根据运行时间滚动Texture ,水流速度
			fixed xSpeed = _RiverSpeedX*_Time;
			fixed ySpeed = _RiverSpeedY*_Time;
			//将根据时间的变化速度值的值组合成新的uv 坐标
			fixed2 uv = IN.uv_MainTex + fixed2(xSpeed,ySpeed);
			//对谁流图片进行采样
			fixed4 c = tex2D(_MainTex,uv)*_Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	fallback "Diffuse"
}


 

4.使用shader实现彩虹桥的颜色

//顶点,片段着色器的流程:
//1.首先,vertex program 收到系统传递给他的模型数据
//2.然后把这些数据处理我们后续需要的数据(至少包含顶点位置信息)
//3.进行输出,其他的数据还有:纹理的UV坐标
//4.系统对vertex program输出的顶点数据进行插值运算,并将插值的
//运算结果传递给fragment program
//5.最后fragment program 根据这些插值结果计算成屏幕上显示的像素颜色 
Shader"CustomLearn/Fourth-VertexShader"{
	//属性
	Properties{
		_myColor("Color",Color)=(1,1,1,1)
		_outLine("OutLine",Range(0,1))= 0.1
	}
	Subshader{
		//渲染不透明物体,渲染类型:非透明物体,不受投影的影响
		Tags{"Queue"="Geometry" "RenderType"="Opaque" "IgnoreProjector"="True"}		//第一个通道
		pass{
			CGPROGRAM
			//告诉程序定义顶点着色器
			#pragma vertex vert
			//告诉程序定义一个片段着色器
			#pragma fragment frag

			//使用顶点和片段着色器时.引入对应的CG函数库,相当于引入
			//C#的命名空间,UnityCG.cginc包含常用的属性和函数
			#include "UnityCG.cginc"
			fixed4 _myColor;
			//定义"vertex to fragment"结构体
			//v2f :表示顶点函数到片段程序信息传递
			//这里的传递是位置和颜色的传递
			//顶点着色器计算color并且输出给片段着色器
			struct v2f {
				//在顶点向片段传递数据过程中,还可以包含以下信息
				//1.float4 vertex:POSITION 顶点位置
				//2. float3 normal:NORMAL 顶点法线
				//3. float4 texcoord:TEXCOORD 第一uv坐标
				//4. float4 tangent :TEXCOORD1第二uv坐标
				//5.float4 tanggent:TANGENT;顶点切线
				//6. float4 color:COLOR:每个顶点的颜色
		// 这里的SV_前缀,表示的是System Value(类似命名空间)
		//POSITONG表示每个像素点在屏幕上的位置
		//SV_POSTION和POSITON的区别:当SV:POSITION作为
		//Vertex Shader 输出语义时,这个最终的顶点位置就被固定了,
		//如果作为Vertex Shader输出语义时,那么作用就和POSITION
		//一样代表每个像素点在屏幕上的位置

				float4 pos:SV_POSITION;
		        float3 color:COLOR;
			};
			//顶点函数,参数是一个结构体,返回值也是一个结构体
			//参数 appdata full是"UnityCG.cginc"结构体类型
			//顶点函数中结构体参数类型有:
			//appdata_full;包含顶点位置,切线,法线,和两个纹理坐标
			//appdata_bass:包含顶点位置,法线和一个纹理坐标
			//appdata_tan包含顶点位置,法线,切线和一个纹理坐标
			//appdata_img:包含顶点位置和一个纹理坐标
			v2f vert(appdata_full v){
				//定义一个根据顶点信息计算后的片段信息结构体
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
				o.color = v.vertex*0.8+0.5;
				return o;
			}
			fixed4 frag(v2f i):COLOR{
				return fixed4(i.color *_myColor,1);
			}
			ENDCG	
			}
	  //第二个通道
	  pass{
	  	Name "Border"
	  	Tags{"LightModel"= "ForwardBase"}
	  	//前方剔除
	  	cull Front
	  	Lighting On
	  	CGPROGRAM
	  	#pragma vertex vert
	  	#pragma fragment frag
	  	//编译指令,编译正向渲染基础通道
	  	//用于正向渲染中,应用环境光光照,主方向光照和顶点所需要的光照
	  	#pragma multi_compile_fwdbase
	  	#include "UnityCG.cginc"
	  	//float相当于Range类型
	  	float _outLine;

	  	struct a2v {
	  		float4 vertex:POSITION;
	  		float3 normal:NORMAL;
	  	};
	  	struct v2f{
	  		float4 pos:POSITION;
	  	};
	  	v2f vert(a2v v){
	  		v2f o;
	  		float4 pos = mul(UNITY_MATRIX_MV,v.vertex);
	  		float3 normal = mul(UNITY_MATRIX_IT_MV,v.normal);
	  		//外部轮廓的厚度
	  		pos = pos +float4(normalize(normal),0)*_outLine;
	  		o.pos = mul(UNITY_MATRIX_P,pos);
	  		return o;
	  	};
	  	fixed4 frag (v2f i):COLOR{
	  		return fixed4(0,0,0,1);
	  	}
	  	ENDCG
	  }
	}

}







                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值