http://www.cnblogs.com/taotaobujue/articles/2781371.html

视差映射贴图(Parallax Mapping)

● 传统纹理贴图的弊端

纹理贴图大家都明白,就是往建好的3D模型上“贴”一些二维的画面,让人物显得更真实一些,比如常见的砖墙、凹凸不平的地面等,这些如果全部用三角形来实现的话,那么模型就会非常复杂,GPU将会不堪重负,但如果用“一张已经画好砖纹的纸”贴上去的话,那么渲染起来就会轻松好多。

但是这么做也有很大的缺点,贴图毕竟是2D的,如果在游戏中换个角度看的话,很容易就会发现墙面没有任何立体感,砖纹看上去非常假!为了让2D贴图看上去也有3D立体效果,就诞生了多种贴图技术,比如凹凸贴图、法线贴图、位移贴图、视察映射贴图等。

● 凹凸贴图

凹凸贴图技术简单说起来是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉,而无需改变物体的几何结构或增加额外的点面。例如,把一张碎石的贴图赋予一个平面,经过处理后这个平面就会变成一片铺满碎石、高低不平的荒原。当然,使用凹凸贴图产生的凹凸效果其光影的方向角度是不会改变的,而且不可能产生物理上的起伏效果。


凹凸贴图的墙壁效果,注意看边缘其实没有任何凹槽

凹凸贴图在今天看来已经是老的不能再老的一种技术了,虽然能够获得凹凸的效果,但是凹凸的程度非常受限制,基本上只能做出一些简单的浮雕效果来。这种技术通常用在一些观察视角变化很小的情况上,例如地面,墙壁,远处的一些模型等等,如果角度稍微一大,你就会发现那些凹坑其实是根本不存在的。

● 法线贴图

法线贴图就是把一个表面的凹凸情况用每个点的法线向量记录下来,在贴图的时候根据法线贴图做光影的变换,从而实现凹凸效果。

法线贴图比起凹凸贴图而言,能够实现的效果更好了,相对的就是运算量更大了,需要大量的纹理材质,每个象素的光照情况都需要计算这个点的法线向量和光照情况的夹角计算该点的亮度和颜色。为了节约GPU资源,ATI曾开发了3DC+纹理压缩技术,这对于法线贴图有莫大的帮助。

当然,法线贴图技术同样不是完美的,它也有着自己的不足,凹凸贴图没有能够解决的切向效果问题肯定是仍然不能够得到解决。此外,就是法线贴图技术不能够解决解决更大的凹凸情况的效果。大家如果去观察的话,法线贴图效果能实现的通常是一些内凹或者外凸不是很严重的表面效果。

● 视差映射贴图

为了解决法线贴图在处理较深内凹之时不能够达到的弊端,诞生了新的视差映射贴图技术。该技术其实称之为视差遮蔽贴图似乎更容易理解一些,因为它会对纹理的坐标做变换,一些凸出的纹理会遮蔽到其他的纹理,这样就会看起来具备更好的凹凸的感觉了。


ATI X1000 Demo中就包含了视察映射技术

正如我们在上图看到的情况一样,地面上的石块的凹凸感觉非常好,前面的石块已经对后面的石块进行了局部的遮蔽。虽然这个Demo中的砖块依然很假,但砖块之间凹凸的效果已经得到了完美体现,非常遗憾的是,没有任何一款DX9游戏使用过这种视差贴图技术。

● 直到DX10时代才大量使用视差映射贴图技术

视差贴图技术的实现原理,其实和法线贴图是一样的,都是根据法线贴图进行的处理,所以我们可以把它当作是法线贴图的一种衍生技术。视差贴图技术的实现是和硬件没有必然联系的,这个技术概念的诞生其实也非常早,只是未能得到大量使用,这是因为视差贴图技术的运算量要比法线贴图大了不少,原来的显示芯片因为性能有限基本都运行不了。


狂野西部DX10版本首次使用了视差映射贴图


《孤岛危机》中的石块和地面都使用了视察映射贴图

最早使用视差映射贴图技术的游戏叫做《狂野西部》,首批DX10游戏之一,DX9版本不支持。由于DX10显卡都采用了统一渲染架构,可以方便的集中利用Shader资源,来渲染出复杂的特效。再加上有全新的几何着色器辅助,因此特效的运用方面可以更加灵活,游戏开发商可以很容易的自定义一些特效渲染方式,所以将先进的技术都安置在DX10模式之中也是无可厚非。

转自:http://hi.baidu.com/moogle85/item/1677af72e0881143ef1e53b6

3D游戏图形技术解析(7)——视差映射贴图(Parallax Mapping)【转】的更多相关文章

  1. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  2. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(2)

    Lighting和Shading(2)镜面反射的控制和模拟次级表面散射技术 http://www.4gamer.net/games/216/G021678/20140703095/index_2.ht ...

  5. [转]显卡帝揭秘3D游戏画质特效

    显卡帝揭秘3D游戏画质特效 近几年来,大量采用最新技术制作的大型3D游戏让大部分玩家都享受到了前所未有的游戏画质体验,同时在显卡硬件方面的技术革新也日新月异.对于经常玩游戏的玩家来说,可能对游戏画质提 ...

  6. Android 3D游戏开发

    OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...

  7. 3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇

    1.概述 上一篇博客,3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇,讲了法线贴图的基本概念和使用方法.而法线贴图和一般的纹理贴图一样,都需要进行压缩,也需要生成mipm ...

  8. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

  9. OpenGL核心之视差映射

    笔者介绍:姜雪伟,IT公司技术合伙人.IT高级讲师,CSDN社区专家,特邀编辑.畅销书作者;已出版书籍:<手把手教你¯的纹理坐标偏移T3来对fragment的纹理坐标进行位移.你能够看到随着深度 ...

随机推荐

  1. windows下github 出现Permission denied (publickey)

    github教科书传送门:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 再学习到 ...

  2. ExecutorService 用例

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Tes ...

  3. LeetCode解题报告—— Group Anagrams & Pow(x, n) & Spiral Matrix

    1. Group Anagrams Given an array of strings, group anagrams together. For example, given: ["eat ...

  4. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  5. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  6. hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  7. Qt笔记——QSqlLite

    静态数据库,简单方便 在.pro文件里添加 +sql #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { ...

  8. 如何设置WordPress文章特色图像(Featured Image)

    WordPress的特色图像(Featured Image)是一个很方便的功能,过去为了给每篇文章设置一个缩略图,我们需要用脚本去匹配文章中的第一张或者最后一张图片,或者通过附件方式获取图片,有了特色 ...

  9. Linux下几个命令的技巧

    Ctrl的组合键+a,移动到一行命令的首部+e,移动到一行命令的尾部+左右键,以单词为单位左右移动+u,删除光标之前的所有内容+k,删除光标之后的所有内容Alt+.为引用上一个命令的最后一个参数 还有 ...

  10. Java基础:类加载机制

    之前的<java基础:内存模型>当中,我们大体了解了在java当中,不同类型的信息,都存放于java当中哪个部位当中,那么有了对于堆.栈.方法区.的基本理解以后,今天我们来好好剖析一下,j ...