Unity3D教程宝典之Shader篇:第二十一讲视差贴图

转载自风宇冲Unity3D教程学院

视差贴图的展示

图一:注意轮胎印中的自阴影,实际上路面只是一个平地

图二:孤岛危机的成功,视差贴图功不可没

图三:视差贴图同样可用于人物,装备及道具

本讲分四个部分
一:优点特性

二:基本原理

三:使用方法

四:视差计算

第一部分 视差贴图的优点及特性

上一讲讲了法线贴图。法线贴图,无论是RGB法线贴图还是DXT5nm,都有一个缺点就是。越接近面的水平视角,则画面越不真实。因为使用法线贴图后,凸起的部分只是看起来凸起而已,网格模型却并没有凸起依然是平的。正常来说凸起的部分会遮挡后面的部分,法线贴图却没有这个效果。于是我们有了法线贴图的改进版 - 视差贴图

视差贴图的好处:

(1)在相对视角会发生变化时,很有立体感

(2)在入视角接近水平时,依然有不错的质量

下面两图对比可以看出,在入视角接近水平时,视差贴图要比法线贴图清晰不少。

注意:在入视角等于或接近垂直时,视差贴图与法线贴图的效果是几乎一样的。

第二部分 视差贴图的原理

视差贴图,由Tomomichi Kaneko在2001年发明,但是限于计算机的性能,真正的商业运用是从2007年开始的。视差贴图通过uv偏移实现。uv的偏移值由高度及由点指向摄像机的向量计算得出。所以视差贴图依然不改变真正的模型表面构造。

注意:如果使用的是Unity自带的Parallax 类shader,则高度必须位于A通道中(对应color.w),如果高度图是灰度图的话,则需转换至A通道,下面的使用部分有详细方法。有关高度的知识,参阅17讲的前半部分。

左图:凹凸不平的鹅卵石         右图:实际只是一个平面

第三部分 视差贴图的使用

(1)准备好贴图,法线贴图,高度图。

(2)如果高度图的高度储存在透明通道,略过此步。如果是灰度图则需:选中图,勾选Alpha from Grayscale,然后Apply即可

(3)创建plane及材质,Shader选Parallax Diffuse或者Parallax Diffuse

(4)把三个图拖到材质对应的栏里

(5)调整Height高度。

如果是初次使用视差贴图的话,把Height调到最高,然后旋转plane查看,这样能快速理解视差贴图的好处。

如果是真正运用的话,Height稍微低些,否则会失真。

第四部分 视差贴图的计算

打开Build-in shader里的 Normal-Parallax.Shader,即Parallax Diffuse。有如下代码:

  1. half h = tex2D (_ParallaxMap, IN.uv_BumpMap).w;
  2. float2 offset = ParallaxOffset (h, _Parallax, IN.viewDir);
  3. IN.uv_MainTex += offset;
  4. IN.uv_BumpMap += offset;

(1)纹理映射 取得 高度值h

(2) 由高度值h及指向摄像机的向量计算偏移offset

(3) 对纹理贴图以及法线贴图进行uv偏移offset

其中第二步是重点。打开UnityCG.cginc , 看到如下代码。

  1. // Calculates UV offset for parallax bump mapping
  2. inline float2 ParallaxOffset( half h, half height, half3 viewDir )
  3. {
  4. h = h * height - height/2.0;
  5. float3 v = normalize(viewDir);
  6. //单位指向相机向量.z +0.42
  7. v.z += 0.42;
  8. // 偏移.x = 高度*(单位指向相机向量的x / 单位指向相机向量的z)
  9. // 偏移.y = 高度*(单位指向相机向量的y / 单位指向相机向量的z)
  10. return h * (v.xy / v.z);
  11. }

计算方法出来了。具体算法的理论依据感兴趣的同学可以自己去研究。

部分内容出自:

【技术贴】最强贴图——视差贴图技术

时间: 2024-10-31 11:24:49

Unity3D教程宝典之Shader篇:第二十一讲视差贴图的相关文章

