25.10. Depth Test

The depth test conditionally disables coverage of a sample based on the
outcome of a comparison between the fragment’s depth value at the sample
location and the sample’s depth value in the depth/stencil attachment at
location
$(x_f,y_f)$
. The comparison is enabled or disabled with
the depthTestEnable member of the
VkPipelineDepthStencilStateCreateInfo structure. When disabled, the
depth comparison and subsequent possible updates to the value of the depth
component of the depth/stencil attachment are bypassed and the fragment is
passed to the next operation. The stencil value, however, can be modified as
indicated above as if the depth test passed. If enabled, the comparison takes
place and the depth/stencil attachment value can subsequently be modified.

The comparison is specified with the depthCompareOp member of
VkPipelineDepthStencilStateCreateInfo. Let
$z_f$
be the
incoming fragment’s depth value for a sample, and let
$z_a$
be
the depth/stencil attachment value in memory for that sample. The depth test
passes under the following conditions:

VK_COMPARE_OP_NEVER: the test never passes.

VK_COMPARE_OP_LESS: the test passes when
$z_f \lt z_a$
.

VK_COMPARE_OP_EQUAL: the test passes when
$z_f = z_a$
.

VK_COMPARE_OP_LESS_OR_EQUAL: the test passes when
$z_f \leq z_a$
.

VK_COMPARE_OP_GREATER: the test passes when
$z_f \gt z_a$
.

VK_COMPARE_OP_NOT_EQUAL: the test passes when
$z_f \neq z_a$
.

VK_COMPARE_OP_GREATER_OR_EQUAL: the test passes when
$z_f \geq z_a$
.

VK_COMPARE_OP_ALWAYS: the test always passes.

If depth clamping (see Primitive Clipping) is
enabled, before the incoming fragment’s
$z_f$
is compared to
$z_a$
,
$z_f$
is clamped to
$[\min(n,f), \max(n,f)]$
, where
$n$
and
$f$
are the minDepth and maxDepth depth range values
of the viewport used by this fragment, respectively.

If the depth test fails, the sample’s coverage bit is cleared in the
fragment. The stencil value at the sample’s location is updated according to
the function currently in effect for depth test failure.

If the depth test passes, the sample’s (possibly clamped)
$z_f$
value is conditionally written to the depth framebuffer attachment based on
the depthWriteEnable member of
VkPipelineDepthStencilStateCreateInfo. If depthWriteEnable is
VK_TRUE the value is written, and if it is VK_FALSE the value is
not written. The stencil value at the sample’s location is updated according
to the function currently in effect for depth test success.

If there is no depth framebuffer attachment, it is as if the depth test
always passes.