当前位置: 首页 > news >正文

OpenGL 视差贴图

视差贴图是什么?

视差贴图是法线贴图的增强版和延伸。它们协同工作,但解决的是不同层次的问题

  • 法线贴图:解决了表面细节的光照问题。它通过改变每个片元的法线向量来模拟凹凸不平的光照效果,但物体的轮廓、边缘和自身的遮挡关系依然是平坦的
  • 视差贴图:解决了表面细节的几何深度和遮挡问题。它通过偏移纹理坐标,模拟了人眼观察时因为视角不同而产生的纹理位移(视差效应),从而创造出更强的深度幻觉,甚至能模拟自我遮挡

你可以把它们理解为一种进阶关系:

平面纹理 -> 法线贴图 -> 视差贴图 -> 陡峭视差贴图 -> 视差遮蔽贴图

1. 法线贴图 (Normal Mapping)

目的:
  • 在不增加模型顶点数量的前提下,通过改变光照计算时使用的法线方向,来模拟物体表面的微观凹凸细节
  • 它只影响光照,让平坦的表面看起来有明暗变化,像是凹凸不平的
工作原理:
  1. 纹理存储:法线贴图是一张 RGB 图像。其颜色值 (rgb) 对应着一个法向量的 (x, yz) 分量。这些法向量定义在切线空间(Tangent Space) 中
  2. 切线空间:这是一个相对于物体表面每个点的局部空间
    ○ N 轴:与物体表面法线方向对齐(垂直于表面)
    ○ T 轴:与物体表面的切线方向对齐(通常沿纹理的 U 方向)
    轴(或叫 Bitangent):与切线(T)和法线(N)垂直(通常沿纹理的 V 方向)。B = cross(N, T)
  3. 光照计算:在片段着色器中,我们将光线方向和视线方向从世界空间转换到切线空间。然后,从法线贴图中采样得到切线空间下的法线向量,直接用于计算漫反射和高光光照。因为这个采样的法线方向各不相同,所以即使平面是平的,也能计算出凹凸的光照效果
局限性:

模型本身的形状没有改变。从侧面看,模型的轮廓依然是平滑的,而且凹凸之间不会有任何遮挡关系

2. 视差贴图 (Parallax Mapping)

目的:
  • 在法线贴图的基础上,进一步模拟出深度感和遮挡关系。它通过制造视觉上的位移(视差)来欺骗眼睛,让观察者认为表面真的有高低起伏
工作原理(基本思想):
  1. 高度图(Height Map):视差贴图需要另一张纹理,称为高度图(通常是灰度图)。白色(值~1.0)代表该点“高”,黑色(值~0.0)代表该点“低”
  2. 纹理坐标偏移:核心思想是,根据表面高度观察视角来偏移纹理坐标
    ○ 视角越陡峭,看到的纹理位移应该越小
    ○ 视角越平缓,看到的纹理位移应该越大
    ○ 点的高度越高,它应该“凸出来”更多,其纹理坐标的偏移也越大
  3. 算法步骤(在片段着色器中)
    ① 计算从表面点到观察者在切线空间中的方向向量 V
     对 V 进行归一化,并将其 x 和 y 分量(代表切线和副切线方向)除以它的 z 分量(代表法线方向)。这一步实质上是在根据视角的平缓程度来缩放偏移量
    ③ 从高度图中采样当前片段的高度值 H
     将缩放后的视角向量 V.xy 与高度 H 和一个控制整体深度的缩放因子 scale 相乘:Offset = V.xy * (H * scale)
     用这个计算出的 Offset 去偏移原始的纹理坐标,然后用偏移后的新坐标去采样漫反射纹理法线贴图
    // GLSL 片段着色器代码示例(简化概念)
    vec2 ParallaxMapping(vec2 texCoords, vec3 viewDirTangentspace)
    {float height = texture(heightMap, texCoords).r; // 采样高度vec2 p = viewDirTangentspace.xy / (viewDirTangentspace.z + 0.0001); // 视角缩放因子return texCoords - p * (height * parallaxScale); // 返回偏移后的坐标
    }void main()
    {// 将观察方向转换到切线空间vec3 viewDirTangentspace = ...;// 计算视差偏移后的纹理坐标vec2 offsetTexCoords = ParallaxMapping(TexCoords, viewDirTangentspace);// 使用偏移后的坐标进行采样vec3 normal = texture(normalMap, offsetTexCoords).rgb;vec4 color = texture(diffuseMap, offsetTexCoords);// ... 后续光照计算
    }
