1、_TexelSize:纹理以这个为后缀, 后2个则是像素的数量如256x128。那么后2个就是256和128。而前两个值为x = 1/256, y = 1 / 128

2、有限差分近似

image.png

根据这个图来理解编写,利用两点之间切线表示其深度

void InitializeFragmentNormal(inout Interpolator i){float2 delta = float2(_HeightMap_TexelSize.x, 0); //如何贴图为256x128的 那么delta = 1 / 256float h1 = tex2D(_HeightMap, i.uv); //普通采样float h2 = tex2D(_HeightMap, i.uv + delta); //向后挪一个像素采样// y结合上图, 会发现是斜率//i.normal = float3(1, (h2-h1)/delta.x, 0); 或者 i.normal = float3(delta.x, h2-h1, 0);i.normal = normalize(i.normal);
}

注意此时得到是切线, 并不是真正的法线, 而是切线,也就是图中红色的部分
真正的法线绕旋z轴90度i.normal = float3(h1-h2, 1, 0);
这个旋转怎么理解?
得到的这个切线由于delta很小可以理解为(0, h2-h1, 0),然后右乘z轴旋转的旋转矩阵,其中旋转角度为90度。最终得到(h1-h2, 0, 0),而y轴变成了1,是为了让没有那么明显的差异感,进行了缩放。

3、中心差法:教程中提到了中心差法:
其实就是不在原来的顶点处直接取值为h1,而是向后偏移原来的一般。但是x的总距离是没有变化的

//中心差法float2 delta = float2(_HeightMap_TexelSize.x * 0.5, 0);float h1 = tex2D(_HeightMap, i.uv - delta);float h2 = tex2D(_HeightMap, i.uv + delta);i.normal = float3(h1 - h2, 1, 0);

效果是更好与高度场对齐, 并不会改变形状注意:此时是x轴向维度的, 并没有y轴维度的

4、添加uv中的v的维度,此时平面时yz面

//另一个维度float2 deltaV = float2(0, _HeightMap_TexelSize.y * 0.5);float v1 = tex2D(_HeightMap, i.uv - deltaV);float v2 = tex2D(_HeightMap, i.uv + deltaV);//切线为 float3(0, v2-v1, deltaV) =>(缩放) float3(0, v2-v1, 1)//绕x轴转-90度, 这里右乘的是x轴旋转矩阵float3(0, 1, v1-v2)i.normal = float3(0, 1, v1-v2);

5、通过UV2个维度的切线构造生产法向量

float3 tu = float3(1, h2-h1, 0); //u切线float3 tv = float3(0, v2-v1, 1); //v 方向的切线//通过叉乘 可以确定垂直于这2条切线的向量 从而成为法向量i.normal = cross(tv, tu);

注意:tv和tu两个不能互换, 因为叉乘有2个方向

6、法线贴图
假如有多个纹理图,我们需要进行差分近似采样就需要进行多次,这样很浪费。所以我们将纹理图设置为Normal Map,并勾选Create From Grayscale应用。将得到法线贴图(法线贴图为什么是便蓝色的?因为其将向上的向量存储在z变量,对应RGB中的Blue颜色)

7、使用法线贴图

//非DXT5 移动端i.normal = tex2D(_NormalMap, i.uv).xyz * 2 - 1;  //将其归一至 -1 ~ 1i.normal = i.normal.xzy; //zy交换
//支持DXT5i.normal.xy = tex2D(_NormalMap, i.uv).wy * 2 - 1;  //DXT5只用2个通道存储,x存储在a通道, y存储在y//根据上图,法线是单位向量,所有距离是1,可以通过xy计算出zi.normal.z = sqrt(1 - saturate(dot(i.normal.xy, i.normal.xy)));i.normal = i.normal.xzy;

8、缩放凹凸 向上的向量存储在z方向向量中,所以我们可以缩放xy从而达到缩放z的效果

// _BumpScale = 0时平面将会变得平坦, 越大将会越凹凸i.normal.xy = tex2D(_NormalMap, i.uv).wy * 2 - 1;  //将其归一至 -1 ~ 1i.normal.xy = _BumpScale * i.normal.xy;

其中Unity自带函数

//使用unity自带的函数 进行法线纹理的解码和缩放i.normal = UnpackScaleNormal(tex2D(_NormalMap, i.uv), _BumpScale);i.normal = i.normal.xzy;

9、细节法线

同样细节法线和普通法线纹理差不多,只是利用细节uv进行采样而已//细节法线贴图i.normal = UnpackScaleNormal(tex2D(_DetailNormalMap, i.uv.zw), _DetailBumpScale);

10、融合法线:BlendNormals可以将2个法线混合,并且使用的是泛白混合(原理用得到了再看原理)

//细节法线贴图float3 detailNormal = UnpackScaleNormal(tex2D(_DetailNormalMap, i.uv.zw), _DetailBumpScale);i.normal = BlendNormals(mainNormal, detailNormal);i.normal = i.normal.xzy;// i.normal = normalize(i.normal);

此处连接切线空间文章

