расчет глубины шейдерного трубопровода opengl - PullRequest
2 голосов
/ 08 ноября 2011

Я пытаюсь выяснить, что происходит внутри пары шейдерных вершин-фрагментов. Чтобы быть более конкретным, я пытаюсь сравнить значения глубины на процессоре. Одно из этих значений глубины вычисляется шейдером и соответствует значению gl_FragCoord.z. Что я знаю, так это то, что выходная глубина находится в диапазоне [0,1] и не является линейной. Так кто-нибудь знает, что происходит с любым заданным значением глубины между подачей глубины в вершинный шейдер и считыванием ее в фрагментном шейдере? Как opengl преобразует глубину в диапазон [0,1]?

Заранее большое спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

После применения матричных преобразований вершина [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)
1 голос
/ 08 ноября 2011

В простом рендере OpenGL значения глубины будут генерироваться матричными преобразованиями в вершинном шейдере.В моем случае мой базовый вершинный шейдер выполняет следующие действия:

mat4 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix;
vec4 pos = vec4(ObjectPosition.x, ObjectPosition.y, ObjectPosition.z, 1.0);

gl_Position = mvpMatrix * pos;

Три матрицы, которые служат в качестве входных данных, контролируются моим приложением;Я имею полный контроль над ними и могу отработать процесс вручную, если захочу.

Подведем итог: выяснить, какие матрицы вы отправляете в вершинный шейдер, и выполните математику.Преобразование происходит в самом вершинном шейдере, и наиболее важная матрица в вашем случае, вероятно, ProjectionMatrix, она заботится о отображении в [0,1], потому что она (по крайней мере, должна) знать область просмотра.

...