После долгих экспериментов я наконец нашел проблему. Матрица перспективы, которую я генерировал, имела ноль в качестве 16-го элемента массива (другими словами, положение [4,4] в матрице X, Y, Z, W), что приводило к сглаживанию значений глубины.
Я генерировал свою перспективную матрицу с помощью twgl. Не уверен, почему реализация работает так (мне кажется, это ошибка):
_public.perspectiveMatrix = twgl.m4.perspective(_public.POV, width/height, 0.0, 100);
Это было проблемой, так как я устанавливал позицию в вершинном шейдере следующим образом:
gl_Position = perspectiveMatrixUniform * viewMatrixUniform * vec4((matrixUniform * vec3(position.xy, 1.0)).xy, (intensity.r + intensity.g + intensity.b)/3.0 + 0.01, 1.0);
Если я добавлю следующую строку сразу после инициализации матрицы перспективы, все будет работать как положено:
_public.perspectiveMatrix[15] = 1.0;