Шейдеры и проекции в Vulkan ведут себя точно так же, как и в OpenGL. Существуют небольшие различия в диапазонах глубин ([-1, 1] в OpenGL, [0, 1] в Вулкане) или в начале системы координат (нижний левый в OpenGL, верхний левый в Вулкане), но принципы точно такие же. Аппаратное обеспечение по-прежнему остается неизменным и выполняет вычисления таким же образом как в OpenGL, так и в Vulkan.
4-компонентные векторы служат для нескольких целей:
.w
, который вы упомянули, используется во время проекции в перспективе. Все это мы можем сделать с 4x4 матрицами и, следовательно, нам нужны 4-компонентные векторы (так их можно умножить на 4x4 матрицы). Опять же, я пишу об этом, потому что вышеприведенные правила применяются как к OpenGL, так и к Vulkan.
Итак, для цели .w
компонента переменной gl_Position
- это точно так же в Vulkan. Он используется для масштабирования вектора положения - при перспективных вычислениях (умножение проекционной матрицы) исходная глубина изменяется исходной компонентой .w
и сохраняется в .z
компоненте переменной gl_Position
. Кроме того, оригинальная глубина также сохраняется в компоненте .w
. После этого (как шаг фиксированной функции) аппаратное обеспечение выполняет разделение перспективы и делит положение, хранящееся в переменной gl_Position
его компонентом .w
.
В шагах орфографической проекции, выполняемых аппаратным обеспечением, точно такие же , но значения, используемые для расчетов, различны. Таким образом, этап разделения перспективы все еще выполняется аппаратным обеспечением, но он ничего не делает (положение погружено на 1.0).