网上关于SSAO渲染介绍的很多,本篇博客也是将现有算法应用到我们自己研发的3D引擎中,SSAO被称为屏幕空间环境光遮蔽,它的原理是:对于铺屏四边形(Screen-filled Quad)上的每一个片段,我们都会根据周边深度值计算一个遮蔽因子(Occlusion Factor)。这个遮蔽因子之后会被用来减少或者抵消片段的环境光照分量。遮蔽因子是通过采集片段周围球型核心(Kernel)的多个深度样本,并和当前片段深度值对比而得到的。高于片段深度值样本的个数就是我们想要的遮蔽因子。

SSAO的整体流程示意图:
1、渲染场景中的物体到G-Buffer;
2、利用G-Buffer中的数据,通过TBN矩阵,将采样点从切线空间,变换到视图空间,并在这个空间比较并计算SSAO的值,并写入AmbientOcculction;
3、对AmbielntOcculction Texture进行模糊处理,去掉噪声;
4、利用AmbielntOcculction Texture 获得正确的环境光照遮蔽效果。
根据以上原理我们实现出SSAO的Shader脚本,实现的代码如下所示:

在第2步中,我们需要采样点,在Shader代码中,使用了for循环64次采样,我们的采样是在切线空间进行的,这也是为了统一处理,最后,计算采样实际位置,再将它们变换到视空间中。这样才能和存储在G-Buffer里面的深度信息进行比较。用采样点的深度值,去和屏幕空间的深度值去比较作为是否被遮挡判断依据。我们在Shader代码中实现了计算采样点深度值和采样点深度值的平滑插值。下面我们再看看在引擎中的C++代码实现如下所示:

引擎中的代码跟上篇博客中的Deferred延迟渲染类似,我们在引擎中实现的测试效果图如下所示:

在引擎中最终渲染效果如下图所示:

总结:
SSAO算法在网上很多人为此写过,但是都没有介绍如何在引擎实现,我们要将单个的知识点整合应用到引擎中,这样就可以实现一个渲染系统,积少成多,逐步完善就形成了一个渲染引擎。

聊聊引擎底层如何实现SSAO渲染相关推荐

  1. 聊聊引擎底层如何实现Bloom渲染算法

    Bloom渲染是游戏中常用的,在Unity和UE4中也有Bloom渲染算法如果我们自己实现Bloom渲染算法,该如何实现呢?网上关于Bloom的实现算法讲述的也比较多,但是我们本篇实现的Bloom渲染 ...

  2. 聊聊引擎底层如何实现BRDF渲染算法

    BRDF作为比较流行的渲染算法,但凡成熟的引擎的都有此功能,我们自己写引擎也不例外,我在编写引擎时也会参考网上的一些资料,这也是学习的过程,先介绍BRDF,它是双向反射分布函数,说白了它是对于物体表面 ...

  3. Scratch上传作品加载之分析(封面获取),base64转blob 前后端方案,前端 后端 解析base64为Blob,2021年较底层进行sb3作品渲染

    采坑的初衷: 考虑到作品的私有性.用户上传的作品必须是私有的,当且仅当用户设置作品公开 (理论上得提交给管理员,进行审核,管理员进行操作).那么才能够通过projectHost的方式去请求. 也就是说 ...

  4. 虚幻引擎学习之路:渲染模块之光照系统

    原文链接:https://blog.uwa4d.com/archives/Study_unreal4_Rendering_1.html 写在前面 "UWA什么时候可以支持Unreal引擎?& ...

  5. [引擎开发] 深入GPU和渲染优化(基础篇)

    GPU/渲染优化是引擎开发中非常重要的一个环节,实际上在工程中做任何渲染相关的内容,都需要考虑到背后的原理和性能.另一方面,GPU/渲染优化是一个非常宽泛的课题,它不仅涉及到针对底层GPU的架构做出的 ...

  6. opengl游戏引擎源码_跨平台渲染引擎之路:拨云见日

    前言 最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果,因此萌发了想要自己从0开始打造一个渲染引擎的念头,一方面是为了更好地实现公司业务的需求,另一方面则是可以学到整个渲染流水线上的方 ...

  7. 3D游戏引擎底层数据结构的封装之Array

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  8. 计算机底层存储,图引擎底层存储的设计与实现-计算机工程.PDF

    图引擎底层存储的设计与实现-计算机工程 第40 卷 第11 期 计 算 机 工 程 2014 年11 月 Vol.40 No.11 Computer Engineering November 2014 ...

  9. 虚幻引擎学习之路:渲染模块之全局光照明

    虚幻引擎学习之路:渲染模块之全局光照明 https://zhuanlan.zhihu.com/p/31791392 原文链接:虚幻引擎学习之路:渲染模块之全局光照明 - UWA Blog 之前UWA为 ...

最新文章

  1. CSS完美兼容IE6/IE7/IE8/IE9/IE10的通用方法
  2. 自定义下拉列表(使用原始的事件监听机制),在搜索框中使用
  3. 酷炫Jquery收集
  4. python登录网页版微信发送消息
  5. 再见,RabbitMQ,你好,Kafka!
  6. 批量下载baidu音乐主页的歌曲
  7. 洛谷 P2765 魔术球问题 解题报告
  8. STC51-数码管显示
  9. 黄渤高情商:小S和林志林同时掉到水里,你先救谁
  10. Windows Phone开发(6):处理屏幕方向的改变 转:http://blog.csdn.net/tcjiaan/article/details/7273107...
  11. 关于HAL.DLL文件丢失导致系统无法启动的问题
  12. 2.mongoDB 命令
  13. ConurrentHashMap和Hashtable的区别
  14. Spring Cloud Zuul路由网关(学习总结)
  15. vue 引入json地图_前端学习 之 Vue 引入Echarts地图
  16. spss20安装许可证代码_SPSS 22下载安装教程
  17. .webp格式图片详解
  18. 全球股市币市同迎黑色一天 熊市持现金或是王道 | 链塔快评
  19. 使用java调用阿里云车牌识别API
  20. PCIe扫盲——PCIe总线怎样做到在软件上兼容PCI总线

热门文章

  1. 黑马程序员pink老师前端h5(html5)+css3(16)P94-P104伪类选择器上并集选择器子选择器后代选择器emmet语法生成标签快速格式化代码复合选择器简介
  2. 带AI的俄罗斯方块源码
  3. hcna学习小结第一天
  4. 【Java】巩固基础,温故知新——程序逻辑控制
  5. Windows 系统安装
  6. 彻底分清机器学习中的上采样、下采样、过采样、欠采样【总结】
  7. systemd的日志存在哪里?
  8. Ubuntu 16.04 tf-faster-rcnn 在CPU下训练数据
  9. 协议 驱动 接口 服务器,TCP/IP 协议底层驱动原理 (含网卡芯片读写) 说明 [撸 swoole 和 workerman 的同学建议瞧瞧]...
  10. 记一次失败的实战渗透