UnityShader凹凸感相关推荐

  1. 用CSS实现图片的3D凹凸感(即:凸出镜框外或凹陷镜框里)

    Ⅰ.问题描述: 使用css实现图片的3D凹凸感: Ⅱ实现过程如下: 1.展示结果为: A.正常的图片(图一.图二都正常): B.图一凸出镜框外,图二正常: 触发过程:将鼠标放在图一的红色边框内,就会显 ...

  2. html凹凸效果,用CSS实现图片的3D凹凸感(凸出镜框外或凹陷镜框里)

    Ⅰ.问题描述: 使用css实现图片的3D凹凸感: Ⅱ实现过程如下: 1.展示结果为: A.正常的图片(图一.图二都正常): B.图一凸出镜框外,图二正常: 触发过程:将鼠标放在图一的红色边框内,就会显 ...

  3. Unity2D实现贴图凹凸感并接受实时光照效果

    先看终于效果: 我们的原图是一个3D模型的截图: 这一效果是通过Shader实现的: (Shader代码来自国外博客:http://www.thomas-joncorpuz.com/blog/2014 ...

  4. 置换贴图,法线贴图,凹凸贴图的区别

    先自我介绍--你要是说这是自我炒作我也认了.首先说明,FXCarl是一个对3D美术一窍不同的家伙.虽然很想往技术美工方向发展了.因为是学程序出身,眼下能做的也就是写写Shaders.等到手上的项目做完 ...

  5. 学习笔记28(凹凸贴图,法线贴图,位移贴图)

    为突出物体表面细节的三个贴图:bump/Normal 和 displacement 对于前俩其实本质上是差不多的,一个是存储高度差信息,一个是存储法线信息,就算是高度差,也是经过计算得到高度变化后的法 ...

  6. openGL之API学习(五十五)凹凸贴图技术

    法线贴图是目前游戏开发中最常见的贴图之一.我们知道,一般情况下,模型面数越高,可以表现的细节越多,效果也越好.但是,由于面数多了,顶点数多了,计算量也就上去了,效果永远是和性能成反比的.怎么样用尽可能 ...

  7. 凹凸贴图、法线贴图、置换贴图

    先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前游戏和在XBOX360和Pl ...

  8. 贴图平移凹凸贴图偏移

      1. 平移(UV坐标动画) UV 坐标动画或 UV 平移的含义是,水平 (U) 和/或垂直 (V) 移动纹理的 UV 坐标,以产生复杂动画的错觉. 在以下示例中,火焰纹理沿着 U(水平)方向平移, ...

  9. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别

    我们现在的银幕早就充斥着电脑生成的虚拟物体,这些虚拟物体是电脑中生成的物体,但这些物体比较现实中的物体没有那么多细致的表面.因而需要用平面映射的方式加入更多的细节.这些用做映射的图片被称作贴图.贴图有 ...

最新文章

  1. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
  2. localdatetime获得时间搓_得用户者得天下,一禅小和尚×往事若茶如何获得消费者认同...
  3. OS X 10.11 Error: /usr/local must be writable! (Sierra 10.12 ) Error: /usr/local must be writable!
  4. C#通过接口与线程通信(捕获线程状态)介绍
  5. linux mysql关闭启动不了了,linux启动或关闭mysql失败的解决办法
  6. mesh 协调器 路由器_关于Mesh网络中,协调器和路由器之间的几个问题?
  7. zibll子比主题v5.4免授权修复版
  8. 渗透测试为什么要重基础、重实践?
  9. java demo类_《java语言程序设计》初步学习——各种小Demo
  10. 淘宝全屏轮播代码怎么做?淘宝轮播天猫全屏轮播代码
  11. 生态环境影响评价技术应用及典型实践案例分析
  12. android思维导图软件推荐,免费好用还跨平台!这5款主流思维导图软件,每一个都让人怒赞...
  13. 南天PR2 PR2E PR9 中航 PR-b PR-V PR-C PR-t PR-u PR-d GWI PR2 plus 打印机驱动安装视频教程
  14. Oracle获取日期大全(当月的第一天/后一天/上一天/最后一天/上个月这一天)
  15. flutter常用库整理
  16. 单线程-多线程-高并发
  17. 轻轻松松实现本地和云主机之间的文件上传下载
  18. 基于tensorflow、CNN网络识别花卉的种类(图像识别)
  19. 堆垛实训报告总结_叉车实训总结
  20. python运维工程师前景及待遇_做运维工程师有前途吗?

热门文章

  1. It doesn't matter 应该怎么翻?
  2. SCIChart如何绘制虚线
  3. Unity创建超写实三维场景的一般步骤
  4. Adam与AdamW
  5. 工厂人员定位系统如何实现工厂数字化转型
  6. 如何通过linux下载github代码
  7. input框 既可以手动输入亦可以进行下拉模糊查找
  8. MC9S12XEP100 ADC模块使用总结
  9. 国内比较经典的图库资源网站
  10. 4k影视文件存储服务器方案,存储系统4K网络存阵列服务器储