Unity视差贴图多实现对比和改进

news2025/7/9 20:28:45

视差贴图多种实现方式对比和改进

  • 视差贴图
    • 视差映射
    • 陡峭视差映射
    • 视差遮蔽映射
    • 迭代视差映射-kerry

视差贴图

参考
在这里插入图片描述

与法线贴图相同,可以模拟出物体得深度感,同时它得改进是能够随着视角得偏移显示不同得深度感,使得显示更加真实。

由于采样高度图会比较难以计算,因此可以采样深度图。(深度图其实是高度图得反相,白色表示凹陷)。

计算:
需要将视线向量转换到切线空间下(因为高度是物体表面信息,都是相对于物体表面空间(切线空间)来描述的)。
在这里插入图片描述

在这里插入图片描述

视差映射

在这里插入图片描述

原本采样是H(A)点,uv值为A,根据A点记录的深度信息,将V的长度缩放为高度贴图在点A处H(A)采样得来的深度(高度)值的到P。
在这里插入图片描述

这里传入一张高度图代替深度图:_ParallaxMap

也可以传入深度图_DeepMap,两者为反相关系,_ParallaxMap = 1 - _DeepMap。
// 视差映射

half2 parallaxMapping(half2 uv, half3 view_dir_tangent)
{
    float deep = (1. - tex2D(_ParallaxMap, uv).r) * _ParallaxIntensity;
    // 向视线方向偏移, 眼睛 -> 像素
    float2 P = view_dir_tangent.xy / view_dir_tangent.z * deep ; 
    return uv - P;
}

计算切线空间的视线向量

fixed3 normal_dir = normalize(i.normal_world);
fixed3 tangent_dir = normalize(i.tangent_world);
fixed3 binormal_dir = normalize(i.binormal_world);
float3x3 TBN = float3x3(tangent_dir, binormal_dir, normal_dir);

fixed3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
half3 view_dir_tangent = normalize(mul(TBN, view_dir)); // 视线转换到切线空间

陡峭视差映射

在这里插入图片描述

在这里插入图片描述

float2 steepParallaxMapping(float2 uv, float3 view_dir_tangent)
{
    const float numLayers = _ParallaxIteration;
    float deep_step = 1.0 / numLayers;

    float2 P = view_dir_tangent.xy  * deep_step * _ParallaxIntensity;// 视角方向
    float deep = (1. - tex2D(_ParallaxMap, uv).r);
    
    float current_deep = 0.f;
    float2 current_uv = uv;
    [unroll(30)]
    while (current_deep < deep) // 如果当前深度小于 深度贴图的深度,表示找到了近似值
    {
        current_uv -= P;
        deep = (1. - tex2D(_ParallaxMap, current_uv).r);
        current_deep += deep_step;
    }
    return current_uv;
}

下面是_ParallaxIteration取值10,——parallaxIntensity取值0.1
会有明显的锯齿感:
在这里插入图片描述

视差遮蔽映射

视差遮蔽映射(Parallax Occlusion Mapping)和陡峭视差映射的原则相同,但不是用触碰的第一个深度层的纹理坐标,而是在触碰之前和之后,在深度层之间进行线性插值。我们根据表面的高度距离啷个深度层的深度层值的距离来确定线性插值的大小。
大部分和陡峭视差映射一样,不一样的地方是有个额外的步骤,两个深度层的纹理坐标围绕着交叉点的线性插值。这也是近似的,但是比陡峭视差映射更精确。
陡峭视差映射

视差屏蔽映射

