标签:fragment testing depth shader Early Depth test
原文地址:https://zhuanlan.zhihu.com/p/72956611
先抄下来,以防忘记
Early Depth testing
正常情况下,depth testing(深度测试)是在屏幕空间进行的,是在fragment shader运行后,stencil testing运行后。
现在大部分GPUs支持Early Fragment Test也称为Early Depth Testing(提前深度测试),这是一种硬件特性。Early depth testing允许在fragment shader运行前进行depth test。只要一发现某个fragment不可见,则丢弃它,不再运行相应的fragment shader。这是一种性能优化。
使用early depth test硬件特性的最有效的方法是提前运行一个pass,即提前运行一条特殊的渲染管线(pre-processing pass),这条渲染管线只用来写入depth buffer,其中Vertex Shader除也变换顶点位置别的啥也不干,Fragment Shader直接不存在。
另外,在OpenGL中强制开启early depth test的方法是使用一个特殊的带有以下layout qualifier的fragment shader:
layout(early_fragment_tests) in;
这也会使stencil test提前发生。
注意: Early depth testing的一个限制是:不能写入fragment的depth value。如果一个fragment shader会写入depth value,则early depth testing无法使用,OpenGL将不能提前计算出depth value。
另外,在OpenGL中深度测试默认是关闭的,需要手动打开 :
glEnable(GL_DEPTH_TEST);
在打开深度测试的情况下,可以通过设置depth mask,禁止写入depth buffer而使用read-only depth buffer:
glDepthMask(GL_FALSE);
除了depth test外,其实现代GPUs也允许一些别的测试提前于fragment shader发生,比如: stencil test、The pixel ownership test、scissor test(OpenGL4.2起最后两个总是提前发生)。
标签:fragment,testing,depth,shader,Early,Depth,test 来源: https://www.cnblogs.com/dragon2012/p/14457158.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。