[爱心] 您好,就是关于Early-Z导致的深度数据冲突还是有点没懂。。。能麻烦解释一下吗 可以点开原文的链接结合图示来看,这样清晰一些。这里说的是Z Test只有fragment shader之前有一次,fragment shader之后不再进行Z Test的情况下,如果同时有多个core在对这同一像素位置的fragment进行计算,就可能产生深度数据冲突 你好,这个原文之前就有看过,就是因为对原文的理解尚不成熟,来这里请教一下各位前辈。不过对于书上的理解,我的理解是这样的,如果我的理解有错误,还希望能一起讨论一下,感谢。
首先书上说的是,当深度为5时候通过了测试即将写入Frame Buffer,而深度值10刚好处于Early-Z阶段,我个人感觉不可能一个模型上的同一个像素会存在两个深度,这里应该说的是模型上不同的像素点,
文章上的说明我的理解是:当5已经通过了深度测试,但是此时并没有写入深度缓冲中,此时深度缓冲中这个像素的深度还是15。然后深度为10的因为深度小于15就会覆盖掉之前像素为5的颜色数值。这里我认为笔者要强调的是多core运行的时候,因为深度写入不及时导致的出错。这就是书上说的解决方案中,为什么要在后面还要加一个深度测试的过程。。。
现在的问题就是,如果把深度缓冲阶段移到fx之后,我个人理解按照文章上的说明,依然也有可能出现类似的情况。因为如果移动到fx后面,深度检测还没有进行。其深度缓冲中的深度还是没有变化的,如果也是多core操作,也会出现之前的问题。但很显然这种优化之前可编程的渲染管线的流程是不会出现这种错误的,错误仅仅是因为early_Z导致的。这是我现在有点迷糊的地方。也有可能是我对以往的某个知识点掌握还不是很透彻,理解有误,还希望前辈不吝赐教 我的理解来看你是认为比如深度10在2nd Z Read阶段,而深度5在2nd Z Test时依然会出现问题吧。但实际上这种情况不会发生的,会存在一个读写锁,在一个core访问这段内存的时候另一个core就不会进行读写,可以参考一下这个简短的回答CPU和GPU内存访问会冲突吗?,不过这种相当底层的内容我也不是非常确定就是了 书上的原话:假设数值深度值5已经经过Early-Z即将写入Frame Buffer,而深度值10刚好处于Early-Z阶段,读取并对比当前缓存的深度值15,结果就是10通过了Early-Z测试,会覆盖掉比自己小的深度值5
我个人认为在深度测试的时候访问内存,无非就是读取深度缓存,深度对比和写入深度缓存,然后书上的图是这样的
个人认为文章里想表达的意思是这个像素为5的刚好是过了z test但是还没有到达z write,中间还有两个testure mapping 和 alpha test但是还没有到达z write的时候,这个时候恰好深度为10的和深度缓存里为15的进行了对比。结果把深度为5的给覆盖掉了。
如果在fx之后的话,因为在正常的渲染管线之后已经没有testure mapping 和 alpha test两个过程,就不会存在上述的情况。因为深度读取和测试之后直接就写入了。。。
[图片] 不知道我理解的对不对,希望能听取您的理解,感谢 嗯,差不多就是这样[棒] if for这些对GPU性能的影响包含register等占用过多导致并行度下降,4个pixel一起处理很大原因是因为要算DDX这些偏导函数
页:
1
[2]