learnOpenGL 5.4 视差贴图
高度贴图
视差贴图要用到一副利用R通道储存片元高度的高度贴图,模拟在看到凹凸面的视差。
如图所示,如果这是一个3D的模型,我们沿黄线方向看到的应当是B点,如果是平面则会看到A点。按着这个逻辑,我们只要在贴图的A点显示B的内容,就可以假乱真,用平面贴图达到3D的效果。
所以,我们要做的工作,就是计算出B点,用它替换A点。
顺便一提,视差贴图一般与法线贴图一同使用,相辅相成。
视差计算
深度比高度更容易模拟,所以我们通常使用深度贴图取反来代替高度图。
寻找B点的过程如图所示,从T0点出发,将深度分成N份逐层向下遍历,直到找到一点的深度小于等于该层(如图上的T3),则要找的点就在T2,T3之间,在利用相似三角形近似计算出该点的坐标。
以下是利用这个原理写的函数:
vec2 paracoor(vec2 texcoor,vec3 viewdir)
{vec2 p=viewdir.xy/viewdir.z*material.heightscale;//视线向量float layers=mix(20.0,10.0,abs(dot(vec3(0,0,1.0),viewdir)));//层数vec2 deltacoor=p/layers;float depth=0.0;vec2 currentcoor=texcoor;float currentdepth=1.0-texture(material.parawall,currentcoor).r;float predepth;while(depth<currentdepth){depth+=1.0/layers;currentcoor-=deltacoor;predepth=currentdepth;currentdepth=1.0-texture(material.parawall,currentcoor).r;}float ratio=(depth-currentdepth)/(depth-currentdepth+predepth-(depth-1.0/layers));return (currentcoor+ratio*deltacoor);
}
p是视线的向量,viewdir.xy / viewdir.z 是为了使z分量=1,实际上是viewdir.xyz / viewdir.z,但是P是二维向量,所以只取xy。heightscale是一个系数,用来调整视差的强烈程度。
为了提高算法效率,当视线方向比较正的时候取样层数可以少一些,比较斜的时候应该多一些,所以用了一个mix函数来改变层数。
其他部分与法线贴图基本相同。
局限
一个3D模型的表面积显然是要大于一个平面的,所以3D上的信息一定大于平面。视差贴图实际上是反复使用临近的信息来补足丢失的信息,所以只有当模拟的3D物体颜色信息本身就重复性比较大时才显得比较真实。所以一般还是用来模拟墙壁等细节要求较低的地方。
learnOpenGL 5.4 视差贴图相关推荐
- LearnOpenGL学习笔记——视差贴图
视差贴图 视差贴图和法线贴图都是通过贴图上的信息在不增加模型表面顶点的情况下,来表现出物体表面的凹凸感的方法. 法线贴图是通过给每个像素上添加不同法线信息,从而改变光照着色的计算结果来达到模拟凹凸的效 ...
- LearnOpenGL笔记——五、高级光照:“法线贴图”和”视差贴图“
五.高级光照:"法线贴图"和"视差贴图" 5.4 法线贴图 以光照算法的视角考虑的话,只有一件事决定物体的形状,这就是垂直于它的法线向量 砖块表面只有一个法线向 ...
- 【Shader】色调映射、视差贴图与实时阴影
一.色调映射(Tone Mapping) 为什么需要色调映射? 高动态范围图像(HDR)能够达到甚至更高数量级的亮度,而一般显示器只能表示的亮度值,因此往往会因为光照强度过大而造成的过暗/过曝光问题. ...
- 【UE4 Material 101学习笔记】 :Lec08/10/11/12 视差贴图的应用/布料着色/体积冰效果/树叶摇动
Lec08 视差贴图 原理 LearnOpenGL视差贴图 1. 使用高度图偏移UV 未使用高度贴图偏移UV时 使用之后,表面不平坦产生的阴影会更为明显一些. 当角度较大时,失真比较明显. 2. 视差 ...
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- python 深度 视差 计算_2,Learn about Parallax(视差贴图)
接上文 : https://zhuanlan.zhihu.com/p/128682162 浮雕视差贴图: 浮雕视差贴图是陡峭视差贴图的进阶版.并允许GLSLshader更加精确地找到偏移的UV坐标.首 ...
- UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶
UE4 Material 101学习笔记--08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶 Lec08 凹凸和视差贴图 Bump Offset and Parallax Occlusio ...
- OpenGL 视差贴图 Parallax Mapping
OpenGL 视差贴图 Parallax Mapping 视差贴图 Parallax Mapping简介 视差贴图 陡峭视差映射 视差遮蔽映射 视差贴图 Parallax Mapping简介 视差贴图 ...
- unity中凹凸贴图、法线贴图、视差贴图和位移贴图
凹凸贴图 ((更多资源资料下载群:193521697邀请码:10026)) 对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行 ...
最新文章
- 树莓派学习笔记——GPIO功能学习
- 参数匹配顺序——Python学习之参数(三)
- c# 多线程 调用带参数函数
- obj[]与obj._Ruby中带有示例的Array.rassoc(obj)方法
- 查询优化器内核剖析第四篇:从一个实例看执行计划
- python 实现显著性检测_强!汽车车道视频检测:python+OpenCV为主实现
- pandas dataframe对多列同时排序
- Ubuntu 16.04重启Nautilus
- DBA和开发同事的一些代沟(一)
- python迅雷下载任务出错_迅雷任务包含违规内容无法继续下载 迅雷任务出错修改host方法...
- Docker之Jitsi Meet视频会议服务
- 人心是暖的,眼泪是苦的,杜鹃花真的很香
- 在UE4中实现撤销(Undo)和重做(Redo)功能
- 如何快速制作App应用软件?国内有哪些比较好用的App制作平台?
- (构造+二进制)2020牛客寒假算法基础集训营3B.牛牛的DRB迷宫II
- 通过命令行操作iOS模拟器
- 博弈论(Nim游戏、有向图游戏之SG函数)
- Pygame 简单打字游戏
- 1527. 患某种疾病的患者(like关键字的使用)
- 化学绘图软件ChemFinder怎样连接数据库