切线空间,即使用顶点的切线作为x轴,法线作为z轴,法线与切线的叉积作为y轴。

使用切线空间存储法线,使得法线纹理可以复用,很好。

在切线空间中计算光照,比在世界空间中计算光照少了很多计算量。在切线空间中计算,需要在顶点中将光线和视角方向转换到切线空间中,而在世界空间中计算时需要在每个片段中将法线从切线空间转换到界面空间。

shader如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Normal map tangent space"
{
Properties
{
_MainTex("Main texture", 2D) = "white"
_NormalMap("Normal map", 2D) = "bump"
_Gloss("Gloss", float) =
} SubShader
{
Pass
{
Tags
{
"LightMode" = "ForwardBase"
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "Lighting.cginc" struct v2f
{
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
float3 tangentLightDir : TEXCOORD1;
float3 tangentViewDir : TEXCOORD2;
}; v2f vert(appdata_tan v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord; TANGENT_SPACE_ROTATION; float3 objLightDir = ObjSpaceLightDir(v.vertex);
o.tangentLightDir = normalize(mul(rotation, objLightDir)); float3 objViewDir = ObjSpaceViewDir(v.vertex);
o.tangentViewDir = normalize(mul(rotation, objViewDir)); return o;
} sampler2D _MainTex;
sampler2D _NormalMap;
float _Gloss; float4 frag(v2f i) : SV_TARGET
{
float4 tex = tex2D(_MainTex, i.uv); float4 normalTex = tex2D(_NormalMap, i.uv);
float3 tangentNormal = UnpackNormal(normalTex); // 切线空间 float3 diff = tex.rgb * _LightColor0.rgb * (dot(tangentNormal, i.tangentLightDir) * 0.5 + 0.5); float3 halfDir = i.tangentViewDir + i.tangentLightDir;
halfDir = normalize(halfDir);
float3 spec = tex.rgb * _LightColor0.rgb * pow(saturate(dot(halfDir, tangentNormal)), _Gloss); float3 col = spec + diff + UNITY_LIGHTMODEL_AMBIENT.rgb; return float4(col, );
} ENDCG
}
}
}

转载请注明出处:http://www.cnblogs.com/jietian331/p/7132277.html

效果如下:

资源如下:

http://files.cnblogs.com/files/jietian331/TangentSpaceNormalMap.rar

Unity shader学习之切线空间下计算凹凸映射的更多相关文章

  1. 【Unity Shader学习笔记】Unity基础纹理-法线贴图

    1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...

  2. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  3. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  4. Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

    一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...

  5. 第四章 开始Unity Shader学习之旅(1)

    1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...

  6. Unity Shader学习笔记-1

    本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...

  7. 【Unity Shader学习笔记】Unity基础纹理-单张纹理

    1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...

  8. 第四章 开始Unity Shader学习之旅(2)

    目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...

  9. 【Unity Shader学习笔记】Unity光照基础-漫反射光照

    本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...

随机推荐

  1. Java与面向对象之随感(1)

    大一下学期上完了c++课程,当时自我感觉很良好,认为对面向对象编程已经是身经百战了,但是上了院里HuangYu老师的Java课之后,才发现自己对于面向对象的编程风格的理解只在皮毛,着实惭愧不已. 假设 ...

  2. [development][endian] 字节序

    首先字节序很不好理解, 其次,理解了又不好记住. 除了字节序, 还有位序. 那么到底怎么记住呢? 大端序,小端序还有另一个名字, 大尾序,小尾序. 这样就记住了, 我们以16进制打印一个数之后, 尾部 ...

  3. linux学习:【第2篇】常用命令

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! linux学习:[第2篇]常用命令 基本命令 //打开终端: CentOS:在任何地方,右键-- ...

  4. python fabric实现远程操作和部署示例

    https://www.jb51.net/article/48434.htm 近期接手越来越多的东西,发布和运维的工作相当机械,加上频率还蛮高,导致时间浪费还是优点多.修复bug什么的,测试,提交版本 ...

  5. LeetCode 500 Keyboard Row 解题报告

    题目要求 Given a List of words, return the words that can be typed using letters of alphabet on only one ...

  6. java JDBC (四)

    package cn.sasa.demo4; import java.sql.Connection; import java.sql.PreparedStatement; import java.sq ...

  7. pyqt5-day1

    pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法.这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS.pyqt5是双重许可. ...

  8. Ubuntu14.04 LTS 安装Chrome浏览器(转)

    add zhj: 亲测过,可以,原来不用FQ就可以下载,有点意外 原文:http://www.jianshu.com/p/8220578d0b15 1.打开终端(ctrl + alt + t),下载6 ...

  9. vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题

    引入:https://q.cnblogs.com/q/88214/ 解决方法: 添加路由监听,路由改变时执行监听方法 methods:{ fetchData(){ console.log('路由发送变 ...

  10. 转: js实现全角半角检测的方法

    //全角半角校验 function issbccase(strTmp) { for (var i=0; i<strTmp.length; i++) { if (strTmp.charCodeAt ...