Unity3D教程宝典之Shader篇:第一讲Shader总篇

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言,在Unity3d里,所有的图形绘制都必须通过Shader,即着色器.一般的使用过程中,我们用到的都是unity自带的Shader,即build-in shader.学习Shader后,自己写的Shader能做出很多你想要的特殊效果,增强游戏的画面表现.例如 水的倒影. LOGO的光影闪过等等效果等等. Shader的分类 Shader按管线分类一般分为固定渲染管线与可编程渲染管线 1)固定渲染管线 ——这是标准的几何&光照(Tra

Unity3D教程宝典之Shader篇:第九讲Render Path

转载自风宇冲Unity3D教程学院 Render Path定义Render Path,就是采取的光照流程. Render Path设置可以在Edit-> Project Settings->Player 里设定,见下图.也可以直接在摄像机的Inspector面板里设置. Render Path详细讲解                                    一:Vertex LitVertex Lit即顶点光照,顾名思义, 就是所有的光照计算都是在顶点进行的,因此所有的像素运算效

Unity3D教程宝典之Shader篇:基础讲 基础知识

转载自风宇冲Unity3D教程学院 以下内容不需要入门的时候立刻阅读和理解,建议逐渐深入学习后,不时回来看看即可. 什么是GPU? GPU:Graphic Processing Unit,中文翻译为“图形处理器”.显卡包括(GPU,显存,显卡BIOS,显卡PCB板). 什么是Shader? Shader程序:GPU执行的,针对3D对象进行操作的程序. Shader有哪几种? CG:与DirectX 9.0以上以及OpenGL 完全兼容.运行时或事先编译成GPU汇编代码. HLSL: 主要用于Di

Unity3D教程宝典之Shader篇:特别讲 CG函数

转载自风宇冲Unity3D教程学院 特别讲:CG函数 本讲不需立刻看完,遇到相关函数时来查阅即可.(本文截图来源:Cg教程_可编程实时图形权威指南) E.1  数学函数 E.2 几何函数 E.3 纹理贴图函数 E.4 导数函数 E.5 调试函数 E.1  数学函数 E.2 几何函数 E.3 纹理贴图函数 E.4 导数函数 E.5 调试函数

Unity3D教程宝典之Shader篇:特别讲 常见问题解答

转载自风宇冲Unity3D教程学院 本讲会陆续补充一些问题的解答. 问: (1) TRANSFORM_TEX是做什么的 (2)float4 _MainTex_ST 中的_MainTex_ST变量也没有用到,为啥非要声明一下? 答: (1)简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的. (v.texcoord就是顶点的uv) 下面这两个函数是等价的. o.uv =   TRANSFORM_TEX(v.

Unity3D教程宝典之Shader篇

教程目录 基础讲:Shader学习方法基础讲:基础知识特别讲:常见问题解答特别讲:CG函数 第一讲: Shader总篇第二讲: Fixed Function Shader 第三讲: Vertex&Fragment Shader基础 第四讲: 制作一个美丽的地球第五讲:LOGO闪光效果 第六讲:TexGen第七讲:流程图第八讲:Why CG?第九讲:Render Path第十讲:雾化第十一讲:阴影面剔除及深度测试第十二讲:alpha测试第十三讲:alpha混合第十四讲:Surface Shader

Unity3D教程宝典之Shader篇:第二讲Fixed Function Shader

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似. 例一:显示单一颜色下面我们来看第一个例子,显示单一颜色,注释写得挺详细了,照着格式写即可. //根Shader Shader "Custom/1_1color" { // 属性 Propertie

Unity3D教程宝典之Shader篇:第十一讲剔除及深度测试

转载自风宇冲Unity3D教程学院 Culling阴影面剔除 Culling阴影面剔除是一种优化技术.所有的多边形都有正反两面,而你永远只能看见其中一面,不信的话拿张纸板或者一面镜子看看你能不能同时看到两面.通常多边形面向屏幕里面的背面,我们看不见,所以会将该面剔除. Cull Off 关闭阴影面剔除 Cull Back 剔除背面 Cull Front 剔除正面 Depth Testing深度测试 Depth Testing:深度测试,也叫深度缓冲.只有最靠近观察者的物体会被绘制.深度即Z,该值

Unity3D教程宝典之Shader篇:第二十讲法线贴图

转载自风宇冲Unity3D教程学院 上一讲我们讲了凹凸贴图以及生成法线贴图. 这一讲来谈谈怎么使用法线贴图. 一:法线贴图的原理 二:法线贴图的实现 三:法线贴图的使用 四:法线贴图的格式 一:法线贴图的原理 光照效果很大程度上是由垂直于物体表面的法线决定的,因为法线影响反射光的方向.均匀垂直的法线是镜面贴图.但是有时候我们会给一个平面使用砖墙贴图,砖墙应该是凹凸不平的,而如果让砖墙使用该平面的法线的话,画面就会很假,神马?一面墙像镜子一样反光=.= 而如果按真实砖墙去做模型的话,即做高精度模型