概念

1.通过改变法线的方向,间接的影响光照

2.法线贴图是将法线的方向转换成color储存在贴图的每个像素里

3.法线的方向每个分量的值是-1-1,贴图的color值是0-1向量换算成color每个分量  (normal+1)/2,color换算成法线就 (pixel*2-1)

法线贴图储存法线的空间

既然法线贴图像素储存的是法线,那处于那个坐标空间呢

贴图里储存那个空间的法线都是可以的,为什么都是储存的是切线空间下的坐标呢

如果储存模型空间,发生了改变,那么法线信息就会错误,切线空间下就不同

储存在世界和模型空间的耦合性

想象一下如果贴图里存储的是世界空间下的法线,模型发生旋转,顶点的位置发生改变,顶点和贴图中的n位置绑定,n中储存的法线法向不变,就会出现错误,模型空间同理

代码示例

Shader "Unlit/012"
{Properties{_MainTex("MainTex", 2D) = "white" {}_BumpMap("Normal Map", 2D) = "bump" {}_BumpScale("Bump Scale", float) = 1_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1,256)) = 5}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;float _BumpScale;fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct v2f{float4 vertex : SV_POSITION;fixed3 lightDir: TEXCOORD0;float3 viewDir: TEXCOORD1;float2 uv : TEXCOORD2;float2 normalUv : TEXCOORD3;};v2f vert (appdata_tan v){v2f o;//将顶点转到世界空间o.vertex = UnityObjectToClipPos(v.vertex);            o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);   o.normalUv = TRANSFORM_TEX(v.texcoord,_BumpMap);//float3 binormal = cross(v.normal,v.tangent.xyz);//构建模型空间到切线空间矩阵//float3x3 rotation = float3x3(v.tangent.xyz, binormal,v.normal);TANGENT_SPACE_ROTATION;//求切线空间光源方向及视角方向o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;return o;}fixed4 frag (v2f i) : SV_Target{fixed3 tangentLightDir = normalize(i.lightDir);fixed3 tangentviewDir = normalize(i.viewDir);fixed4 packedNormal = tex2D(_BumpMap,i.normalUv);//tangentNormal.xy = (packedNormal.xy * 2 - 1) * _BumpScale;fixed3 tangentNormal = UnpackNormal(packedNormal);tangentNormal.xy *= _BumpScale;tangentNormal.z = sqrt(1 - saturate(dot(tangentNormal.xy,tangentNormal.xy)));//环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 albedo = tex2D(_MainTex,i.uv).rgb;//漫反射fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb * (dot(tangentLightDir,tangentNormal)*0.5+0.5);//高光反射fixed3 halfDir = normalize(tangentLightDir + tangentviewDir);fixed3 color = ambient + diffuse ;return fixed4(color,1);}ENDCG}}
}

代码思路

漫反射的强度是根据光线方向,和法线夹角的cos计算的

从贴图解析法线方向,将从unityshder获取模型空间光线方向,将其转到切线空间。

通过获取的切线和光线方向计算每个片元color的强度

函数介绍

TANGENT_SPACE_ROTATION;

这个指令会构建一个从模型空间到切线空间的旋转矩阵,矩阵的name为rotation,和

float3 binormal = cross(v.normal,v.tangent.xyz);
float3x3 rotation = float3x3(v.tangent.xyz, binormal,v.normal);

是相同的 。

数学概念

sqrt(1 - dot(tangentNormal.xy,tangentNormal.xy));

解析的法线一定是一个单位向量任意一个直角三角形的a方+b方=c方

c表示向量的模,1-a方=b方  b方的sqrt就=b的length

旋转矩阵

Ap=换算后的切线向量

Oc=模型空间到切线空间的偏移值

矩阵里的Xc,Yc,Zc表示模型空间X轴Y轴Z轴的单位向量

我这里讲的要是不太清除,可以去看看过渡矩阵和空间变换

UnpackNormal(packedNormal);

表示的是将像素的颜色值转成法线的方向

