Действительно, значение «глубины» фрагмента можно прочитать из его значения z в пространстве клипа (то есть после всех преобразований матрицы). Это правильно.
Однако ваша проблема в делении на w
.
Деление на w
называется перспективным делением . Да, необходимо, чтобы перспективная проекция работала правильно.
1012 * Однако *. Деление на w
в этом случае «объединяет» все ваши значения (как вы видели), чтобы быть очень близким к 1,0. Для этого есть веская причина: в перспективной проекции , w= (some multiplier) *z
. Таким образом, вы делите значение z (каким бы оно ни было вычисленным) на (некоторый фактор) исходного z. Не удивительно, что вы всегда получаете значения около 1,0. Вы почти делите z на себя.
В качестве очень простого исправления для этого попробуйте разделить z
только на дальний план и отправить его фрагментному шейдеру как глубина .
Вершинный шейдер
varying float DEPTH ;
uniform float FARPLANE ; // send this in as a uniform to the shader
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
DEPTH = gl_Position.z / FARPLANE ; // do not divide by w
Фрагмент шейдера:
varying float DEPTH ;
// far things appear white, near things black
gl_Color.rgb=vec3(DEPTH,DEPTH,DEPTH) ;
Результат - неплохое, очень линейно выглядящее затухание.