3.5 Early-Z 与 Z Prepass

news2024/11/28 19:04:48

一、深度测试DepthTest

1.传统渲染管线中的深度测试

深度测试在逐片元操作中的第二步

2.解决物体可见遮挡性的问题

3.深度测试的逻辑

for(each triangle T) //对每一个三角形	
{				
    for(each fragment(x,y,z) in T)//对每一个三角形中的片元 
    {	   	
        if(fragment.z < ZBuffer[x,y])//深度测试:如果片元深度小于ZBuffer深度
        {	
            FrameBuffer[x,y] = fragment.rgb; //更新颜色     
            ZBuffer[x,y] = fragment.z;		 //更新深度     
              
        }        
        else
        {					
            //深度测试失败        		
            //什么都不做,片元数据被丢弃       
        }    
    }
}

4.深度测试带来的问题

物体2与物体3的计算得到的片元都将会被丢弃

先将1、2、3进行片元着色后,在进行深度测试后抛弃2、3,则2、3在片元部分做的计算都浪费掉了。

二、提前深度测试Early-Z

应用阶段(CPU)->几何阶段(顶点着色器)->early-z(提前深度测试)->光栅化阶段(片元着色器)->各种测试(深度测试,透明度测试,模板测试等)->颜色缓冲区(buffer)

Early-Z失效:

1. 开启Alpha Test 或 clip/discard 等手动丢弃片元操作

2. 手动修改GPU插值得到的深度

3. 开启Alpha Blend

4. 关闭深度测试Depth Test

如果按照3-2-1顺序渲染测试,Early-Z将不会带来任何优化效果

三、使用Z-Prepass

方式一:双Pass法

  • 使用两个Pass:
    • 在第一个Pass即Z-Prepass中仅仅值写入深度,不计算输出任何颜色。
    • 在第二个Pass中关闭深度写入,并且将深度比较函数设置为相等。

动态批处理问题:

DrawCall问题:

方式二:提前分离的PrePass

  • 仍然使用两个Pass,但:
    • 将原先第一个Pass(即Z-Prepass)单独分离出来未单独一个Shader,并先使用这个Shader将整个场景的Opaque的物体渲染一遍。
    • 而原先材质只剩下元原先的第二个Pass,仍然关闭深度写入,并且将深度比较函数设置为相等。

例子:使用URP下的RendererFeature

Z-Prepass也是透明渲染的一种解决方案

单Pass不写入深度的透明渲染 第一Z-Prepass写入深度,第二Pass(Ztest Equal)透明渲染

四、Z-Prepass所带来的问题

Z-Prepass的计算消耗

五、Early-Z 和 Z-Prepass的实例应用

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

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

相关文章

IOC课程整理-13 Spring校验

1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件&#xff1f;

嵌入式项目电灯

1、原理&#xff0c;电灯有个正负极&#xff0c;当正确接入电源正负极就能点亮&#xff08;如正极5v,负极0v&#xff09;&#xff0c;单两边同时接入正极&#xff0c;就不会亮&#xff08;两端都是5v&#xff09;,所以通过控制电平&#xff0c;来实现控制led等的亮暗 cpu通过给…

Eclipse:编译前自动保存文件

Eclipse默认不会在编译前保存文件&#xff0c;所以有时修改了半天程序&#xff0c;但是忘记保存&#xff0c;结果编译报的问题与代码不一致&#xff0c;甚至调试半天才发现是文件没有保存&#xff0c;很是让人恼怒。 可以通过以下设置&#xff0c;让Eclipse在编译前自动保存文…

如何快速排查SSD IO延迟抖动问题?

一块固态硬盘设计背后&#xff0c;有硬件控制器&#xff0c;NAND闪存颗粒、DRAM&#xff0c;还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程&#xff0c;需要考虑各种客户需求且要保证可靠性、性能、稳定性。 针对SSD的相关性能测试&#xff0c;SNIA也有专门针对SS…

制作自己的前端组件库并上传到npm上

最近实现了自己的一个前端组件库demo&#xff0c;目前只上传了几个小组件。话不多说&#xff0c;上图&#xff1a; 我分了三个项目&#xff1a;yt-ui组件库、使用文档、demo。线上地址如下&#xff1a; [yt-ui组件库](mhfwork/yt-ui - npm) [组件库使用文档](介绍 | mhfwork/y…

自动化项目实战 [个人博客系统]

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

【云备份|| 日志 day1】项目认识 环境准备

day1 项目总纲云备份实现目标 搭建环境词汇解释 项目总纲 云备份 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。并且能够随时通过浏览器进行查看并且下载&#xff0c;其中下载过程支持断点续传功能&#xff0c;而服务器也会对上传文件进行热点管理&…

VScode远程连接错误:进程试图写入不存在的管道

使用VScode连接树莓派时&#xff0c;出现远程连接错误&#xff1a;进程试图写入不存在的管道 解决方案&#xff1a; &#xff08;1&#xff09;可以进入config所在文件夹&#xff0c;删除文件 &#xff08;2&#xff09;无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…

