Формат OBJ и Flat против гладкой штриховки - PullRequest
5 голосов
/ 07 мая 2011

Я использую OpenGL ES 1.1 и работаю над преобразованием экспорта OBJ из Blender в некоторые двоичные файлы, содержащие данные вершин. У меня уже есть рабочий инструмент, но я работаю над изменением некоторых вещей и натолкнулся на вопрос.

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

Куда я иду с этим, приносит 2 вопроса.

  1. Являются ли линии "s 1" или "s off", в которых плавное или плоское затенение, обозначенные в файле OBJ, совершенно ненужными с точки зрения плавного затенения и использования нормалей?

  2. Когда в OpenGL установлено значение Плоское затенение, полностью ли игнорируются нормали (или предполагается, что все они перпендикулярны граням)?

Ответы [ 2 ]

9 голосов
/ 09 мая 2011

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

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

Если вы получили для каждой вершины нормалив файле OBJ вам не нужны детали.Но вы можете использовать их для вычисления вершинных нормалей.Части s являются группами сглаживания и должны интерпретироваться как 32-битные битовые поля.Таким образом, на самом деле существует 32 различных группы сглаживания, и каждое лицо может быть частью более чем одной.Таким образом, все грани после линии "s 5" являются частью групп сглаживания 1 и 3 (установлены первый и третий биты).Когда две соседние грани являются частью одной и той же группы сглаживания, ребро между ними является гладким (вершины имеют общие нормали).Таким образом, вы можете восстановить необходимые нормали для каждой вершины.

1 голос
/ 09 мая 2011

Изменение режима между gl_flat и gl_smooth, похоже, не влияет на мой рендеринг, когда я использую для каждой вершины нормали. Из того, что я могу сказать, ваша проблема в том, что у каждого лица есть только один нормальный. Для плавного затенения каждая грань должна иметь три нормали, по одной для каждой вершины, и все они должны быть разными. Например, нормали цилиндра, если они спроецированы внутри цилиндра, должны пересекаться по оси цилиндра. Если ваша модель имеет гладкие нормали, то экспорт OBJ должен экспортировать по вершинам нормали. Похоже, что вы, вероятно, назначаете нормали для каждого лица. Что касается рендеринга в OpenGL-ES, группы сглаживания не используются, только нормальные.

...