4.2 SSAO算法 屏幕空间环境光遮蔽

一、SSAO介绍

AO

环境光遮蔽,全程Ambient Occlustion,是计算机图形学中的一种着色和渲染技术,模拟光线到达物体能力的粗略的全局方法,描述光线到达物体表面的能力。

SSAO

屏幕空间环境光遮蔽,全程 Screen Space Ambient Occlusion,一种用于计算机图形中实时实现近似环境光遮蔽效果的渲染技术。通过获取像素的深度缓冲、法线缓冲来计算实现,来金丝的表现物体在间接光下产生的阴影。

SSAO历史

AO这项技术最早是在Siggraph 2002年会上由ILM(工业光魔)的技术主管Hayden Landis所展示,当时就被叫做Ambient Occlusion。

2007年,Crytek公司发布了一款叫做屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)的技术,并用在了他们的看家作孤岛危机上。


二、SSAO原理

  • 计算深度、法线缓冲
  • 深度->像素坐标
  • 法线->法向半球随机向量
  • 计算像素随机后的坐标(多次采样)
  • 获取随机后深度并比较
  • 判断加权AO
  • 后期(模糊等)

样本缓冲

  • 深度缓冲
    • 深度缓冲中的depth值用于当前视点下场景的每一个像素距离相机距离的一个粗略表达,用于重构像素相机空间中的坐标(Z),来劲死重构该视点下的三维场景。
  • 法线缓冲
    • 相机空间中的法线信息,用于重构每个像素的“法线-切线-副切线”构成的坐标轴,用于法线半球中的采样随机向量(随机向量用于判断、描述该像素的AO强度)。

法向半球

  • 黑色表示我们需要计算的样本
  • 蓝色向量表示样本的法向量
  • 白色灰色为采样点(很明显,采样点的多少影响最后的渲染效果),其中灰色表示被遮挡采样点(深度大于周围),据此判断最终AO的强度。
  • 右图表示法向球形采样(后背抛弃),原因是该方式采样导致凭证的墙面也会显得灰蒙蒙的,因为和心中一般的样本都会在墙这个几何体上。


三、SSAO算法实现

Buffer

  • 获取深度&法线缓冲数据
  • C#部分
  • Shader部分
  • UnityCG.cginc

如果是延迟渲染这一步可以省略,G-Buffer中可以直接拿到

中间相机空间坐标

  • 重建方法
    • 参考链接:Unity从深度缓冲重建世界空间位置 - 知乎
    • 本例实现使用其中的“NDC空间中重构”方法得到样本在相机空间中的向量,乘以深度值得到样本的坐标。
  • 从NDC空间重建
    • 1.计算样本屏幕坐标(利用Unity内置的函数)
    • 2.转化至NDC空间中
    • 3.计算相机空间,从中到远屏幕的方向(内置变量_ProjectionParams.z存放相机远平面值far)
    • 4.矩阵变换至相机空间中的样本相对相机的方向
    • 5.重构相机空间的样本坐标(在像素着色器中)
    • 在相机空间中通过样本的相对相机方向以及深度,来拟合重构坐标

构建法向量正交基

  • 设置法向量
  • 生成随机向量(用于构建的正交基随机,而非所有样本计算的到的正交基一致),先归一化
  • 求出切向量,再利用函数cross叉积求副切线向量

AO采样核心

  • 传入给定的随机采样向量,并通过法向量正交基转化至法线半球中的向量。

  • 获取随机坐标点。
  • 转换至屏幕空间坐标

  • 计算随机向量转化至屏幕空间后对应的深度值,并判断累加AO


四、SSAO效果改进

随机正交基(增加随机性)

  • 为了不使求得的法向半球的正交基一致,我们引入随机向量,已求得不用想象的切向量。
  • 利用uv采样一张Noise贴图(如下图4x4像素的Noise贴图,可选择其他尺寸),或者随机向量。
  • 并在C#中传入噪声贴图。

AO累加平滑优化

范围判定(模型边界)

  • 样本采样,可能会采集到的深度差非常大的随机点,会导致边界出现AO,如下图
  • 加入样本深度和随机点的深度值判定(效果如下图)

自身判定

如果随机点深度值和自身一样或者非常接近(可能会导致虽然在同一平面,也会出现AO),如下图

判断深度值的大小时,增加一个变量,来改善问题

AO权重

AO深度判断,非0即1,比较生硬,为其增加一权重,如下图

