2016-05-06 6 views
2

Мне нужно было выполнить ручное разделение перспективы на что-то другое, кроме gl_Position, когда я заметил, что мои результаты отключены, поэтому я сделал несколько экспериментов.Ручное разделение перспективы

Я заметил, что если я позволю это использовать преобразование по умолчанию, полученное значение глубины (gl_Position.z) правильно:

void main() 
{ 
    gl_Position = MVP *vertexPosition; 
} 

Однако при попытке сделать перспективное деление вручную, значение глубина не же, несмотря на то, что должно быть эквивалентно (?):

void main() 
{ 
    gl_Position = MVP *vertexPosition; 
    gl_Position.xyz /= gl_Position.w; 
    gl_Position.w = 1.0; 
} 

Таким образом, делает разделение труда перспектива по-разному в Vulkan? Если да, то как?

Диапазон глубины для окна просмотра установлен на [0,1], если это имеет какое-либо влияние на это.

+1

немного напоминает разницу между правильной интерполяцией перспективы и интерполяцией пространства. Это будет то же самое в opengl –

+0

Определить «не то же самое». Вы пытаетесь сделать сравнение с плавающей точкой между двумя случаями? –

ответ

0

Vulkan имеет ряд правил инвариантности, указанный в Приложении D. Ни одно из этих правил утверждают, что вершинные этапы постобработки фиксированной функции, описанные в главе 23 будет инвариантным с вершинного шейдера пытается сделать тоже самое. Таким образом, вы не можете ожидать, что эти две операции будут давать инвариантные результаты.

Смежные вопросы