首页 > 解决方案 > HLSL 修改像素深度而不跳过 z 剔除

问题描述

我正在尝试编写一个基于光线跟踪的着色器,其中对于四边形的每个像素,我计算来自相机的光线的原点和方向,并测试与我的场景(当前是球体)的交叉点。

如果发生相交,我想将深度缓冲区值设置为相交的深度,而不是将其保留为四边形的深度,所以我正在写入 DEPTH。我知道这意味着我的像素着色器的早期 z 剔除将被禁用,因为在完成该像素之前无法确定我的像素是在前面还是后面。

然而,我的着色器的一个属性是深度总是比用于早期 z 剔除的深度更深,因此执行早期 z 剔除仍然有效,因为在四边形前面的东西是保证在射线相交处的前面。我隐约记得有一些方法可以通知渲染管道,尽管深度正在被修改,但它总是会被修改为更深,这将留下适当的优化,否则会被关闭。尽管谷歌搜索了很多,但我一直无法找到这是什么,有人知道它是什么吗?如果这实际上不存在并且我记错了,那么即使在像我这样的用例中,有没有办法强制启用早期 z 剔除?

标签: directxhlsldepth-bufferdepth-testing

解决方案


我找到了我正在寻找的解决方案。SV_DepthGreaterDX11 中的目标完成了这项工作。

在此链接中很难找到有关此功能和其他功能的说明:https ://mynameismjp.wordpress.com/2010/11/14/d3d11-features/


推荐阅读