Вычисляет ли фиксированный конвейер функций OpenGL освещение в пространстве просмотра?

Вычисляет ли фиксированный конвейер функций OpenGL освещение в пространстве просмотра?

Если да, то как он справляется с преобразованиями вида с неравномерным масштабом? На самом деле, как он вообще справляется с преобразованиями вида, включающими любой масштаб?

Если это так, то масштабирование пространства просмотра приведет к разным расстояниям от источника света до вершины, а это означает, что интенсивность освещения для точечных источников света будет меняться по мере масштабирования матрицы вида.

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

  1. Что матрица объект-мир предоставляется API (например, в DirectX, где положения источников света указываются в мировом пространстве).
  2. Чтобы API дважды преобразовывал всю геометрию при рисовании. Один раз с помощью world*view*proj в пространство клипа и снова по миру, чтобы вычислить освещение в вершинах в пространстве мира.

Баллы начисляются за хороший ответ с любой дополнительной справочной информацией, которую вы можете найти о конвейерах освещения с фиксированными функциями в целом.


person Community    schedule 31.05.2012    source источник


Ответы (1)


Я думаю, что ваш вопрос возникает из-за смешения «пространства просмотра» с «пространством постпроекции». Они не одинаковы.

Пространство обзора или пространство камеры — это пространство сцены относительно камеры. Таким образом, камера находится в начале координат и смотрит вниз по оси -Z, а +Y направлена ​​вверх. С точки зрения фиксированной функции OpenGL пространство камеры — это пространство после умножения позиций и нормалей на матрицу GL_MODELVIEW.

Постпроекционное пространство — это то, что вы получаете после умножения значений пространства камеры на матрицу GL_PROJECTION. Именно поэтому существуют две отдельные матрицы. Вы делаете освещение в пространстве камеры и отправляете постпроекционные позиции на растеризацию.

OpenGL не выполняет освещение в постпроекционном пространстве. Таким образом, соотношение сторон, масштабирование камеры и т. д. не влияют на освещение. Перспектива также не разделяется.

Вычисляет ли фиксированный конвейер функций OpenGL освещение в пространстве просмотра?

Да, и вы должны.

Если да, то как он справляется с преобразованиями вида с неравномерным масштабом? Собственно, как он вообще справляется с трансформациями вида, включающими любой масштаб?

Точно так же, как он справляется с преобразованием модели в мир, включая масштаб.

Это просто матрица. Математика не знает и не заботится о том, где происходит конкретное преобразование масштаба, будь то часть модели-мира или часть мира-камеры. Важно только наличие шкалы. Или перекос или любая другая форма преобразования.

И помните: намного более вероятно, что преобразование модели в мир использует масштаб, чем преобразование мира в камеру. Скорее всего, вам потребуется масштабировать геометрию, чтобы она соответствовала миру, а не масштабировать геометрию для матрицы камеры. Масштабирование масштабирования камеры, соотношения сторон и т. п. является частью матрицы перспективы, а не матрицы камеры.

С этим он «справляется» обычным образом: нормали преобразуются обратным транспонированием матрицы модели в вид. Это изменяет нормали (полное раскрытие: это мой учебник по электронной книге ), чтобы они по-прежнему соответствовали модели после масштабирования. Это необходимо независимо от того, в каком пространстве вы находитесь.

Если это так, то масштабирование пространства просмотра приведет к разным расстояниям от источника света до вершины, а это означает, что интенсивность освещения для точечных источников света будет меняться по мере масштабирования матрицы вида.

... и? Поскольку все объекты трансформируются с помощью одной и той же матрицы камеры (в пределах одной сцены), ко всем объектам будет применен одинаковый масштаб. Следовательно, если все они были в одном масштабе в мировом пространстве, то все они будут в одном масштабе и в пространстве камеры.

Так в чем проблема? Да, затухание меняется, но одинаково для всех объектов. Таким образом, проблем нет, если ваши коэффициенты затухания рассчитаны на это пространство камеры.

person Nicol Bolas    schedule 31.05.2012
comment
Рассмотрим эффект, который масштабирует всю сцену (чтобы создать впечатление, что игрок сжимается в игре FPS), все расстояния освещения изменятся, влияя на уравнение освещения. Если бы освещение производилось в мировом пространстве, этого бы не произошло. Спасибо за Ваш ответ. - person ; 31.05.2012
comment
@infact: вы бы не масштабировали мир, чтобы казалось, что игрок сжимается. Вы бы нарисовали игрока меньше. Вы бы приблизили камеру к земле и так далее. Не было бы необходимости в масштабной матрице вообще. - person Nicol Bolas; 31.05.2012
comment
Возможно, тогда это плохой пример. Но разве не разумно рассмотреть преобразование вида, включающее Масштаб? Анимация такого преобразования выявила бы несоответствия в освещении пространства обзора. - person ; 31.05.2012
comment
@infact: с тем же успехом я мог бы сказать, что миру потребуется масштабное преобразование, которое выявит несоответствия в периоде освещения. Если затухание вашей сцены имеет значение, то вы сами должны поддерживать согласованность расстояний в этой сцене. Освещение обычно делается в пространстве камеры, поэтому ясно, что это не так уж важно. - person Nicol Bolas; 31.05.2012