2014-09-15 7 views
3

Это довольно простой вопрос. Я изучаю 3D-графику и освещение на данный момент, и мне было интересно, как нормальные данные хранятся (обычно).Как обычно хранятся обычные данные?

Стандартно ли хранить эти данные как часть любого внешнего файла модели, загружаемого в вашу программу, или пересчитывать нормальные данные заново из данных вершин каждый раз, когда загружается новая модель? Или есть ли преимущества для обоих методов, и они иногда используются по разным причинам?

ответ

1

OpenGL позволяет несколько атрибутов около каждой вершины при отправке на GPU для обработки, наиболее часто используемое для этого является положение, нормали и текстурного отображение

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

+0

Значит, стандарт MOST имеет нормали во внешнем файле? – Robomoo

+0

@Robomoo вместе с другими данными, связанными с моделью, да. Хотя текстуры (изображения) являются внешними. –

2

Это, как всегда в графике, зависит.

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

Однако, если вы используете подсветку на пиксель, нормали сохраняются на пикселях в нормальных (рельефных и т. Д.) Картах. В этом случае они обычно не могут генерироваться процедурно (они генерируются из моделей с более высоким количеством полисов).

+0

Как насчет некоторых из наиболее часто используемых типов файлов, таких как (я думаю) .3ds и .blend? И если вы сохранили нормальные данные (не по пикселям) для очень большой модели, например, целую сцену, то не увеличили бы размер файла на много? – Robomoo

+1

Дисковое пространство обычно дешевле, чем циклы процессоров, но –

1

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

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

Если у вас есть сетка из вершин без нормалей (например, поскольку вы никогда не экспортировали нормали или не отбрасывали их), вы все равно можете вычислить нормали поверхности. Обычно это делается путем усреднения нормалей лица всех грани, примыкающих к каждой вершине, возможно, как взвешенное среднее значение, учитывающее площадь или угол лица. Но независимо от того, как этот расчет выполнен, результатом является приближение нормалей исходной аналитической поверхности.

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