关于EarlyZ

article/2025/8/22 9:00:39

在前向渲染中,ZTest是在Fragement Shader之后进行的,也就是说,被遮挡的部分也要绘制FS,就产生了Over Draw,其实很费,Early Z Culling就解决了这个问题

Early fragment tests, as an optimization, exist to prevent unnecessary executions of the Fragment Shader. If a fragment will be discarded based on the Depth Test (due perhaps to being behind other geometry), it saves performance to avoid executing the fragment shader. There is specialized hardware that makes this particularly efficient in many GPUs.

The most effective way to use early depth test hardware is to run a depth-only pre-processing pass. This means to render all available geometry, using minimal shaders and a rendering pipeline that only writes to the depth buffer. The Vertex Shader should do nothing more than transform positions, and the Fragment Shader does not even need to exist.

This provides the best performance gain if the fragment shader is expensive, or if you intend to use multiple passes across the geometry.

OpenGL Wiki上简单介绍了EarlyZ,是一个硬件功能,硬件会运行一个depth-only pre-processing pass,然后执行ZTest,把不可见的fragment discard掉

 

在intel这篇文章中https://software.intel.com/en-us/articles/early-z-rejection-sample

在软件层帮硬件生成更准确的ZBuffer ,为 front to back rendering 和 z pre-pass.

关于 back rendering requires

所有不透明的几何根据相机由近到远进行排序,先渲染近的FS,渲染到后面的被遮挡的就会被ZTest掉,此方法不需要额外的D3D API调用

这样的话不透明的物体由近到远画,半透明物体由远到近画,就没有问题

关于Z pre-pass

所有的不透明几何物体都要多走一个Pass,每个几何物体先写入一遍ZBuffer,使用一个空的FS,只执行简单的顶点着色器。之后会禁用ZWrite(关闭),开启ZTest,之后再走VS和FS,这样被挡住Fragment的FS就会被拒绝

Z pre-pass回增加不透明几何物体个Pass,在有些情况可能会更费,但是当FS是性能瓶颈时可以使用

 

ATI和NVIDIA也有相关说明,Early Z是一个硬件功能

 

在Applications of Explicit Early-Z Culling上说,ATI R300的EarlyZ,在PS执行前,是Check primitive的插值得到的Z而不是ZBuffer

同样不能在PS里面写入Z

 

在NVIDIA GPU Programming Guide,3.6节里讲到Nvidia的硬件 Early Z,不会渲染被挡住的部分,EarlyZ是默认启用的,但是不能Alpha Test&TexKill,也不能修改深度,,是为了让GPU可以用插值的深度值,下图为Gforce7的版本

 

下图是Gforce8&9的版本,写了两种方法,一种是粗糙的ZCull,一种是细粒度的EarlyZ,配合使用 Double-Speed Z-Only,可以做到ZPrePass也加速,又能避免FS的OverDraw

 

Alpha Test与Early Z

 

如果有Alpha Test就不会执行EarlyZ,

EarlyZ是在FS前写Z-Buffer,随后进行FS,只有深度等于/小于等于 ZBuffer的FS才可以被渲染,此时的深度是没有被Alpha Test Discard掉的部分fragment的Z-buffer,挡在后面的部分画不上去,所以有问题

这也是为什么说Alpha Test在部分显卡上会影响性能的原因,因为会使EarlyZ失效

在NVIDIA GPU Programming Guide8&9的版本里写到不会影响 coarse-z,但是会影响fine-grained z。

参考:

https://www.khronos.org/opengl/wiki/Early_Fragment_Test

https://software.intel.com/en-us/articles/early-z-rejection-sample

https://www.csee.umbc.edu/~olano/s2004c01/ch14.pdf

https://developer.amd.com/wordpress/media/2012/10/ShadingCourse2004_EarlyZ_Slides.pdf

https://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_G80.pdf

 

--------by wolf96 2018/12/14

 

 


http://chatgpt.dhexx.cn/article/aZ6TTTL6.shtml

相关文章

【EARLIER/EARLIEST函数】引用不存在的更早的行上下文 报错解决

引用PowerQuery的例子并给予个人理解 X1 SUMX(FILTER(Data,Data[订单日期]>EARLIER(Data[订单日期])),[金额])---WRONG X2CALCULATE(SUM(Data[金额]),FILTER(Data,SUMX(FILTER(Data,Data[订单日期]>EARLIER(Data[订单日期])),[金额])))---RIGHT X1报错原因&#xff1a…

EarlyStop

在训练中,我们希望在中间箭头的位置停止训练。而Early stopping就可以实现该功能,这时获得的模型泛化能力较强,还可以得到一个中等大小的w的弗罗贝尼乌斯范数。其与L2正则化相似,选择参数w范数较小的神经网络。 可以用L2正则化代…

Kafka 使用java api从指定位移消费 (从开头消费/从结尾消费)

一、auto.offset.reset值详解 在 Kafka 中,每当消费者组内的消费者查找不到所记录的消费位移或发生位移越界时,就会根据消费者客户端参数 auto.offset.reset 的配置来决定从何处开始进行消费,这个参数的默认值为 “latest” 。 auto.offset…

动态SQL之 where 标签

动态SQL之 where 标签 where和if一般结合使用: 1.若where标签中的 if 条件都不满足,则where标签没有任何功能,即不会添加where关键字 2.若where标签中的 if 条件满足,则where标签会自动添加where关键字,并将条件最前…

mybatis-动态sql

文章目录 1. 动态sql简述2. 动态sql示例 2.1 if2.2 choose2.3 foreach2.4 sql 及 include2.5 sql中的特殊字符3. 后台分页实现4. 数据版本号处理并发问题 1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL…

mysql动态sql拼接_动态SQL(拼接)

