Unity Shader-法线贴图(Normal Map)与视差贴图(Parallax Map)

简介


法线贴图技术至今一直是游戏增强画面效果的利器之一。随着移动设备的性能越来越好,曾经的在PC平台的各种高级技术在移动平台也都开始大规模使用了,法线贴图甚至是视差贴图已经开始在移动平台的游戏上使用了。 之前的一篇文章简单探究了一下法线贴图的原理以及在Unity下的实现,本篇就不多介绍了。本篇文章主要研究一下怎样增强法线贴图的效果,法线贴图的进阶版-视差贴图(Parallax Map)。

可调法线强度的shader


我们常用的法线效果,一般是用于增强一些细节,有时候我们想要的法线,实际用起来就会发现法线效果不强,尤其是较远的物体,比如地形,墙壁之类的场景物体,虽然加上了法线,但是由于镜头离得比较远,法线效果表现不出来。而这个时候我们一种方式是去找美术调整法线贴图,但是一方面调整贴图会比较花费美术的时间,一方面万一这张图用了多次,有的地方想要比较明显的法线效果,有的地方想要不明显的法线效果,这就比较蛋疼了。如果我们用灰度图转法线图的时候(Create from GrayScale),有个Bumpiness的选项,可以控制这张图的法线强度。但是很多时候,我们的法线图是美术直接在工具里面做好的,就没法转化了。如果我们能给一个参数,直接在材质里面调整法线的强度就好了。之前纠结了好几个小时,后来突然查到了 这个帖子,豁然开朗。
首先,我们从法线贴图中获取到的是这个采样点对应的法线方向,光滑的部分法线方向都为垂直于表面竖直向上的方向,也就是(0,0,1)的方向,而有凹凸的地方,法线就会有偏移值,换句话说,我们让法线贴图采样出来的方向越偏离(0,0,1)方向,就会越加强法线的效果。我们可以减小法线贴图的b值,但b通道越小,法线效果越强,不过这样不直观,换一种方式就是加强法线贴图的r,g值,给r,g通道乘以一个factor,换句话说可以直接乘以一个(factor,factor,1)向量,就达到了增强与减弱法线效果的目的。
下面附上可以直接调整法线强度的shader代码:
//Bump Map
//by:puppet_master
//2017.2.27
Shader "ApcShader/NormalMapX"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_MainTex("Base 2D", 2D) = "white"{}
		_BumpMap("Bump Map", 2D) = "bump"{}
		_BumpFactor ("Bump Scale", Range(0, 10.0)) = 1.0
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			sampler2D _BumpMap;
			float _BumpFactor;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				//转化纹理坐标
				float2 uv : TEXCOORD0;
				//tangent空间的光线方向
				float3 lightDir : TEXCOORD1;
			};

			//定义顶点shader
			v2f vert(appdata_tan v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面有个;
				TANGENT_SPACE_ROTATION;
				//ObjectSpaceLightDir可以把光线方向转化到模
  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值