使用 Python 连接到 PostgreSQL 数据库

本文介绍了创建与 PostgreSQL 上的数据库的连接的过程。 我们需要安装 PostgreSQL 和创建数据库等先决条件&#xff0c;如下所述。 在系统中安装 PostgreSQL 顾名思义&#xff0c;PostgreSQL 是一款为高效管理数据库系统而创建的 SQL 系统软件。 在连接Python之前需要创建数据…

C字符串函数内存函数的模拟实现和理解

目录 1. 字符串操作函数 1.1. 求字符串长度 1.1.1. strlen 1.2. 长度不受限制的函数 1.2.1. strcpy 1.2.2. strcat 1.2.3. strcmp 1.3. 长度受到限制的字符串函数 1.3.1. strncpy 1.3.2. strncat 1.3.3. strncmp 1.4. 字符串查找函数 1.4.1. strstr 1.4.2. strto…

辅助驾驶功能开发-功能规范篇(22)-3-L2级辅助驾驶方案功能规范

1.3.3 TLA系统功能定义 1.3.3.1 状态机 1.3.3.2 状态迁移图 1.3.3.3 功能定义 1.3.3.3.1 信号需求列表 1.3.3.3.2 系统开启关闭 1)初始化 车辆上电后,交通灯辅助系统(TLA)进行初始化,控制器需在 220ms 内发出第一帧报文,并在 3s 内完成内部自检,同时上电 3s 内不进行…

wps表格按分隔符拆分单元格

有数据如下&#xff1b;看选中区域&#xff0c;一个单元格中有一个v&#xff0c;空格&#xff0c;然后有三个数值&#xff0c;以空格分开&#xff1b;点击菜单中的数据-分列&#xff1b; 弹出分列向导&#xff1b;选择 分隔符号&#xff1b; 选择分隔符为空格&#xff1b;出现预…

【vtk学习笔记1】编译安装vtk9.2.6,运行官方例子

一、编译安装vtk-9.2.6 1. 下载VTK。推荐从github下载。目前从VTK官网只能下载最新的RC版或者以前的老版本&#xff0c;我是在github上下载的vtk9.2.6 tag版本。 2. 用Cmake-gui配置Visual Studio工程。主要注意配置VTK安装的路径、是否支持QT&#xff0c;需要的话正确配置Qt5…

3.6 纹理压缩——包体瘦身术

一、什么是纹理压缩 纹理压缩是为了解决内存、带宽问题&#xff0c;专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。 二、为什么要纹理压缩 图片格式 图片格式是图片文件的存储格式&#xff0c;通常在磁盘、内存中存储和传输文件时使用。例如&#xff1a;JPG、PNG…

JAVA数据类型和变量

一、字面常量 常量即程序运行期间&#xff0c;固定不变,不可修改的量称为常量。 public class Demo{public static void main(String[] args){System.Out.println("hello world!");System.Out.println(100);System.Out.println(3.14);System.Out.println(A);System…

python项目之酒店客房入侵检测系统的设计与实现

项目简介 酒店客房入侵检测系统的设计与实现实现了以下功能&#xff1a; 1、控制台&#xff1a; 控制台是整个系统的首页面。在控制台中&#xff0c;酒店的客房管理人员能够在该页面中查看到当前的空余客房数量、当前在店的客房人数、当前的已用客房数量、当前酒店全部的客房…

【顺序栈的出栈,链栈的表示和实现,递归定义】

文章目录 顺序栈的出栈 链栈的表示和实现链表的初始化判断链栈是否为空链栈的入栈链栈的出栈 递归定义函数的调用过程 顺序栈的出栈 &#xff08;1&#xff09;判断是否栈空&#xff0c;若空则出错&#xff08;下溢&#xff09;。 &#xff08;2&#xff09;获取栈顶元素e。 &…

Java题:查找单链表中第 k 个节点元素的值

遇到过一道奇奇怪怪的Java题&#xff0c;就整理出自己的想法&#xff0c;不知道对不对&#xff0c;还望大佬们指导。 题目 给定一个单链表&#xff0c;查找单链表中第 k 个节点元素的值&#xff0c;同时要求使用时间复杂度低的算法实现。 单链表的定义如下&#xff1a; cla…

【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 吴恩达课程笔记——深度学习概论、神经网络基础 一、概念区别1.深度学习与机器学习2.深度学习与神经网络 二、什么是神经网络1.分类2.特点3.工作原理4.神经网络示意图5.神经网络进行监督学习6.深度学习的发展 三、…

mathtype怎么更改编号 mathtype章节编号错乱怎么办

mathtype作为一款功能强大的公式编辑器&#xff0c;使用范围广泛&#xff0c;与多款软件兼容。但新手可能会对mathtype的操作不熟悉&#xff0c;不知道如何在mathtype中更改编号&#xff0c;以及解决章节编号错乱问题。本文将围绕mathtype怎么更改编号&#xff0c;mathtype章节…