中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 7210|回复: 17

求解:Alpha test 与 early-z 冲突的原因

[复制链接]
头像被屏蔽
发表于 2011-5-18 14:43:04 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-18 15:22:27 | 显示全部楼层
回复 yg0313 的帖子

大牛,alpha-test不可能提前到Early-Z前面,永远在Pixel Shader后面。所以必然冲突。
头像被屏蔽
 楼主| 发表于 2011-5-18 15:59:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-18 16:22:35 | 显示全部楼层
大牛,大牛这个代码是discard pixel 。

因为硬件设计不能让Alpha test提前。

凡是在Depth Test之前能Fragment Culling的特性都会和Early-z有冲突,这也就不难解释在PS上discard pixel /Alpha Test 怎么会和Early-Z互斥了




http://www.cnblogs.com/OpenGPU/archive/2009/06/02/1494377.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2011-5-18 16:24:08 | 显示全部楼层
其实alpha test不一定和early z冲突。
early的要点在于能够预先干掉某一pixel block的ps的执行,本身是一个粗粒度的东西。就好比游戏里做view frustum culling一样——是在逐mesh的级别上而不是三角形的级别上。
既然这样,那么如果我要alpha test和early z兼容的话,可以这样做:在光栅化一个pixel block时,我记录每个三角形的zmin或zmax(被discard的像素不考虑在内),对于一个新的三角形我可以算出在这个三角形所有的像素都通过alpha test时的zmin或zmax,并根据z compare func来剔除。

当然这只是一种实现,而且不够精确(试想一个大的三角形上面只有少数几个像素通过alpha test),但这的确可以算是early z了。比较悲剧的在ps里修改了z,这样的三角形就无法在ps执行之前估计它的zmin/zmax了(哪怕是最糟糕的估计)。不过有次面试时碰到一原“黄埔军校”的哥们说ps写了z时也可以玩early z,解释了一通我没怎么明白,往知道的大牛点拨。

点评

是指某完美?  发表于 2011-5-18 16:38
发表于 2011-5-18 17:10:18 | 显示全部楼层
回复 Россия 的帖子

对,是个好办法。对于顶点提供的Alpha的确可以。不过纹理alpha和Shader计算出来的alpha就需要另外考虑了吧?
发表于 2011-5-18 17:15:04 | 显示全部楼层
回复 ic.expert 的帖子

果然强大,我还觉得他说的不可行呢,原来是顶点alpha...
发表于 2011-5-18 17:25:25 | 显示全部楼层
Россия 发表于 2011-5-18 16:24
其实alpha test不一定和early z冲突。
early的要点在于能够预先干掉某一pixel block的ps的执行,本身是一个 ...

关于ps里面修改Z,也可以EarlyZ,这个我也没听说过,也没查到论文…… 不知道什么NB技术,莫非是类似分支预测技术的Z值预测技术,哈哈哈
发表于 2011-5-18 17:28:32 | 显示全部楼层
回复 ic.expert 的帖子

再问一下,early z是个内部状态开关对吧?
对当前的一次绘制,发现early z不可用,那么没有clear之前,再绘制的时候为什么不能重新开启了?
不太了解GPU的流程,虽然大至的管线知道,请大牛解惑.
比如我的调用draw call,GPU只是先缓冲command,不立即绘制是吗?那么当他flush command buffer,不考虑自动合并的话,是分别draw的吧?
还有,设置渲染状态,GPU是否会flush command buffer?
我很想了解这方面的细节,有没有书可以推荐啊... 还是要我自己搜啊
头像被屏蔽
 楼主| 发表于 2011-5-18 19:16:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-18 21:23:44 | 显示全部楼层
yg0313 发表于 2011-5-18 19:16
我看了链接的那篇文章,N卡和A卡的一样吗?有没有技术文档?还有顶点alpha是怎么回事?求正解·· ...

大牛,关于顶点Alpha那个是学术讨论,和本主题要解决的问题关系应该不大 。N卡与A卡不完全一致,但是关于什么时候Disable Early-Z,N卡的条件和A卡是一样的。
头像被屏蔽
 楼主| 发表于 2011-5-18 21:31:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-18 21:33:22 | 显示全部楼层
yg0313 发表于 2011-5-18 21:31
回复 ic.expert 的帖子

嗯,前面说alpha-test在硬件设计上不能提前,是说在流水线中一定要在ps之后进行alp ...

大牛,因为discard pixel也会引起Early-Z失效……
头像被屏蔽
 楼主| 发表于 2011-5-18 21:36:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-19 09:37:49 | 显示全部楼层
alpha test就是discard pixel的一种特列,相当于在驱动在编译你的pixel shader的末尾加上
if (outputColor.a < refValue)
     discard;
头像被屏蔽
 楼主| 发表于 2011-5-19 13:40:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-5-19 16:39:56 | 显示全部楼层
本帖最后由 QSlash 于 2011-5-20 15:07 编辑

回复 ic.expert 的帖子

如果不能再PS里修改Z 那以前各种在PS阶段查找对应纹理的displacemapping方法不就都有Z值错误问题了,SV_Depth是修改Z值的吧
发表于 2019-1-28 16:51:17 | 显示全部楼层
本帖最后由 liyongnupt 于 2019-1-28 17:22 编辑

eary z 和alpha test 冲突一直没有弄懂,eary z 在raster之后,在ps之前,而alpha test在ps内做的,为什么会冲突?确实没搞懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2019-2-22 05:14 , Processed in 0.076188 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表