Ambient Occlusion

2024-05-24 18:18
文章标签 occlusion ambient

本文主要是介绍Ambient Occlusion,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在以往的光照模型中,我们没有考虑间接光
以往的环境光照模型为: A=Lama
La 表示物体接受到的间接光的总量
ma 表示物体的材质,指定了射入环境光的反射和吸收的数量
并且认为光线从各个方向均匀的入射到物体表面
但这种计算模型完全不真实

环境光遮蔽的思想是:物体表面某点 p 的间接光数目是与以 p 为球心的半球对入射光线的遮蔽程度成比例的
这里写图片描述
(图片来源:Introduction to 3D Game Programming With DirectX 11)
左边的图表示入射光线全部通过半球射入到 p 点上
右边的图表明一部分光线被遮挡未能入射到 p 点上,即 p 点被遮蔽了

在现实中我们知道这样一个现象,墙角处看起来总是比旁边要暗一下,那是因为墙角收到墙面的遮蔽,因此为了模拟这样一个情况,我们需要计算出物体顶点的遮蔽程度,或者说遮蔽值

那么我们怎样去计算每个顶点的遮蔽程度呢?

假设 p 为物体表面上一点,以 p 点为球心构造一个半球,半球的方向为该点法线的方向,无需考虑负半球,其无法对 p 点造成遮蔽。

构造随机的入射光线是比较困难的,我们可以逆向处理,如:由 p 点发出N条光线,若由H条方向被遮蔽了,则我们认为该点的遮蔽程度为 HN ,我们也将接受到的光线比例称为ambient access.因此ambient access = 1.0 - HN

AO计算公式:
A(p,n)=1πΩV(w,p)max(wn,0)dw

p 表示表面上一点
Ω 表示以 p 点为球心的正半球,即法线指向的方向
n 表示 p 点的法线
w 表示半球体 Ω p 点发出光线的方向向量
V 表示可视函数

因此Ambient Occlusion的计算是通过对围绕着以 p 点为球心的半球 Ω 上的局部AO值进行积分得到,由此可见, V(w,p) 是一个二值函数,因为对于任意一条光线,要么对点 p 产生遮蔽要么不产生,因此取值只有0 , 1 。但实现起来这显然是不可能也不必要的。我们只需进行一部分采样来进行模拟得到

假设通过点 p 沿着半球 Ω 发出的一条光线,与物体相交于点 q ,但是假如点 q p 点太远时,我们可以认为点 q p 点并没有产生遮蔽,因此我们可以设置一个阀值(threshold value),当距离大于阀值时,认为不产生遮蔽作用

我们可以在进入着色器之前为每个顶点预先计算出其遮蔽值~~

伪代码如下:

        std::vector<UINT> VertexSharedCount(VertexCount); // 用于保存顶点被共享的次数,最终用于计算顶点的平均Ambient Accessfor(int i = 0; i < TriangleCount; i++){int i0 = indices[3 * i + 0];int i1 = indices[3 * i + 1];int i2 = indices[3 * i + 2];Vertex v0 = vertices[i0];Vertex v1 = vertices[i1];Vertex i2 = vertices[i2];Edge e1 = v1 - v0;Edge e2 = v2 - v0;normal = e1 * e2;center = (v0 + v1 + v2) / 3;for(int j = 0; j < SampleLightCount; j++){RayDirection = GenerateRandomVector();if(!octree.RayIntersect(center , normal)){UnOcclusionNum++;}}float access = 1.0f - (UnOcclusionNum / SampleLightCount);vertices[i0].access += access;vertices[i1].access += access;vertices[i2].access += access;VertexSharedCount[i0]++;VertexSharedCount[i1]++;VertexSharedCount[i2]++;}for(int i = 0; i < VertexCount; i++){vertices[i].access /= VertexSharedCount[i];}

这里写图片描述

这篇关于Ambient Occlusion的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999168

相关文章

Unity 性能优化之遮挡剔除(Occlusion Culling)(六)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、遮挡剔除是什么?二、静态遮挡剔除的使用步骤1.标记为遮挡剔除对象2.创建Occlusion Area组件3.烘焙4.Occlusion窗口Bake的参数Smallest OccluderSmallest HoleBackface threshold 5.遮挡剔除前后的效果对比没有开启遮挡剔除前:开启遮挡剔除后 三

Arnold材质节点篇-随机颜色抖动color_jitter、三平面triplanar、ambient_occlusion环境光遮蔽、curvature曲率

color_jitter 节点,可以设置模式是物体还是面,具体效果可以看下图:   【三平面triplanar】 在贴图的时候,由于模型形状,进行UV贴图的时候,发现贴图并不能很好的贴到模型上,三平面就是一个很好的方法。 checkboard,可以生成网格贴图到模型上查看贴图效果。 三平面适合不规则贴图的方法。 【光线切换Ray switch】  Ray_switch_

文献阅读笔记: Real-time Multiple Objects Tracking with Occlusion Handling in Dynamic Scenes ---by 香蕉麦乐迪

文献阅读笔记: Real-time Multiple Objects Tracking with Occlusion Handling in Dynamic Scenes ---by 香蕉麦乐迪 文章第一部分 摘要:强调了对于持续时间长,完全遮挡的物体,没有形态或者运动的先验知识也能比较好的处理。实测表明有良好的分割和跟踪效果,速度15-20fps,图像大小320*240 介绍: 文献【1

NSDI‘22 - Enabling IoT Self-Localization Using Ambient 5G Signals

计算机网络顶会无线通信类论文解读 NSDI'22 - Enabling IoT Self-Localization Using Ambient 5G Signals 计算机网络顶会无线通信类论文解读@[TOC](NSDI'22 - Enabling IoT Self-Localization Using Ambient 5G Signals) 1. 背景2. 定位原理2.1 无线定位的基本原

学习笔记:unity使用插件Post Processing处理后期效果入门(一)安装Ambient Occlusion

介绍 Post Processing插件是unity对场景进行后期处理的插件,可以在不使用代码的情况下模拟相机和电影的视觉效果的质感,从而大大的提升场景的视觉效果。 安装 Window–Package Manager–左侧列表上方切换到Unity Registry并搜索Post Processing–点击install安装 使用(2019.4 LTS) 1.在场景中创建空物体,挂载Pos

在unity里实现Hi-z occlusion

先看效果: 可以看到,随着相机的移动,被相机平截头和深度遮挡的物体,就会被剔除。因为考虑到计算精度的问题,所以也会有个别物体漏过去,这个只能暂时忽略。 hi-z算法流程如下: 1、使用上一帧场景深度buffer,构造分层深度图像 hi-z map.这些分层图像实对深度缓冲区进行mip-map,每个mip级别中,包含此块中的最大深度值 2、将当前待绘制的物体分为两个集合:集合1,上一帧已