本节中需要用到的上面的素材可以在这里下载,其中包括上面的石块的模型,一张贴图以及对应的法线贴图。geometry shader lod将下载的package导入到工程中,并新建一个material,使用简单的Diffuse的Shader(比如上一节我们实现的),再加上一个合适的平行光光源,就可以得到我们左图的效果。另外,本节以及以后都会涉及到一些Unity内建的Shader的内容,比如一些标准常用函数和常量定义等,相关内容可以在Unity的内建Shader中找到,内建Shader可以在Unity下载页面的版本右侧找到。
接下来我们实现法线贴图。在实现之前,我们先简单地稍微多了解一些法线贴图的基本知识。大多数法线图一般都和下面的图类,是一张以蓝紫色为主的图。geometry shader lod这张法线图其实是一张RGB贴图,其中红,绿,蓝三个通道分别表示由高度图转换而来的该点的法线指向:Nx、Ny、Nz。在其中绝大部分点的法线都指向z方向,因此图更偏向于蓝色。在shader进行处理时,我们将光照与该点的法线进行点积后即可得到在该光线下应有的明暗特性,再将其应用到原图上,即可反应在一定光照环境下物体的凹凸关系了。关于法向贴图的更多信息,可以参考wiki上的相关条目。
一张典型的法线图

回到正题,我们现在考虑的主要是Shader入门,而不是图像学的原理。再上一节我们写的Shader的基础上稍微做一些修改,就可以得到适应并完成法线贴图渲染的新Shader。新加入的部分进行了编号并在之后进行说明。
Shader "Custom/Normal Mapping" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
//1
_Bump ("Bump", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma suce surf Lambert
sampler2D _MainTex;
//2
sampler2D _Bump;
struct Input {
float2 uv_MainTex;
//3
float2 uv_Bump;
};
void surf (Input IN, inout SuceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
//4
o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG

}
FallBack "Diffuse"
}
1.声明并加入一个显示名称为Bump的贴图,用于放置法线图
2.为了能够在CG程序中使用这张贴图,必须加入一个sample,希望你还记得~
4.从法线图中提取法线信息,并将其赋予相应点的输出的Normal属性。UnpackNormal是定义在UnityCG.cginc文件中的方法,这个文件中包含了一系列常用的CG变量以及方法。UnpackNormal接受一个fixed4的输入,并将其转换为所对应的法线(fixed3)。在解包得到这个之后,将其赋给输出的Normal,就可以参与到光线运算中完成接下来的渲染工作了。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-48390-7.html
美舰根本进不了12海里
谁让你那么遭人恨呢