这章讲到了可见性在逐像素渲染光照场景中的作用,也考虑如何使用可见性减少必须渲染的批次数量,从而改善性能。

假设一个非常简单的场景,一个房间,因为房间的不同部位是不同的材质,所以将其分为8个batch,另外在房间中还有3个不同的模型,每个模型又分成两个batch,房间里还有3个光源。

对于此场景,为了建立场景的深度值和应用环境或发射光照,必须将所有的batch渲染一次,即 8 + 3*2 = 14.针对每个光源,为阴影要渲染一次,为真实的光照再渲染一次,因此这个简单场景所需的总批次为:14 +  14 * 3 + 14 * 3 = 98.

如下伪代码说明在一个场景中必须渲染的批次数:

For each visible objectFor each pass in the ambient shaderFor each visible batch in the objectRender batch
For each visible lightFor each visible shadow casterFor each pass in the shadow shaderFor each shadow batch in the objectRender batchFor each lit visible objectFor each pass in the light shaderFor each visible batch in the objectRender batch

正如伪代码所述,为了减少批次数,可以进行一些与非可见性相关的优化。最应该优化的是渲染每个光照所必须的通道数。批次数随通道数线性增加,因此,我们应该最小化受限于CPU的游戏通道数。

我们可以使用可见性来减少批数。其中,为了减少批次,各个部分(可见部分、光源部分、光照部分、阴影部分)的集合分开讨论并生成。

  • 可见集合:由摄像机的视点可见的所有物体组成,定义为V。
  • 光源集合:由光源位置作为视点出发,光源可见物体的集合L。
  • 照明集合:V和L的交集I,即既在摄像机可见,又能接收到光源光照。
  • 阴影集合:L的一个子集S,它包括向可见区投射阴影的所有物体。如下图所示,V视椎外的shadow Caster投射的阴影确在V中,这个shadow caster就属于集合S

对于集合S如何确定,本文介绍了convex hull(光源的凸包)如何计算,如下图所示:

可见性不仅能有效改善CPU的性能,也同样可以改善GPU的性能。对模板体执行逐像素光照时,填充率的消耗(模板体的填充或多次渲染大的物体)很快就变成了瓶颈,但可以使用剪切矩形(scissor rectangle)限制显卡渲染的面积,解决此问题。(这段没太看懂)

逐像素的照明需要大量的批次数和极高的填充率,所以要减少渲染的物体数和它们影响的屏幕面积。而使用这章中介绍的标准可见性算法和技术,可以充分改善运行性能。

GPU Gems1 - 15 逐像素光照的可见性管理相关推荐

  1. 在场景中添加光线——给光线添加更高的细节:逐像素光照

    问题 在前两个教程中,是在每个顶点中计算明暗程度,对三角形的每个像素需要对这个值进行插值.所以这叫做逐顶点光照(per-vertex lighting,又叫做高洛德着色,高洛德浓淡Gouraud sh ...

  2. 【GLSL教程】(七)逐像素的光照

    逐像素的方向光(Directional Light per Pixel) 这一节将把前面的shader代码改为逐像素计算的方向光.我们需要将工作按照两个shader拆分,以确定哪些是需要逐像素操作的. ...

  3. 如何在unity的前向渲染路径ForwardBase中同时使用逐顶点和逐像素光源

    前言:问题来自于<Unity Shader入门精要>中,第195页.书中给出了如何在forwardbase和forwardadd中计算逐像素光照,并没有给出如何同时进行逐顶点的光照,因此当 ...

  4. GPU Gems2 - 8 使用距离函数的逐像素位移贴图

    [章节概览] 距离贴图(distance map)是一种在像素着色器中给对象添加小范围位移映射的技术.这章中详细介绍了使用距离函数的逐像素位移贴图(Per-Pixel Displacement Map ...

  5. GPU Gems1 - 2 水刻蚀的渲染

    2.1 引言 光线从弯曲的表面反射或折射,因此只聚焦在受光面上的某些区域,于是就产生了刻蚀现象.本文从美学角度出发,不以纯物理的方式计算,使其很容易在大多数图形硬件上实现,效果又十分逼真. 2.2 刻 ...

  6. OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)

    目录 概述 1.指针访问 2.迭代器访问 3.at()函数访问 总代码 效果 参考资料 概述 访问图像像素值是图像处理的基本操作.OpenCV提供了很多访问方式,比较常用的三种方式:  (1) 通过指 ...

  7. OpenCV(二)逐像素的图像复制、图像边缘检测(自实现和API实现)

    目录 一.逐像素的图像复制 1.代码 2.效果 二.简单的图像边缘检测(自实现) 0.图像处理的卷积运算 1.简单模糊处理 2.强化边缘处理 1.原理 2.代码 3.效果 三.简单的图像边缘检测(调用 ...

  8. OpenGL perpixelgloss逐像素光泽度的实例

    OpenGL perpixelgloss逐像素光泽度 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <vmath.h> #inclu ...

  9. cv图像预处理——逐像素变换

    cv图像预处理--逐像素变换 标签:计算机视觉 逐像素变换 对图像中的每个像素逐个进行处理. 白化(类似于标准化) 白化的目的是要为图像的平均亮度水平和对比度提供波动的恒定性.其中每个像素进行如下转换 ...

最新文章

  1. centos php 局域网访问,CentOS8安装搭建php环境
  2. ctags,cscope,nerdtree,tmux 笔记
  3. 2021广州黄冈中学高考成绩查询,黄冈中学广州学校2019高考成绩喜报、本科重本上线人数情况...
  4. Mac SecureCRT解决中文乱码
  5. Map接口的实现类HashMap的操作
  6. 基于Maven的SSH框架搭建
  7. java递归统计_Java类递归计数
  8. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
  9. 我俩也组了个队,找到一个苹果RCE 0day,获 $5 万奖金
  10. 送给测试行业年轻人们的一些建议
  11. Trusted Execution Technology (TXT) --- 基本原理篇
  12. docker版MySQL升级
  13. c语言crc编码函数,C语言:CRC校验
  14. Visual Studio新特性:串口监视器和Zephyr支持
  15. 飞鱼CRM如何同步数据到第三方系统
  16. 与锤子手机HR的对话——创业没有联合创始人,CTO 等高管会把它当做自己的事业吗?...
  17. 阿里巴巴校招实习生一面记录
  18. mysql 分离 实时读_MySQL深入利用Ameoba实现读写分离
  19. Leetcode-数据结构-350. 两个数组的交集 II
  20. 标准版服务器配置文件是哪个,T+12.0标准版的服务器配置是什么样的??

热门文章

  1. oracle nowday,Java MonthDay now()用法及代码示例
  2. [蓝桥杯]算法提高 vertex cover(dfs)
  3. 微软 python教程_最强福利——来自微软的Python学习教程(开发指南)
  4. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...
  5. 【sklearn学习】逻辑回归
  6. oracle sequrnce_Oracle Sqlldr简单用法
  7. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别
  8. FCOS 基于FPN之上的完全Anchor Free检测框架
  9. [机器学习]LightGBM分布式使用完全手册
  10. 用SecureCRT实现真机跟虚拟机的文件传输