Звучит как ошибка драйвера. Если вы видите результаты для фрагментов, которые должны были находиться за пределами области просмотра (то есть: если отключение записи глубины приводит к полному исчезновению фрагментов), то это противоречит поведению спецификации.
Конечно, это такой угловой случай, что я сомневаюсь, что кто-нибудь собирается с этим что-нибудь сделать.
Большинство графического оборудования старается изо всех сил стараться избегать фактически обрезающих треугольников. Обрезание треугольников означает потенциально генерирование 3+ треугольников из одного треугольника. Это имеет тенденцию душить трубопровод (во всяком случае, предварительная тесселяция). Поэтому, если треугольник не является тривиально отклоняемым (то есть: за пределами рамки клипа) или невероятно большими, современные графические процессоры просто игнорируют его. Они позаботятся об оборудовании для отбраковки фрагментов.
В этом случае, поскольку ваш фрагментный шейдер является шейдером глубокой записи, он считает, что не может отклонить эти фрагменты, пока ваш фрагментный шейдер не завершит работу.
Примечание: я понял, что если вы включите ограничитель глубины, это отключит ближнее и дальнее ограничение полностью . Который может быть тем, что вы хотите. Значения глубины, записанные из фрагментного шейдера, привязаны к текущему glDepthRange
.
Ограничение глубины является функцией OpenGL 3.2, но NVIDIA поддерживает его уже почти десятилетие с помощью NV_depth_clamp. А если у вас последние версии драйверов, вы сможете использовать ARB_depth_clamp, даже если у вас нет контекста совместимости 3.2.