Моя глубина рендеринга openGL почти равна 1, почему это так?
Я делаю некоторые основные вещи
1) рассчитать мою позицию
2) сохранить его в "gl_Position"
3) затем я сохраняю свою глубину в vec2 на основе информации о моей позиции
gl_Position = vec4( vVertexPos, 1 ) * mMVP;
vDepth = gl_Position.zw;
vDepth - переменная выше в моем шейдере, которую я передаю своему фрагментному шейдеру
out vec2 vDepth;
в фрагментном шейдере я сохраняю глубину фрагмента в gl_FragDepth
gl_FragDepth = vDepth.x / vDepth.y;
все мои значения глубины близки к значению 1. Я делаю что-то неправильно? Могу ли я пропустить шаг, который даст мне мои линейные значения глубины? когда я вычисляю информацию о моей камере, мое ближнее отсечение составляет 0,01, а мое дальнее отсечение составляет 200,0f i, нужно, чтобы ближнее было вокруг этого пространства отсечения.
2 ответа
Чем ближе ближняя плоскость находится к зрителю, тем быстрее ваша точность буфера глубины будет использоваться ближе к зрителю. Выталкивание ближней плоскости от глаза, но оставление того же расстояния до дальней плоскости, выровняет точность вашей глубины по всему объему обзора. Ваш vDepth также интерполируется перспективно-корректным методом в соответствии с 1/w.
Вы не должны устанавливать gl_FragDepth
в фрагментном шейдере, если вы не хотите что-то, кроме поведения по умолчанию (т.е. gl_FragDepth = gl_FragCoord.z
)
Смотрите: http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html чтобы узнать, почему это плохо для перф.