本例中的权重为:发现半球中随机采样后的点x、y(切线平面)距离样本的距离为参考

模糊

采用基于法线的双边滤波原理(Bilateral Filtering)


五、对比模型烘焙AO

烘焙方式

  • 三维建模软件烘焙AO方式
    • 通过三维建模软件(如3DMax),设定好渲染参数,对模型(单一选择模型实体),烘焙AO到纹理。
  • 游戏引擎烘焙AO方式(Unity3D Lighting)
    • 通过Unity的Lighting功能(主菜单/Window/Rendering/Lighting Settings)进行整体场景的烘焙,AO信息包含于此。

建模软件烘焙优缺点

  • 优点
    1. 单一物体可控性强(通过单一物体的材质球上的AO纹理贴图),可以控制单一物体的AO的强弱;
    2. 弥补场景烘焙的细节,整体场景的烘焙(包含AO信息),并不能完全包含单一物体细节上的AO,而通 过三维建模软件烘焙到纹理的方式,增加物体的AO细节;
    3. 不影响其(Unity场景中)静态或者动态;
  • 缺点
    1. 操作较其他方式繁琐,需要对模型进行UV处理,再进行烘焙到纹理;
    2. 不利于整体场景的整合(如3DMax烘焙到纹理,只能选择单一物体,针对整体场景的处理工作量巨大);
    3. 增加AO纹理贴图,不利于资源优化(后期可通过其他纹理通道利用整合资源);
    4. 只有物体本身具有AO信息,获取物体之间的AO信息工作量巨大(不是不可能)。

Unity烘焙优缺点

  • 优点
    1. 操作简易,整体场景的烘焙,包含AO的选择;
    2. 不受物体本身的UW影响,Unity通过Generate Lightmap UVs生成模型第二个纹理坐标数据;
    3. 可生成场景中物体与物体之间的AO信息;
  • 缺点
    1. 缺少单一物体的细节(可调整参数提高烘焙细节,但换之将增加烘焙纹理数量和尺寸,以及烘焙时间);
    2. 受物体是否静态影响,动态物体无法进行烘焙,获得AO信息。

SSAO优缺点

  • 优点
    1. 不依赖场景的复杂度,其效果质量依赖于最终图片像素大小;
    2. 实时计算,可用于动态场景;
    3. 可控性强,灵活性强,操作简单;
  • 缺点
    1. 性能消耗较之上述2种方式更多,计算非常昂贵;
    2. AO质量上要比较离线式烘焙(上述2种)不佳(理论上)。

六、SSAO性能消耗

AO核心采样消耗说明

AO法向半球的随机采样

双边滤波的多重采样

本例SSAO算法中,主要核心为计算AO随机法向半球的采样点,并加以半段计算AO权值。

  1. 利用For结构代码进行半球堆积向量的采样,If、For等对于GPU计算性能上不友好

  2. 采样数的数量(上图的_SmpleKernelCount,针对For循环的次数),过低的采样数得不到好的结果;以64为例,1334*750的分辨率,每个像素计算循环64次,合计1334*750*64次AO核心计算。
  3. 循环体重采样,同样以64为例,每个像素计算需要采样64次来求得屏幕深度值法线值。

滤波采样消耗说明

本例采用的是双边滤波(Bilateral Filter),为保证不被模糊,采样基于法线的双边滤波。

  1. C#后期脚本中,Blit两次(横向和纵向),合计调用两次滤波渲染Pass;

  2. 单一滤波渲染Pass中,多重采样,包括7次主纹理的采样和7次屏幕像素的法线信息的采用,屏幕中每个像素合计14次纹理采样。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL与MongoDB,该如何做技术选型?

hello,大家好,我是张张,「架构精进之路」公号作者。 引言 一般情况下,会考虑到MySQL与MongoDB如何做技术选型的时候,你一定是遇到了类似于非结构化数据JSON的存取难题,否则大家都直接MySQL开始搞起了。 为什…

matlab simulink PMSM_SVPWM PI转速控制

1、内容简介 略 8-可以交流、咨询、答疑 2、内容说明 略PMSM_SVPWM PI转速控制 PMSM SVPWM PI转速控制 3、仿真分析 4、参考论文 略

电脑办公最佳拍档 夸克网盘升级低耗能备份、PDF阅读器等功能

临近年终,上班族不仅要总结过去一年的成绩还要开始制定新规划,在这个过程中整理资料是必不可少的环节。对于经常需要使用文件备份和PDF的用户,推荐大家试一下夸克网盘电脑端,升级后的“低耗能备份”和“PDF阅读器”让备份体验更丝…