与法线贴图的关系:
  • 依赖关系:视差贴图几乎总是和法线贴图一起使用。你首先使用视差贴图技术计算出更正确的、能反映深度的纹理坐标,然后用这个新坐标去采样法线贴图和漫反射贴图
  • 效果叠加:法线贴图提供了细节的光照,而视差贴图提供了细节的几何位移和遮挡。两者结合,效果远超单独使用法线贴图
进阶形式:
  • 陡峭视差贴图 (Steep Parallax Mapping):基本视差贴图在高度变化剧烈时容易失真。陡峭视差贴图将深度分层,进行步进式射线追踪,效果更好,是更常用的实践
  • 视差遮蔽贴图 (Parallax Occlusion Mapping):在陡峭视差贴图的基础上,在最后一步进行线性插值,使得层次之间的过渡更加平滑,效果极其逼真,是当前的高标准

总结对比

特性法线贴图 (Normal Mapping)视差贴图 (Parallax Mapping)
核心目标模拟凹凸的光照细节模拟凹凸的几何深度和遮挡
所需纹理法线贴图 (Normal Map)高度图 (Height Map) + 法线贴图
技术核心在切线空间中使用采样的法线进行光照计算根据高度和视角偏移纹理坐标
性能开销中到大(取决于算法复杂度)
效果表面光照有凹凸感,但轮廓平坦,无遮挡具有强烈的深度感和简单的遮挡,轮廓依然平坦
关系基础增强和延伸,建立在法线贴图工作流之上

在 OpenGL 中实现的要点

  1. 切线空间计算:两者都极度依赖切线空间。你需要在 CPU 端为你的模型计算每个顶点的切线(Tangent) 和副切线(Bitangent) 向量,并将它们作为属性传递给着色器。然后用 T, B, N 矩阵构建从模型空间到切线空间的变换矩阵
  2. 统一的工作流:通常的流程是:
    ○ 在片段着色器中,先使用高度图和视角向量计算视差偏移后的纹理坐标
    ○ 使用这个偏移后的坐标去采样法线贴图,得到切线空间下的法线
    ○ 使用偏移后的坐标去采样漫反射/高光等颜色纹理
    ○ 在切线空间中进行光照计算
  3. 参数调节:视差效果有一个 height_scale 参数,需要根据你的纹理和模型进行微调。值太大会产生失真,太小则效果不明显

总而言之,法线贴图和视差贴图是相辅相成的技术。法线贴图提供了“形”,而视差贴图提供了“影”,两者结合才能创造出以假乱真的复杂表面细节

http://www.dtcms.com/a/353115.html

相关文章:

  • UVa11607 Cutting Cakes
  • Java垃圾回收器:从SerialGC到G1的演进/速通
  • 流程控制语句(1)
  • 如何检查 Linux 系统的内存使用情况
  • vue2实现背景颜色渐变
  • 【目标检测】论文阅读4
  • 分布式2PC理论
  • 大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
  • (11)用于无GPS导航的制图师SLAM(一)
  • 【Android】原安卓生态发起网络GET请求 Post请求
  • 【87页PPT】智慧方案智慧校园智能化综合建设方案(附下载方式)
  • Linux操作系统—进程
  • 基于Prometheus Pushgateway与Alertmanager的自定义指标监控与告警实践指南
  • 【HTML】隐藏滚动条但保留功能
  • 年度优质会议推荐:【西安石油大学主办|IEEE出版|往届均EI】第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025)
  • Playwright进阶指南 (6) | 自动化测试实战
  • 从 GRIT 到 WebUI:Chromium 内置资源加载与前端展示的完整链路解析
  • 寻找AI——初识墨刀AI
  • 【FPGA】VGA显示-贪吃蛇
  • oracle 表空间扩容(增加新的数据文件)
  • 浅聊达梦数据库物理热备的概念及原理
  • VESA时序检测模块设计verilog实现
  • 力扣hot100:字母异位词分组和最长连续序列(49,128)
  • Ansible的介绍+ansible平台部署
  • 互联网大厂Java面试深度解析:从基础到微服务云原生的全场景模拟
  • 公开课程 | 大规模图数据管理与分析 第二讲:图的度量、性质与生成模型
  • redbook的判断完美数
  • 销售数据分析平台
  • LeetCode hot 100 每日一题(18)——206.反转链表
  • 开源 | 推荐一套企业级开源AI人工智能训练推理平台(数算岛):完整代码包含多租户、分布式训练、模型市场、多框架支持、边缘端适配、云边协同协议: