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次纹理采样。

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

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

相关文章

20.2 OpenSSL 非对称RSA加解密算法

RSA算法是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用…

我的架构复盘

1、背景 我目前公司研发中心担任软件研发负责人,研发中心分为3组,总共有30多人。研发中心主要开发各类生产辅助工具,比如巡检、安全教育等系统。系统不对外,只在公司内部使用。 就我个人来说,作为研发负责人&#xf…

【C语言_题库】C语言:编写一个程序,输入一组字符串,将字符串中的小写字母转换为大写字母,其它字符不变,并输出。

把键盘输入的一行字符串的小写字母转换成大写字母,其余字符不变,进行输出,直到遇到回车为止。 具体说明 【问题描述】 从键盘输入一行英文字符串,把所有小写字母变成大写字母,其他字母和字符保持不变。 【输入形式】 输入一行字符串,含大小写。 【输出形式】 输出大写字…

考试成绩这样分发

老师们,还在为每次繁琐的成绩查询而头痛?今天我就要给大家带来一个超级实用的教程,让你轻松解决这个问题! 我来介绍一下这个神秘的“成绩查询页面”。别以为它很复杂,其实它就是一个简单的网页,上面会有每个…

详解—数据结构《树和二叉树》

目录 一.树概念及结构 1.1树的概念 1.2树的表示 二.二叉树的概念及结构 2.1概念 2.2二叉树的特点 2.3现实中的二叉树 2.4数据结构中的二叉树 2.5 特殊的二叉树 2.6二叉树的存储结构 2.6.1二叉树的性质 2.6.2 顺序结构 2.6.3链式存储 三. 二叉树的链式结构的遍历 …

美术培训服务预约小程序的作用是什么

线下培训教育机构很多,涉及到的行业及种类很多,美术培训就是其中较为重要的一类,尤其是青少年群体,其拓展度很深,而对商家来说,其主要生源在本地同城,因此品牌宣传和渠道发展、学员赋能很重要。…

AI虚拟主播源码系统 搭建专属自己的直播间+送礼物 功能强大 带完整搭建教程

在互联网的不断发展下,直播行业迅速崛起,成为一种新的信息传播和娱乐形式。越来越多的人开始通过直播平台进行交流、互动和分享。因此,开发一款能够提供高质量、稳定直播服务的平台具有重要的现实意义。 随着人工智能技术的不断进步&#xf…

蓝桥杯每日一题2023.10.29

螺旋折线 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 在图中我们可以观察到四个对角线的值均为特殊点&#xff0c;其他的点可以根据这几个 进行偏移量的计算从而进行表示&#xff0c;此题主要是找到规律即可 #include<bits/stdc.h> using namespace std; typedef long…

红米电脑硬盘剪切

Redmi R14 2023版固态硬盘剪切 工具准备操作结尾语 首先要说明&#xff0c;本文所说的操作不一定适合你的电脑&#xff0c;因为电子产品更新换代过快&#xff0c;你的硬盘不一定能剪切&#xff0c;在操作前一定要仔细观察硬盘的型号&#xff0c;是否为同款&#xff0c;我上了图…

测试C#调用Aplayer播放视频(1:加载Aplayer控件)

微信公众号“Dotnet跨平台”的文章《开源精品&#xff0c;使用 C# 开发的 KTV 点歌项目》中使用了迅雷开源APlayer播放引擎。最近在学习有哪些能拿来播放视频的组件或控件&#xff0c;于是准备试试&#xff0c;根据文章中的介绍&#xff0c;在迅雷APlayer播放引擎网站中下载了A…

【23真题】对不起,由于我的择校分析,这所可能会炸!

哈喽大家好&#xff0c;现在这个时间节点&#xff0c;有很多同学开始刷真题了&#xff01;所以23真题系列正式启动&#xff01;小马哥将全面发布23真题及详细解析&#xff01; 注意太原科技大学&#xff0c;自我发了择校分析以后&#xff08;苍天为证&#xff0c;我真的没有任…

C++面试——多线程详解

C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread>中。它解决了跨平台的问题&#xff0c;提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C11 新标准中引入了5个头文件来支持多线程编程&#xff0c;如下图所示&#xff1a; 多进程与多线程 多…

计数排序(秒懂版)

public class CountingSort {int[] sort() {int N 10000;int M 100;//假设A中最大值为100int A[] new int[N];//1~k,原数组int B[] new int[N];//1~k,Stores incompletely sorted numbersint C[] new int[M 1];//0~n,辅助排序数组for (int i 0; i < M; i) {C[i] 0;}…

【Linux】多路IO复用技术①——select详解如何使用select模型在本地主机实现简易的一对多服务器(附图解与代码实现)

这一篇的篇幅可能有点长&#xff0c;但真心希望大家能够静下心来看完&#xff0c;相信一定会有不小的收获。那么话不多说&#xff0c;我们这就开始啦&#xff01;&#xff01;&#xff01; 目录 一对一服务器中的BUG 如何实现简易的一对多服务器 实现简易一对多服务器的大体…

大数据-Storm流式框架(六)---Kafka介绍

Kafka简介 Kafka是一个分布式的消息队列系统(Message Queue)。 官网&#xff1a;Apache Kafka 消息和批次 kafka的数据单元称为消息。消息可以看成是数据库表的一行或一条记录。 消息由字节数组组成&#xff0c;kafka中消息没有特别的格式或含义。 消息有可选的键&#x…

Kubernetes Taint(污点) 和 Toleration(容忍)

Author&#xff1a;rab 目录 前言一、Taint&#xff08;污点&#xff09;1.1 概述1.2 查看节点 Taint1.3 标记节点 Taint1.4 删除节点 Taint 二、Toleration&#xff08;容忍&#xff09; 前言 Kubernetes 中的污点&#xff08;Taint&#xff09;和容忍&#xff08;Toleration…

3D模拟场景开发引擎

在3D工程模拟开发中&#xff0c;有一些专门的引擎和工具可供选择&#xff0c;以帮助您创建逼真的三维模拟和模型。以下是一些用于3D工程模拟的开发引擎和工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

SCADA在污水和供水系统解决方案

1. 引言 随着城市化的不断发展&#xff0c;污水和供水系统的管理变得越来越重要。为了提高运营效率和监控系统状态&#xff0c;许多污水处理厂开始使用SCADA系统。 SCADA系统具有实时数据采集、监控和控制功能&#xff0c;可以帮助污水处理厂运营人员实时了解系统的运行情况&…

Python 学习1 基础

文章目录 基础字符串字面量常用的值类型注释变量print语句数据类型数据类型转换标识符运算符 字符串拓展小结 2023.10.28 周六 最近打算学一下Python&#xff0c;毕竟确实简单方便&#xff0c;而且那个编程语言排名还是在第一。不过不打算靠它吃饭&#xff0c;深不深入暂且不说…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具&#xff0c;能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件&#xff0c;加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…