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

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

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


渐变纹理

没有使用纹理,和使用两种不同渐变纹理对比:
Unity Shader 学习笔记(9) 渐变纹理、遮罩纹理_第1张图片

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

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;

	...
}

遮罩纹理

单张纹理,单张+法线纹理,单张+法线+遮罩纹理对比:
Unity Shader 学习笔记(9) 渐变纹理、遮罩纹理_第2张图片

类似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);
}

你可能感兴趣的:(Unity,Shader,图形学,Unity,Shader,学习笔记)