2010-04-26 6 views
3

Я пытаюсь использовать немасштабированное (истинное расстояние от плоскости отсечения спереди) расстояние до объектов в моей сцене в шейдере фрагмента GLSL. Значение gl_FragCoord.z ​​меньше, чем я ожидаю. В моем вершинном шейдере я просто использую ftransform() для установки gl_Position. Я вижу значения от 2 до 3, когда ожидаю, что они будут между 15 и 20.Фрагмент Shader Eye-Space немасштабированная координата глубины

Как я могу получить реальную глубину глазного пространства? Спасибо!

ответ

4

Передайте все, что вы хотите, как изменяющееся от вершинного шейдера.

Значение Z, доступное в шейдере фрагмента, прошло через нормализацию на основе z-near/z-far (от матрицы проецирования) и DepthRange. Так что это не то, что вам нужно. Технически вы можете попытаться восстановить его, возвращая различные операции OpenGL на Z, которые происходят после вершинного шейдера, но это, вероятно, больше проблем (начиная с того, что возврат матрицы проекции является нелинейным), чем просто передача вниз, что вы хотите , в точку.

В качестве побочного примечания Z, который вы вычисляете с помощью gl_ModelViewMatrix * gl_Vertex, является Z с точки зрения, а не вблизи плоскости Z.

+1

Awesome, я просто передал '- (gl_ModelViewMatrix * gl_Vertex) .z' как переменный плавающий, и это именно то, что мне нужно –