shader 固定取值

渐变法线

	fixed halfLambert  = 0.5 * dot(worldNormal, worldLightDir) + 0.5;//半兰伯特光照模型
	fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb*_Color.rgb;//通过半兰伯特光照模型对渐变法线取值
	fixed3 diffuse = _LightColor0.rgb * diffuseColor;//直接计算反射

切线空间下的纹理

//顶点函数
//写法 1
				float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w;//计算切线
//				// Construct a matrix which transform vectors from object space to tangent space
       			float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);//模型空间到且切线空间的变换矩阵
  //写法 2 内置方法
               TANGENT_SPACE_ROTATION     	
//片源函数
//计算切线法线
				fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);
				fixed3 tangentNormal;
				// If the texture is not marked as "Normal map" 非Normal map类型
//				tangentNormal.xy = (packedNormal.xy * 2 - 1) * _BumpScale;
//				tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));
				
				// Or mark the texture as "Normal map", and use the built-in funciton
				tangentNormal = UnpackNormal(packedNormal);
				tangentNormal.xy *= _BumpScale;//_BumpScale为自定义类型
				tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));		

世界空间

//顶点函数

			fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  
			fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);  
			fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; 
			
			// Compute the matrix that transform directions from tangent space to world space
			// Put the world position in w component for optimization
			o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
			o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
			o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);

//片源着色器

			fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));
			bump.xy *= _BumpScale;
			bump.z = sqrt(1.0 - saturate(dot(bump.xy, bump.xy)));
			// Transform the narmal from tangent space to world space   世界坐标
			bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));

反射与折射

//顶点

			o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);
			o.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal), _RefractRatio);

//片源取值

			fixed3 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb;
			fixed3 color = ambient + lerp(diffuse, refraction, _RefractAmount) * atten;

菲涅尔反射

//顶点

		o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);

//片源

            	fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb;
				fixed fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(worldViewDir, worldNormal), 5);
				fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));
				fixed3 color = ambient + lerp(diffuse, reflection, saturate(fresnel)) * atten;
				

镜子

//顶点取值

			o.uv = v.texcoord;
			// Mirror needs to filp x
			o.uv.x = 1 - o.uv.x;

玻璃

//片源

				fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));	
				
				// Compute the offset in tangent space
				float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;
				i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;
				fixed3 refrCol = tex2D(_RefractionTex, i.scrPos.xy/i.scrPos.w).rgb;
				
				// Convert the normal to world space
				bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));
				fixed3 reflDir = reflect(-worldViewDir, bump);
				fixed4 texColor = tex2D(_MainTex, i.uv.xy);
				fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * texColor.rgb;
				
				fixed3 finalColor = reflCol * (1 - _RefractAmount) + refrCol * _RefractAmount;

shader 序列帧

			float time = floor(_Time.y * _Speed);  
			float row = floor(time / _HorizontalAmount);
			float column = time - row * _HorizontalAmount;
			
			//half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y / _VerticalAmount);
			//uv.x += column / _HorizontalAmount;
			//uv.y -= row / _VerticalAmount;
			half2 uv = i.uv + half2(column, -row);
			uv.x /=  _HorizontalAmount;
			uv.y /= _VerticalAmount;
			
			fixed4 c = tex2D(_MainTex, uv);

双背景循环

v2f vert (a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac(float2(_ScrollX, 0.0) * _Time.y);
				o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac(float2(_Scroll2X, 0.0) * _Time.y);
				
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target {
				fixed4 firstLayer = tex2D(_MainTex, i.uv.xy);
				fixed4 secondLayer = tex2D(_DetailTex, i.uv.zw);
				
				fixed4 c = lerp(firstLayer, secondLayer, secondLayer.a);
				c.rgb *= _Multiplier;
				
				return c;
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值