float2 parallaxOcclusionMapping(float2 uv, float3 view_dir_tangent)
{
   float deep_step = 1. / _ParallaxIteration;
   float2 P = view_dir_tangent.xy * deep_step * _ParallaxIntensity;

   float2 curr_uv = uv;
   float curr_deep = 0.f;
   float tex_deep = 1. - tex2D(_ParallaxMap, curr_uv).r;
   [unroll(30)]
   while (curr_deep < tex_deep)
   {
       curr_uv -= P;
       tex_deep = 1. - tex2D(_ParallaxMap, curr_uv).r;
       curr_deep += deep_step;
   }
   // 上面是陡峭视差映射的逻辑

   // 进行插值
   float2 prevTexCoords = curr_uv + P; // 上一个uv值
   float afterDeep = tex_deep - curr_deep;
   float beforeDeep = (1 - tex2D(_ParallaxMap, prevTexCoords).r) - curr_deep + deep_step;

   // interpolation of texture coordinates
   float weight = afterDeep / (afterDeep - beforeDeep);
   float2 finalTexCoords = prevTexCoords * weight + curr_uv * (1.0 - weight);
   return finalTexCoords;
}

迭代视差映射-kerry

我们知道深度数据的范围为[0-1],因此我们可以通过多次迭代让深的更深,从而产生更强的立体感:

float2 steepParallaxMapping_kerry(float2 uv, float3 view_dir_tangent)
{
    half2 parallax_uv = uv;
  	//  /z可以修正高度增加立体感
    half2 P = view_dir_tangent.xy * _ParallaxIntensity; // / view_dir_tangent.z;
    for (int j = 0; j < _ParallaxIteration; j++)
    {		// 这里的1可以取0.5或者其他值,
        const half deep =  1. - tex2D(_ParallaxMap, parallax_uv).r; 
        parallax_uv = parallax_uv - deep * P;
    }
    return parallax_uv.xy;
}

锯齿感明显消失
在这里插入图片描述

可以通过变更深度和高度的参数来提升立体感:

const half deep =  1. - tex2D(_ParallaxMap, parallax_uv).r;   取值0.5(一部分表示为深度,一部分为高度)

高度对比更加明显了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录刷题| 多重背包理论基础、背包问题的总结

目录 多重背包理论基础 多重背包的问题 多重背包的解法 多重背包的代码 背包问题的总结 01背包 完全背包 多重背包 多重背包理论基础 多重背包的问题 有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用&#xff0c;每件耗费的空间是Ci &#xff0c;价值是Wi 。…

单身福利专场, Python采集某相亲网站美女数据

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 现在&#xff0c;广大年轻人到了一定年纪&#xff0c;一定会引来父母的念叨 不是让相亲就是让结婚的&#xff0c;与其父母念叨&#xff0c;不如自己找一个 到时候问起来&#xff0c;就说再接触呢~~ 今天我们就来用python…

NestJS学习:使用session实现登录验证

参考 大佬的视频教程&#xff1a;nestjs session案例 大佬的博客地址&#xff1a;小满nestjs&#xff08;第九章 nestjs Session&#xff09; 在学习某些知识时如果有大佬的视频教程与文档真的是太爽了&#xff0c;能够学习到好多新知识。 nest后台 session session 是服务…

目标检测算法——3D公共数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;&#x1f680;&#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批3D公共数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&…

十个值得珍藏的正则表达式

正则表达式常学常忘&#xff0c;记规则不如记例子&#xff0c;记多不如记精&#xff0c;记例子就记最经典的。下面是本人珍藏的十个有用的正则表达式&#xff0c;不吝分享&#xff0c;以飨读者。 正则表达式要点 小括号&#xff1a;代表分组 中括号&#xff1a;代表集合 大括号…

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量&#xff0c; 而Y 是一个与x有关的随机变量&#xff0c;因此&#xff0c;直接研究变量Y与x之间的相关关系是困难的&#xff0e; 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值&#xff0c;因此&#xff0c; 可考虑研究EY与x之间的…

第六章 支持向量机

6.1 间隔与支持向量 给定一个训练样本集&#xff0c;分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面。但是这个划分超平面也是很多的&#xff0c;如下图所示 直观上应该去找两类样本中最中间的划分超平面&#xff0c;因为该划分超平面对训练样本局部扰动…

与分类有关的一种时序优先现象