Q1:什么是动态SQL呢? A1:首先是SQL语句,是根据条件来拼接SQL Q2:为什么要用动态SQL? A2:因为在条件WHERE中出现OR会导致不能使用索引,从而使效率差别巨大。 例如:如图1、2, 图(1) 图(2) Q3:怎么样使用动态SQL? A3: 存储过程Proc_Test是没有采用拼接的:CREATE PROC…

Mybatis学习之动态Sql

目录 1. 什么是动态Sql 2. 动态Sql需要学习什么 3. 动态Sql之《if》 4. 动态Sql之《where》 5. 动态Sql之《foreach》 6. 动态Sql之《sql》 7. PageHelper分页插件的使用 1. 什么是动态Sql 答案:动态Sql指的是,Sql语句是变化的,不是固…

Mybatis 动态SQL

Mybatis 动态SQL 一 .动态SQL 数组 array 使用foreach 标签 <!-- mybatis的集合操作知识点: 如果遇到集合参数传递,需要将集合遍历标签: foreach 循环遍历集合标签属性说明:1.collection 表示遍历的集合类型1.1 数组 关键字 array1.2 List集合 关键字 list1.3 Map集…

Mybatis动态SQL解析

文章目录 1 为什么需要动态SQL&#xff1f;2 动态标签有哪些?3 举例说明ifchoose (when, otherwise)trim (where, set)foreach 1 为什么需要动态SQL&#xff1f; 看一段Oracle存储过程代码&#xff1a; 由于前台传入的查询参数不同&#xff0c;所以写了很多的if else&#x…

Java MyBatis动态SQL

&#x1f9ed;MyBatis学习 &#x1f389; 内容回顾 Java MyBatis的介绍及其执行原理 Java MyBatis配置详解 Java Mybatis中使用Junit进行测试_程序员必备 Java MyBatis的使用 &#x1f4e2;今天我们进行 Java MyBatis动态SQL 的学习&#xff0c;感谢你的阅读&#xff0c;内容若…

mysql动态SQL用法

顾名思义“动态”SQL就是不固定的SQL&#xff0c;根据不同的条件把SQL语句进行拼接&#xff0c;来实现对数据库更加精准的操作。可以通过配置文件或者注解的形式实现&#xff0c;多用于多条件联查。 xml版&#xff08;配置文件&#xff09;&#xff1a; xml版的动态SQL 接…

动态SQL标签

所谓的动态SQL&#xff0c;本职还是SQL语句&#xff0c;只是可以在SQL层面&#xff0c;去执行一个逻辑代码 动态SQL就是在拼接SQL语句&#xff0c;我们只要保证SQL的正确性&#xff0c;按照SQL的格式&#xff0c;去排列组合。 建议&#xff1a; 先在MySQL中写出完整的SQL&am…

MyBatis动态SQL

文章目录 前言一、\<if\>标签二、\<where\>标签三、\<trim\>标签四、\<set\>标签五、\<foreach\>标签五、\<sql\>标签 与 \<include\>标签 前言 动态sql是Mybatis的强大功能特性之一&#xff0c;能够完成不同条件下的sql拼接 以上…

动态SQL

动态SQL 在项目开发中&#xff0c;动态SQL可以解决很多不确定因素导致的SQL语句不同的问题。动态SQL可以简单高效的进行编码。在接下来的案例中进行认识和学习动态SQL。 动态SQL只是在原有的SQL语句中进行细微修改。案例贴合实际&#xff0c;编码简单易懂 文章目录 动态SQL一、…

动态 SQL

文章目录 一、学习目的二、动态 SQL 中的元素三、条件查询操作四、更新操作五、复杂查询操作1.foreach 元素中的属性2.foreach 元素迭代数组3.foreach 元素迭代 List4.foreach 元素迭代 Map 一、学习目的 在实际项目的开发中&#xff0c;开发人员在使用 JDBC 或其他持久层框架…

第3章 动态SQL

目录/Contents 第3章 动态SQL学习目标掌握MyBatis中动态SQL元素的使用掌握MyBatis的条件查询操作掌握MyBatis的更新操作掌握MyBatis的复杂查询操作 学习内容1 动态SQL中的元素1.1 使用动态SQL的好处1.2 动态SQL常用元素 2 条件查询操作2.1 \<if>元素2.2 \<choose>、…

Mybatis的特性详解——动态SQL

Mybatis的特性详解——动态SQL 前言一、动态sql的元素1.MyBatis if标签&#xff1a;条件判断2.MyBatis choose、when和otherwise标签3.MyBatis where标签4.MyBatis set标签5.MyBatis foreach标签6.MyBatis bind标签7.MyBatis trim标签仰天大笑出门去&#xff0c;我辈岂是蓬蒿人…

Java编程基础八股文(背诵版)

Java语言具有哪些特点&#xff1f; Java为纯面向对象的语言。它能够直接反应现实生活中的对象。 具有平台无关性。java利用Java虚拟机运行字节码&#xff0c;无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译&#xff0c;编译后的程序可在其它平台运行。 Java为…

Java编程基础篇

目录 计算机、程序和Java概述计算机组成 基本程序设计标识符数值数据类型格式化控制台输出输入输出重定向输入重定向输出重定向输入输出重定向方法重载变量的范围 数组声明数组变量创建数组初始化数组可边长参数二维数组静态变量、常量和方法静态变量 限定字符串StringBuilder和…

Java 基础编程入门

一、什么是Java Java是一种编程语言二、应用场景 非windows平台下互联网环境的开发首选三、Java语言特点 1、应用面广 2、简单易学(相对于C/C) 3、面向对象(更符合我们看待事物的特点) 4、跨平台(一处编译&#xff0c;处处运行) 5、多线程(提升系统性能) 单线…