技术标签: 图形学 unity3d shader实战练习 Graphic Tips 优化 渲染 EarlyZ
在前向渲染中,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
1. 动态页面的渲染方式1.1 服务器渲染数据和页面结合的工作, 通过服务器完成.相当于 客户端 发送 HTTP 请求,带上参数. 服务端根据请求取计算响应,然后拼装成完整的 HTML 返回 HTTP 响应给客户端.1.2 客户端渲染服务器把数据返回给浏览器, 由浏览器把数据和页面结合起来.浏览器和服务器之间的数据往往交互通过 ajax 进行, 数据的格式往往使用 JSON1.3 服务端渲染示例示例1: 通过字符串拼接出HTMLimport javax.servlet.ServletE
今天,一搞Android开发的同事问题external “C”是干嘛的? 我说:就是为了让C++能够使用C语言编程的类或函数,按照C语言的方式编译。估计他是没懂我的意思,可能我也不能说清楚这是什么东西。 找了一个博客参考: http://www.jianshu.com/p/5d2eeeb93590引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C+
新钛云服已为您服务1382天介绍:服务网格是处理服务间通信的基础设施层。它负责构成现代云原生应用程序的复杂服务拓扑来可靠地交付请求。Istio 是迄今为止最受欢迎的服务网格,因为它有非常...
1、问题描述org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘springSecurityFilterChain’ defined in class path resource [org/springframework/security/config/annotatio...
写在前面:如题,这篇博文主要是总结一下如何将Shiro运用到实际项目中,本来准备将Shiro整到Spring中就行了,后来想想既然要整,就索性把SpringMVC和MyBatis也整进去吧,整个比较完整的,也能帮助更多的初学者。所以本文实际是将Shiro整到SSM中(基于maven)。其实Shiro整合到Spring中并没有想象的那么困难,整到Spring中后,我们自定义的realm啊、se
[[email protected] ~]# git clone https://github.com/edp963/davinci-docker.git正克隆到 'davinci-docker'...fatal: unable to access 'https://github.com/edp963/davinci-docker.git/': Encountered end of file[[email protected] ~]# git config --global http.proxy[[email protected].
mysql Slave_IO_Running:NO(解决方法)Master slave 复制错误Description:Slave_IO_Running:NOSlave_SQL_Running:YesSeconds_Behind_Master: NULL本人遇到的Slave_IO_Running:NO的情况有下面两种:1. 在配置slave同步时因为slave访问master没有权限导致;2. m...
系统:win10软件编辑和程序下载平台:Quartus II仿真平台:modelsimFPGA:EP4CE61 Qsys是Quartus中系统集成工具第一代:SOPC:system on programmable chip可编程片上系统第二代:Qsys第三代:platform Design作用是:通过集成IP和快速实现SOPC系统自动创建IP核之间的互联逻辑自定义IP核2 ...
开发过程中使用API可以节省时间,这里有几十个API,它们可以在Flex, Flash和AIR中使用。Adobe APIscorelib, mappr, flickr, youtube and more.http://labs.adobe.com/wiki/index.php/ActionScript_3:resources:apis:librariesAPE (Actio...
SSM整合案例参考狂神!!!!1.环境:IDEA 2020.1.3MySQL 8.0.25Tomcat 9Maven 3.62.搭建数据库CREATE DATABASE `ssmbuild`;USE `ssmbuild`;DROP TABLE IF EXISTS `books`;CREATE TABLE `books` (`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',`bookName` VARCHAR(100)
ContentProvider类主要方法的作用:public booleanonCreate()该方法在ContentProvider创建后就会被调用, Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。public Uriinsert(Uri uri,ContentValues values)该方法用于供外部应用往ContentProvi
编程题1076 Forwards on Weibo (30 分)Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is forme...