Интересный вопрос, но я сомневаюсь, что это достижимо, поскольку преобразование области просмотра все еще является фиксированной функцией.
Первое, что приходит на ум, - это использовать glDepthRange
(илиего возможный аналог D3D), чтобы изменить отображение с NDC z на глубину.Но это не сработает, поскольку передача [-1,1] в glDepthRange
просто ограничит его до [0,1], и вы также не можете установить его в D3D в [0,5,1], так как до этого все будет по-прежнемуобрезать по [0,1].
Но я не думаю, что вам это нужно слишком часто, поскольку в фрагментном / пиксельном шейдере вы получаете координаты окна с нормализованной глубиной [0,1] (я ожидаюCg вести себя похоже на GLSL здесь).А в вершинном шейдере вам все равно чаще нужна будет глубина мира или пространства просмотра, а не NDC z.Если вам это действительно нужно, вы можете просто основать решение на определении препроцессора в шейдере.