面试150题做题记录

面试150题做题记录 题目1: 合并两个有序数组 题目1: 合并两个有序数组 题目:https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 最优思路:利用原有数列的单调性质,从右往左遍历&#xff…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后,MySQL需要手动执行启动。 运行执行脚本后发现异常,如下图: 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看,发现mysql进程号一直在变化&#x…

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视…

redis的分布式锁

分布式锁是一种用在分布式系统中实现同步和互斥访问的机制。 1、分布式锁概念 满足分布式系统或者集群模式下,多进程可见并且互斥的锁。 分布式锁的核心思想就是让分布式集群中的节点都适用同一把锁,只要大家使用的是同一把锁,就能锁住线程…

038-第三代软件开发-简易视频播放器-自定义Slider (二)

第三代软件开发-简易视频播放器-自定义Slider (二) 文章目录 第三代软件开发-简易视频播放器-自定义Slider (二)项目介绍简易视频播放器自定义Slider (二)横向纵向 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&…

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库,可以处理图像和视频数据。它包含了超过2500个优化过的算法,用于对图像和视频进行处理,包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言,包括C、Python、Java等&#xff0c…

golang 实现雪花算法

雪花算法概述 snowflake 是 twitter 开源的分布式ID生成算法,其核心思想为,一个long型的ID: 41 bit 作为毫秒数 - 41位的长度可以使用69年10 bit 作为机器编号 (5个bit是数据中心,5个bit的机器ID) - 10位…

【网络知识必知必会】聊聊网络层IP协议

文章目录 前言IP 协议格式总结 前言 在之前的博文中, 我们聊过了传输层中的两个重点协议 TCP 和 UDP, 本文我们再来聊聊网络层中的一个协议IP, 简单认识一下 IP 协议格式. IP 协议与 TCP 协议的复杂度也不妨多让, 不过我们在这里只是简单的聊一聊 IP 协议的报文格式就行, 毕竟…

图书馆书目推荐数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【Java初阶练习题】-- 循环练习题

循环练习题 1. 根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)2. 判定一个数字是否是素数3. 打印 1 - 100 之间所有的素数4. 输出 1000 - 2000 之间所有的闰年5. 输出乘法口诀表6. 求两个正整数的最大公约数7. 求出0~999之…

图数据库Neo4j概念、应用场景、安装及CQL的使用

一、图数据库概念 引用Seth Godin的说法,企业需要摒弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更为重要。 传统的**关系数据库管理系统(RDBMS)**并不擅长处理数据之间的关系,那些表状数据模…

滚动条默认是隐藏的只有鼠标移上去才会显示

效果 在设置滚动条的类名中写 /* 滚动条样式 */.content-box::-webkit-scrollbar {width: 0px; /* 设置纵轴(y轴)轴滚动条 */height: 0px; /* 设置横轴(x轴)轴滚动条 */}/* 滚动条滑块(里面小方块) */.…

分享一下微信小程序抽奖链接怎么做

标题:微信小程序抽奖链接制作全攻略,轻松玩转营销抽奖活动 一、引言 在当今的数字化时代,抽奖活动已经成为一种高效的市场营销策略,而微信小程序作为一个功能强大的移动端平台,为企业和个人提供了制作抽奖链接的便捷…

浅析Redis大Key | 京东云技术团队

一、背景 在京东到家购物车系统中,用户基于门店能够对商品进行加车操作。用户与门店商品使用Redis的Hash类型存储,如下代码块所示。不知细心的你有没有发现,如果单门店加车商品过多,或者门店过多时,此Key就会越来越大…

不同源安装nginx

Nginx是一款高性能的Web服务器软件。在安装Nginx时,可以选择不同的安装源。 1.官方源:在官方网站下载Nginx的源代码,然后进行编译安装。 2.EPEL源:EPEL (Extra Packages for Enterprise Linux)源是针对Red Hat、CentOS、Scienti…

IDEA初步入门

1 安装 现在的系统更迭很快,很多软件都只支持win10 和 11了,但我们过时党还在用win7. 所以就必须找到合适的版本。在windows 7 64位系统下,可以使用IDEA 2020.1.4版本。 在Jetbrain官方下,找到历史版本,找到windows版…

reactive与ref VCA

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI,可以说它受ReactHook 启发而来;它我们编写逻辑更灵活,便于提取公共逻辑,代码的复用率得到了提高,也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…