OpenGL
Проблемы с Z-буфером; 16-и бит недостаточно для получения нормального изображения. Что делать ?
16-битный Z-буфер - это не так плохо, как кажется. Если говорить коротко, то нужно искать компромисс между качеством картинки и дальностью обзора в виртуальном пространстве.
Проблема с Z-буфером заключается в Z-алиасинге (то есть ситуации, когда элементы более удаленных от наблюдателя объектов "пролезают" через более близкие объекты). Причина кроется в следующем: матрица проекции (GL_PROJECTION) размером 4x4 задается функций glFrustrum, и имеет следующий вид:
2 * near right + left ------------ 0 ------------ 0 right - left right - left 2 * near top + bottom 0 ------------ ------------ 0 top - bottom top - bottom -(far +near) -2 *far*near 0 0 ------------ ------------ far - near far - near 0 0 -1 0
Принципиальное значение для Z-разрешения имеют дроби, содержащие near и far - расстояние от глаза до экрана, и дальность обзора соответственно. Поскольку near обычно на 1-2 порядка меньше, чем far, можно сказать, что Z-разрешение определяется отношением far / near. Если это отношение больше, чем 2 в степени разрядность Z-буфера (2Z-bits), то depth test начинает работать неправильно. Например, если far=10,000, а near=0.1, отношение far / near=100,000 > 65,536 (216), и возникает Z-алиасинг.
В любом случае, число потерянных битов Z-буфера приближенно определяется по формуле Log2(far / near). Поэтому near никогда не должно быть 0 (однако