Является ли 0,00 верным значением z для вершин в OpenGL?
В OpenGL ваша точка зрения всегда на [0,0,0]. Скажем, у вас есть вершина в этой точке как часть куба или другого объекта. Это вершина перед или позади камеры / точки обзора? После проекции я всегда получаю w=1, когда z==0, что также (как и ожидалось) происходит с вершинами с z==-1. Таким образом, практически вершины с z=0 и z=-1 оказываются на одинаковом расстоянии после проекции.
Посмотрите, как vec(2,2,0) и vec(2,2,-1) имеют одинаковые экранные координаты здесь: https://jsfiddle.net/sf4dspng/1/
Результат:
vec1: x=2.0000, y=2.0000, z= 0.0000, w=1
proj1: x=0.9474, y=2.0000, z=-0.2002, w=1
norm1: x=0.9474, y=2.0000, z=-0.2002, w=1
view1: x=1.0000, y=0.0000, z= 0.3999, w=1
vec2: x=2.0000, y=2.0000, z=-1.0000, w=1
proj2: x=0.9474, y=2.0000, z= 0.8018, w=1
norm2: x=0.9474, y=2.0000, z= 0.8018, w=1
view2: x=1.0000, y=0.0000, z= 0.9009, w=1
Это почему?
1 ответ
Система координат после применения всех ваших преобразований и неявного разделения перспективы, которое происходит после запуска вершинного шейдера, называется нормализованными координатами устройства. В этом пространстве видимый диапазон координат (-1,-1,-1)
в (1,1,1)
; все остальное обрезается. (0,0,0)
будет в центре экрана и на полпути в сцену.
В координатах клипа, системе координат значений, возвращаемых вершинным шейдером, видимый диапазон значений XYZ (-w,-w,-w)
в (w,w,w)
, поскольку NDC вычисляется как значение XYZ координаты клипа, деленное на значение W.
Кроме того, все зависит от того, что реализует ваш вершинный шейдер. Такие вещи, как "объект" и "вид" пространства, обычно реализуются вершинными шейдерами, но OpenGL фактически не знает об их существовании. Видимые значения для этих пространств зависят от того, как вы реализуете его в вершинном шейдере, и поскольку пространственные переходы обычно определяются с использованием матриц, видимые координаты зависят от используемой вами матрицы.