Direct3D9深度写入没有深度testing

在OpenGL和Direct3D11中,如果深度testing被禁用,深度写入将被禁用。 要在深度testing中启用深度写入,您必须始终启用深度func的深度testing。

OpenGL的

即使深度缓冲区存在且深度遮罩不为零,如果深度testing被禁用,深度缓冲区也不会更新。 为了无条件写入深度缓冲区,应该启用深度testing并将其设置为GL_ALWAYS(请参阅glDepthFunc)。

Direct3D11

DepthEnable和StencilEnable启用(和禁用)深度和模板testing。 将DepthEnable设置为FALSE以禁用深度testing并防止写入深度缓冲区。 将StencilEnable设置为FALSE以禁用模板testing并防止写入模板缓冲区(当DepthEnable为FALSE且StencilEnable为TRUE时,深度testing总是通过模板操作)。

我找不到有关d3d9的这种行为的任何文档。

在Direct3D9中,如果D3DRS_ZENABLE设置为D3DZB_FALSE且D3DRS_ZWRITEENABLE设置为TRUE,则深度缓冲区将写入?

我能find的最接近的答案是来自DXSDK文章“Depth Buffers(Direct3D 9)”; 相关的部分被提取(有些部分关于颜色缓冲区和w-缓冲区被删除):

在testing开始时,深度缓冲区中的深度值被设置为场景的最大可能值。 testing场景中的每个多边形以查看它是否与渲染表面上的当前坐标(x,y)相交。 如果是,则testing当前点的深度值,看它是否小于存储在深度缓冲区中的深度值。 如果多边形值的深度较小,则存储在深度缓冲区中。

这意味着深度缓冲区写入是深度testing本身的一部分,如果深度testing被禁用,则写入不会完成。

我可以匆匆做一个快速testing程序,但这当然只对我的硬件和驱动程序有效。 所以鉴于明显缺乏一个更明确的说法,我会倾向于玩的安全,并假设其行为是相同的D3D10 / 11和OpenGL – 毕竟,设置深度比较总是写入真实绝对保证以产生期望的结果,而依靠它在testing禁用的情况下进行编写,会让您置身于硬件供应商如何解释这种不幸的模糊的情况。

免责声明:我从来没有使用D3D9,只有D3D10 / 11和OpenGL。

请参阅D3DRENDERSTATETYPE枚举值和D3DCMPFUNC 。 具体来说,查看D3DCMP_ALWAYSD3DRS_ZENABLE设置为true,将其设置为D3DCMP_ALWAYS ,类似于GL文档所指示的那样。 另请参阅深度缓冲状态(Direct3D 9)