Unity3D ShaderLab法线贴图

说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图。将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果,

同时也保持较低的多边形数。法线贴图通常存储在一个普通的rgb图片,他的rgb分量分别对应了曲面法线的xyz坐标。

在Unity中,会通过UnpackNormals()函数来使用法线贴图,这使得在表面着色范围内为我们的着色器添加使用法线的过程变得更容易。

首先,创建一个shader和材质球。我们开始修改shader代码。

1,Properties中添加法线贴图

Properties {

_MainTint("Main Color",Color)=(,,,)

_NormalTex ("Normal Map", 2D) = "bump" {}

_NormalIntensity("Normal Intensity",Range(,))=0.2

}

2,SubShader添加变量,修改Input结构体

float4 _MainTint;

sampler2D _NormalTex;

float _NormalIntensity;

struct Input {

float2 uv_NormalTex;

};

3,修改surf函数

void surf (Input IN, inout SurfaceOutput o) {

//提取法线信息;

float3 normalMap = UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));

normalMap = float3(normalMap.x * _NormalIntensity, normalMap.y * _NormalIntensity, normalMap.z);

o.Normal = normalMap.rgb;

o.Albedo = _MainTint.rgb;

o.Alpha = _MainTint.a;

}

修改完毕,返回Unity中,添加贴图,设置Tiling值为10,效果如下:

我们可以看到调整NormalIntensity可以明显改善法线贴图的法线强度。

在上面我们用到了 UnpackNormals()函数,它是位于UnityCG.cginc文件中定义好的函数。

通过它我们进行了贴图的法线运算处理,我们就可以利用返回值在光照函数中进行使用了。

code start----------------------------------------------------------

Shader "91YGame/Normal" {
Properties {
_MainTint("Main Color",Color)=(,,,)
_NormalTex ("Normal Map", 2D) = "bump" {}
_NormalIntensity("Normal Intensity",Range(,))=0.2
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf Lambert float4 _MainTint;
sampler2D _NormalTex;
float _NormalIntensity;
struct Input {
float2 uv_NormalTex;
}; void surf (Input IN, inout SurfaceOutput o) {
//提取法线;
float3 normalMap = UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));
normalMap = float3(normalMap.x * _NormalIntensity, normalMap.y * _NormalIntensity, normalMap.z);
o.Normal = normalMap.rgb;
o.Albedo = _MainTint.rgb;
o.Alpha = _MainTint.a;
}
ENDCG
}
FallBack "Diffuse"
}

code  end----------------------------------------------------------

Unity3D ShaderLab法线贴图的更多相关文章

  1. Unity3D ShaderLab 静态贴图光照模型

    Unity3D ShaderLab 静态贴图光照模型 其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果. 下面是在unity中关闭灯光和打开灯光的对比效果. ...

  2. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  3. Unity3D ShaderLab立方体图的法线渲染

    Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ...

  4. Unity3D ShaderLab 立方体图的菲涅尔反射

    Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...

  5. Unity3D ShaderLab 立方体图的反射遮罩

    Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张纹理对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的sha ...

  6. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  7. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  8. (转)Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)

    原帖网址http://www.u3dpro.com/read.php?tid=207  感谢jdk900网友的辛苦编写 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图 ...

  9. Unity3d《Shader篇》法线贴图

    效果图 贴图 法线贴图 //代码 Shader "Custom/NormalMap" { Properties { _MainTex ("Texture", 2 ...

随机推荐

  1. struts2配置通用action一个顶N个,你还在写一大堆action吗?

    <!-- 通用action!!!约定优于配置 --> <action name="*_*" class="cn.cnsdhzzl.action.{1}A ...

  2. 三级菜单---zhufeng

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  3. js——常见的小方法

    1.随机得到是六位数,可以当做“密码”来使用: Math.random().toString().substr(2, 6):

  4. 在Oracle中使用rank()over()排名的问题

    排序: ---rank()over(order by 列名 排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4 select scoreid, st ...

  5. 抓包工具tshark使用备忘

         抓包命令行工具tshark可以用于自定制,相比GUI工具可以实现一些自动化,譬如把某些关注的数据抓起下来存放到文本中,然后再分析输出.      demo: std::string deco ...

  6. [apache]用shell分析网站的访问情况

    随着网站正式运行,我们可以通过通用的免费日志分析工具比如awstats获得一些实际访问网站的信息,例如每天ip量,pv量,用户所用的的浏览器,用户所用的操作系统等,但是有时候希望通过手工方式从WEB日 ...

  7. Java DES 加解密文件

    import com.mchange.v2.io.DirectoryDescentUtils; import javax.crypto.Cipher;import javax.crypto.Ciphe ...

  8. HDU 5773 The All-purpose Zero 求LIS

    求最长上升子序列长度: 单纯的dp时间复杂度是O(n*n)的 dp[i] = max(dp[j]+1); (0=<j<=i-1 && a[i]>a[j]) 用二分可以 ...

  9. 判断一个字符串是否为有效ip地址

    bool f (const char *s) { int s1,s2,s3,s4; ) { return false; } if ((s1 & 0xffffff00) || (s2 & ...

  10. 警卫安排(dp好题)

    警卫安排(guard)[题目描述]一个重要的基地被分为 n 个连通的区域.出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布.在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望 ...