Shader山下(十一)纹理混合

Shader山下(八)片段着色器介绍了如何编写片段着色器,本文就使用它实现纹理混合效果。

首先需要一份最简单的片段着色器:

Shader "Custom/Frag/Blend" {
	Properties {
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img                             
			#pragma fragment frag                               
			#pragma fragmentoption ARB_precision_hint_fastest   
			#include "UnityCG.cginc"                            

			uniform sampler2D _MainTex;

			fixed4 frag(v2f_img i) : COLOR                      
			{
				fixed4 renderTex = tex2D(_MainTex, i.uv);
				return renderTex;
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

Properties增加混合贴图和混合参数:

		_BlendTex ("Blend Texture", 2D) = "white" {}
		_Opacity ("Blend Opacity", Range(0, 1)) = 1

SubShader里声明同名变量:

			sampler2D _BlendTex;
			fixed _Opacity;

修改frag方法:

			fixed4 frag(v2f_img i) : COLOR
			{
				fixed4 renderTex = tex2D(_MainTex, i.uv);
				fixed4 blendTex = tex2D(_BlendTex, i.uv);

				fixed4 blended = getBlended(renderTex, blendTex);

				renderTex = lerp(renderTex, blended, _Opacity);

				return renderTex;
			}

getBlended方法:

			fixed4 getBlended()
			{
				fixed4 blended;
				blended = renderTex * blendTex;
				return blended;
			}

lerp是插值方法,计算from(第一个参数)和to(第二个参数)之间在p(第三个参数)上的插值,即lerp = from + (to - from) * p。


可以使用下面两张图片作为基础图片和混合图片:



获得效果:



我们还可以尝试一下其他混合,例如把getBlended方法改成:

			fixed4 getBlended(fixed4 renderTex, fixed4 blendTex)
			{
				fixed4 blended;
				blended = renderTex + blendTex;
				return blended;
			}

效果:



此外,还可以使用一种称为屏幕混合的方法:

			fixed4 getBlended(fixed4 renderTex, fixed4 blendTex)
			{
				fixed4 blended;
				blended = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));
				return blended;
			}
效果:



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值