Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2014, 11:08   #1
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию Не удаётся сгладить модель/Не работает GL_SMOOTH (OpenGL)

Насколько я знаю, на способ отображения модели "рубленая\не рубленая" влияет параметр GL_FLAT/GL_SMOOTH в функции glShadeModel(). В моей сцене это работает только на примитивах типа glutSolidSphere: при GL_FLAT видны границы полигонов, при GL_SMOOTH - не видны. Но на искусственно созданной моделе границы полигонов видны всегда, будто GL_SMOOTH на неё не распространяется. ЗЫ: Модель загружается из файла. Процесс отрисовки выглядит так:
Код:
glBegin(GL_TRIANGLES);	
		for(int j = 0; j < models[h].model_parts[i].faces_count; ++j)
		{
			glNormal3f(models[h].model_parts[i].faces[j].xn,models[h].model_parts[i].faces[j].yn,models[h].model_parts[i].faces[j].zn); 
			for(int k = 0; k < 3; ++k)
			{
				glVertex3f(models[h].model_parts[i].faces[j].point[k].x,models[h].model_parts[i].faces[j].point[k].y,models[h].model_parts[i].faces[j].point[k].z);
			}
		}
		glEnd();
и, да, если писать нормали не перед фейсом, а перед каждым вертексом, то ничего не меняется.
Есть подозрение, что я что-то не так делаю при отрисовке.
всякие glHint тоже не помогали. glBlend используется.
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Старый 03.05.2014, 14:38   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Наверное, у этой модели изначально все нормали такие, что она не гладкая.
Somebody вне форума Ответить с цитированием
Старый 03.05.2014, 20:56   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Сдаётся мне, что в данном формате вовсе не предусмотрено сглаживание (либо вы используете не те поля, которые нужно, если парсер не ваш). Посмотрите, у вас отдельно хранятся вершины и нормали. Очевидно, что фейс - это как минимум 3 вершины. Однако у всех одна нормаль, потому что в ваших данных нормаль есть только у фейса. Т.о. любой фейс будет не сглаженным, т.к. все входящие в него вершины будут иметь одну нормаль на всех.
Обычно для этих целей каждой вершине соответсвует нормаль, а если вершина принадлежит нескольким поверхностям, не сглаженным друг с другом - она дублируется (с разными нормалями для разных фейсов). Советую попробовать другой формат.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 03.05.2014 в 20:58.
Selestis вне форума Ответить с цитированием
Старый 03.05.2014, 23:04   #4
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

Цитата:
...либо вы используете не те поля, которые нужно, если парсер не ваш
Парсер мой, использую то, что нужно, инфа 100%.
Цитата:
Очевидно, что фейс - это как минимум 3 вершины. Однако у всех одна нормаль, потому что в ваших данных нормаль есть только у фейса. Т.о. любой фейс будет не сглаженным, т.к. все входящие в него вершины будут иметь одну нормаль на всех.
Т.е. как это так? Я думал, что нормали для фейса совпадают с нормалями для его вершин. Т.е. по идее, это то же самое, что прописать нормаль для фейса каждой вершине. Разве не так? И ещё не совсем понял, как нормаль для каждой вершины может повлиять на сглаживание...
Цитата:
Советую попробовать другой формат.
Всмысле? Формат файла, из которого берется модель?
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Старый 03.05.2014, 23:20   #5
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

Цитата:
Однако у всех одна нормаль, потому что в ваших данных нормаль есть только у фейса. Т.о. любой фейс будет не сглаженным, т.к. все входящие в него вершины будут иметь одну нормаль на всех.
Да, понял, пересмотрел файл модели. Да, нормаль для каждой вершины отличается от нормали фейса. Переписал под загрузку нормалей для каждой вершины, заработало. Спасибо
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
3D модель системного блока в OpenGL Chester751 Общие вопросы C/C++ 0 17.04.2014 22:32
Opengl - не работает( kventin_zhuk Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 03.08.2012 14:13
OpenGL - анимированная модель (.*gms) Vova777 Мультимедиа в Delphi 0 05.08.2011 20:28
как сгладить отличие между шейдерами 2.0 и 3.0 для gforce? aVague Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 29.03.2008 18:25