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. Linux查看用户登陆历史记录

    last 命令: 功能说明:列出目前与过去登入系统的用户相关信息. 语 法:last [-adRx][-f ][-n ][帐号名称-][终端机编号-] 补充说明:单独执行last指令,它会读取位于/v ...

  2. Entity Framework 复杂类型

      为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string Compan ...

  3. Spark(3) - External Data Source

    Introduction Spark provides a unified runtime for big data. HDFS, which is Hadoop's filesystem, is t ...

  4. Linux查看程序端口占用情况【转】

    今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...

  5. java之socket

    socket系java中网络编程的内容. 1客户端: package com.wtd.socket; import java.io.BufferedReader; import java.io.IOE ...

  6. Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示

    package com.lixu.clearedittext; import android.app.Activity; import android.os.Bundle; import androi ...

  7. SQL语句的用法

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  8. [Js]JavaScript闭包和范围的快速测试

    1. if (!("a" in window)) { var a = 1; } alert(a); [分析]代码含义:如果window不包含属性a,就声明一个变量a并赋值为1 ①J ...

  9. js基础之动画(二)

    一.多物体同时运动 栗子一:多个Div,鼠标移入变高,动态下拉菜单 function startMove(obj,iTarget){  clearInterval(obj.timer); obj.ti ...

  10. EntityFramework之创建数据库及基本操作(一)

    那时学EF的时候还没有Code First,只有DB First,生成的是一个EDMX文件,Code First则没有这文件,下面直接上代码吧 数据库创建以及建表 1.首先我们新建一个新项目,使用Nu ...