UnityShder法线贴图相关推荐

  1. 9、计算机图形学——纹理的应用(环境贴图、凸凹贴图、法线贴图以及位移贴图)

    一.环境贴图 比如下面的这张图,左边的是一张表示环境光的纹理,这个纹理表示屋子内部四面八方都是啥样,右边是一个茶壶, 将纹理映射到这个茶壶上,就能茶壶上渲染出周围的环境 还有这样的球形环境贴图(sph ...

  2. OpenGL生成的法线贴图并增加光照

    这一篇将由OpenGL生成法线贴图的基础上再增加光照效果. 思路如下: 准备一张墙壁图片A. 通过A自动生成法线贴图. 设计一个平行光,指定平行光的光照颜色和光照方向. 使用漫反射光照公式,法线贴图和 ...

  3. OpenGL通过原图自动生成法线贴图

    这种生成法线贴图的效果并不是很好,最新的思路是使用基于cGANs的方法来生成法线贴图. glsl比较简单的算法,思想有点类似于人工智能中的梯度下降,步骤为: 将像素看作向量,计算出模长,代表为像素的高 ...

  4. OpenGL shader normals法线贴图的实例

    OpenGL shader normals法线贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #in ...

  5. 中法线如何反转_凹凸贴图、法线贴图、置换贴图傻傻分不清?

    太长不看全文版: 凹凸贴图:适用于凹凸起伏小的材质,不影响模型外观. 法线贴图:适用于有起伏,但起伏不是很大的材质,用于表现如面部细节.小衣服纹理等细节,可以高效节约资源,不影响模型外观. 置换贴图: ...

  6. ps法线贴图插件_法线与置换贴图原理讲解以及烘焙制作!

    ​首先在讲解之前先给大家讲解下什么是法线贴图,法线贴图其实就是一张带有颜色的凹凸贴图,分别是有红绿蓝,三种颜色构造而成的,如下图所示: 每一个颜色通道分别控制了每个像素的方向,当你把法线贴图用到低解析 ...

  7. 法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

  8. shader 获取法线_Unity Shader 入门到改行5——法线贴图

    the best of blur 1. 法线贴图理论 1.1 什么是法线贴图 一般的贴图中存储的是表面颜色值(RGBA),而法线贴图存放的则是法线信息(xyzw),假设某顶点处的 uv 坐标为 (u, ...

  9. Esfog_UnityShader教程_NormalMap法线贴图

    咳咳,好久没有更新了,一来是这段时间很忙很忙,再来就是自己有些懒了,这个要不得啊,赶紧补上.在前面我们已经介绍过了漫反射和镜面反射,这两个是基本的光照类型,仅仅依靠它们就想制作出精美的效果是远远不够的 ...

  10. (转)法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

最新文章

  1. python模块--如何相互调用自己写的模块
  2. 2018java二级考试大纲_2018年全国计算机二级java考试简答题练习二
  3. ICPC / CCPC / Codeforces / AtCoder 单词本
  4. AngularJs应用页面切换优化方案
  5. Java中divide用法_java的BIgInteger类中divideAndRemainder方法怎么用?
  6. C# 8: 可变结构体中的只读实例成员
  7. [css] 如何将元素的所有css属性恢复为初始化状态?
  8. “约见”面试官系列之常见面试题第二篇说说rem(建议收藏)
  9. Redis通讯协议RESP详解
  10. easyui自定义图标
  11. 2021 年系统分析师下午真题及答案
  12. 京东零售2021年度表彰大会
  13. 转:如何理解阿里月饼事件中各方的表现
  14. 三极管实现的锁存电路
  15. 用PS绘出真实火焰效果
  16. 商业银行合规管理用OA:“上报、评估、整改、分析”全面数字化
  17. 新底座、新产品、新方案,2022用友BIP技术大会三大数智化突破
  18. S3C2440之裸机之C语言按键点亮LED灯
  19. 灵山卫大集逢一逢六开集。也就是阴历的日期,如果末尾是1或6,例如,阴历二月十六,就是赶灵山卫大集的日子。下面,请根据输入的阴历日期,判断这一天是否赶集吧。
  20. 《张维迎:反思经济学》读后感作文4300字

热门文章

  1. 【Gitlab】 remote: Ask a project Owner or Maintainer to create a default branch:
  2. linux之limit.conf
  3. 用户、角色、权限数据库设计
  4. iapp禁止抓包软件代码
  5. 求丑数(判断一个整数是否是丑数)
  6. Angular sort descending
  7. (转帖)-对乒乓球的思考
  8. 16年“折腾史” | 盘点联想手机成与败
  9. 上海市住房公积金销户提取的步骤
  10. SAP MM 供应工厂1050和凭证类型ZIC没有定义供货类型