(A&#xff0c;B)---2*30*2---(1,0)(0,1) 用网络分类A和B&#xff0c;让A由两张图片组成&#xff08;0&#xff0c;0&#xff09;&#xff08;0&#xff0c;1&#xff09;&#xff0c;让B由两张图片组成&#xff08;1&#xff0c;0&#xff09;&#xff08;0&#xff0c;0&…

(附源码)计算机毕业设计JavaJava毕设项目租车网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

Ubuntu22.04:设置Samba服务

Samba服务可以实现在主机间共享文件与Windows的共享通用。 Ubuntu22.04可以按照如下步骤安装并开启Samba服务&#xff1a; 1.安装samba sudo apt install samba 2.创建一个用于共享的目录(路径和路径名可以自行决定&#xff09; mkdir samba 3.设置共享目录的访问权限 s…

Prometheus的remotewrite for java

1、增加参数重启prometheus 修改 prometheus启动参数 - "--enable-featureremote-write-receiver" 重启 prometheus 2、下载案例 GitHub - bprasen/remotewrite 3、迁移 将案例中的代码复制到springboot/springcloud中 pom中增加 <!-- prometheus remote writ…

Windows OpenGL 图像阴影

目录 一.OpenGL 图像阴影 1.原始图片2.效果演示 二.OpenGL 图像阴影源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES 学习…

【机器学习项目实战10例】(一):利用线性回归实现股票预测分析

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、利用线性回归实现股票预测分析二、加载股票数据三、将数据进行标准化四、形成训练数据五、加载数据集六、构建线性回归模型七、精度测试八、网格搜索九、绘制结果一、利用线性回归实现股票预测分析 股价预测其实是一个较…

PyTorch深度强化学习中蒙特卡洛策略梯度法在短走廊环境(CartPole-v0)中的实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、策略梯度法 策略梯度法&#xff08;PG&#xff09;利用策略函数来选择动作&#xff0c;同时使用值函数来辅助策略函数参数的更新&#xff0c;根据策略类型的不同&#xff0c;可以分为随机策略梯度和确定性策略梯度 策略梯度法与…

1990-2021年全国各省城市化水平数据

1990-2021年全国各省城市化水平数据 1、包括&#xff1a;全国31省 2、时间&#xff1a;1990-2021年 3、指标包括&#xff1a;城镇常住人口数(万人)、常住人口数(万人)、城市化水平 4、指标衡量&#xff1a;城市化率本地区城镇人口/总人口 5、指标解释&#xff1a; 城市化…

C++ 语法基础课5 —— 字符串

文章目录1. 字符与整数的联系 —— ASCII码1.1 练习 — 统计数字和字母个数2. 字符数组(记得多\0)2.1 字符数组的输入输出2.2 字符数组的常用操作2.3 遍历字符数组中的字符3. 标准库类型 string3.1 定义和初始化3.2 string 上的操作3.2.1 string的读写3.2.2 使用getline读取一整…

操作系统之启动过程

本文参考MOOC哈工大操作系统课程&#xff0c;需要有一定的汇编基础 打开电源后&#xff0c;计算机做了什么 此时需要先运行的代码是BIOS x86 PC开机后CPU处于实模式&#xff0c;寻址方式为CS:IP&#xff08;CS左移4位IP&#xff09;开机时&#xff0c;初始化的CS0xFFFF&…

_linux 进程间通信(命名管道)

文章目录1. 创建一个命名管道2. 用命名管道实现server&client通信2.0 log.hpp打印日志信息2.1 comm.hpp(server.cc和client.cc共有文件)2.2 server.cc读取数据2.3 client.cc发送数据2.4 结果展示3. 还可以多个进程接收1. 创建一个命名管道 命名管道可以从命令行上创建&…

微服务介绍微服务环境搭建

一、微服务介绍 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构&#xff0c;当然还有悄然兴起的Service Mesh(服务网格化)。 微服务架构 微服务架构在某种程度上是面向…

机械原理复习试题及答案

机械原理 一、填空题&#xff1a; 1.机构具有确定运动的条件是机构的自由度数等于 。 2.同一构件上各点的速度多边形必 于对应点位置组成的多边形。 3.在转子平衡问题中&#xff0c;偏心质量产生的惯性力可以用 相对地表示。 4.机械系统的等效力学模型是具有 &#xff0c;其上作…