#opengl #shader #depth
#opengl #шейдер #глубина
Вопрос:
я пытаюсь выяснить, что происходит внутри пары шейдеров вершинный фрагмент. Чтобы быть более конкретным, я пытаюсь сравнить значения глубины в процессоре. Одно из этих значений глубины вычисляется шейдером и соответствует значению gl_FragCoord.z. Что я точно знаю, так это то, что выводимая глубина находится в диапазоне [0,1] и не линейна. Итак, кто-нибудь знает, что происходит с любым заданным значением глубины между подачей глубины в vertexshader и считыванием ее во фрагментном шейдере? Как opengl преобразует глубину в диапазон [0,1]?
Заранее большое спасибо!
Ответ №1:
После применения матричных преобразований вершина [v]
находится в объеме канонического представления, если она удовлетворяет:
- v.w <= v.x <= v.w, - v.w <= v.y <= v.w, - v.w <= v.z <= v.w
после разделения перспективы на (w) :
-1 <= x' <= 1, -1 <= y' <= 1, -1 <= z' <= 1 (where: x' = v.x / v.w, etc.)
затем нормализованный диапазон значений глубины [0, 1] задается:
depth = 0.5 * (z' 1.0)
Ответ №2:
В простом средстве визуализации OpenGL значения глубины будут сгенерированы матричными преобразованиями в вершинном шейдере. В моем случае мой базовый вершинный шейдер выполняет следующее:
mat4 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix;
vec4 pos = vec4(ObjectPosition.x, ObjectPosition.y, ObjectPosition.z, 1.0);
gl_Position = mvpMatrix * pos;
Три матрицы, которые служат в качестве входных данных, управляются моим приложением; у меня есть полный контроль над ними, и я мог бы выполнить процесс вручную, если бы захотел.
Вкратце: выясните, какие матрицы вы отправляете в вершинный шейдер, и выполните вычисления. Преобразование происходит в самом вершинном шейдере, и наиболее важной матрицей в вашем случае, вероятно, является projectionMatrix, она заботится о сопоставлении с [0,1], потому что у нее есть (по крайней мере, должно быть) знание области просмотра.