Unity Shader 学习笔记(9) 渐变纹理、遮罩纹理

44 篇文章 5 订阅
36 篇文章 5 订阅

Unity Shader 学习笔记(9) 渐变纹理、遮罩纹理

参考书籍:《Unity Shader 入门精要》


渐变纹理

没有使用纹理,和使用两种不同渐变纹理对比:
在这里插入图片描述

就是通过一张梯度变换的纹理,取样赋值。可实现一些卡通风格。
使用半兰伯特模型:

v2f vert(a2v v) {
	...
	o.uv = TRANSFORM_TEX(v.texcoord,_RampTex);	// _RampTex为外部输入的渐变纹理,宏为计算缩放、偏移后uv值。
	return o;
}

fixed4 frag(v2f i) : SV_TARGET {
	...

	// 半兰伯特模型
	fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5;
	// 通过halfLambert值大小对渐变纹理取样。因为变换范围在[0,1],所以可以直接作为纹理坐标值,值越大坐标越往右上。
	fixed3 diffuseColor = tex2D(_RampTex,fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;
	
	fixed3 diffuse = _LightColor0.rbg * diffuseColor;

	...
}

遮罩纹理

单张纹理,单张+法线纹理,单张+法线+遮罩纹理对比:
在这里插入图片描述

类似PhotoShop的蒙板,用于控制部分区域的纹理,值越大越白越用于受影响。配合法线纹理使用。这里控制的是高光反射的值。

切线空间下计算:

Properties {
	...
	_SpecularMask ("Specular Mask",2D) = "white" {}		// 高光反射遮罩
	_SpecularScale ("Specular Scale",Float) = 1.0		// 遮罩影响度系数
}
fixed4 frag(v2f i) : SV_TARGET {
	// 计算环境光、切线空间下的法线值、漫反射等等
	...

	// 获取该顶点遮罩值
	fixed specularMask = tex2D(_SpecularMask,i.uv).r * _SpecularScale;	

	// 高光反射最后乘多一个遮罩值,控制光照细节,值越小越黑越不受影响
	fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(tangentNormal,halfDir)),_Gloss) * specularMask;  

	return fixed4(ambient + diffuse + specular,1.0);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值