LINUX.ORG.RU

не работает сглаживание OpenGL


0

1
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_SRC_COLOR);
glShadeModel(GL_SMOOTH);    // Разрешить плавное сглаживание
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);   // Черный фон
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Сглаживание линий
glEnable(GL_BLEND);         // Разрешить смешивание
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

//set the format and location for verticies
glVertexPointer(3, GL_FLOAT, 0, vertices);

glNormalPointer(GL_FLOAT, 0, normals);

glCullFace(GL_FRONT);
glDepthFunc(GL_LEQUAL);

//draw the triangles
glDrawArrays(GL_TRIANGLES, 0, numberOfVertices);

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


Ответ на: комментарий от Eddy_Em

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

ECLIPSE
() автор топика
Ответ на: комментарий от Eddy_Em

Да, я смотрю по моделе. Тоесть я вижу когда она сгладилась, а когда нет.

ECLIPSE
() автор топика
Ответ на: комментарий от anonymous

К сожалению выхлоп дать не могу. Но я точно знаю, что использую OpenGL 1.0. А что касаеться расширений, то я никакие не использую.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

Еще есть одна деталь над которой я сейчас работаю: в файле где указаны нормали некоторые плавающие числа указаны с е и парсер вычитывает их в 0.0, но их там не сильно много. Поэтому даже если учесть тот факт, что есть ошибочные нормали часть модели все равно должа сглаживаться правильно.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

[quote]
OpenGL 1.0
[/quote]
А где вы такого мамонта откопали?
[quote]
Еще могу добавить, что glShadeModel(GL_SMOOTH); и glShadeModel(GL_FLAT); ведут себя как и должны - по разному.
[/quote]
Попробуйте запустить пример с nehe.gamedev.net, где сглаживание. Ну и пример с отображением текста. Может, у вас где-то в коде чего-то не хватает.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ECLIPSE

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А где вы такого мамонта откопали?

Мамонт используеться на мобильных платформах.

Попробуйте запустить пример с nehe.gamedev.net, где сглаживание. Ну и пример с отображением текста. Может, у вас где-то в коде чего-то не хватает.

Спасибо, как раз этим занимаюсь.

ECLIPSE
() автор топика
Ответ на: комментарий от Eddy_Em

Не, вы не ошибаетесь. Мне надо сделать действительно аппроксимацию модели. Модель должна выглядеть гладкой.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

Может, тогда и не стоит сглаживанием заморачиваться? Там и так пиксели мелкие и разрешение ужасное...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ECLIPSE

Тьфу ты. Сразу нельзя было сказать?

При чем здесь попиксельное сглаживание? Копайте в сторону B-сплайнов. openGL их поддерживает. Правда, если вершин много, получится очень медленно. Особенно на тормозных мобильных платформах.

Так что, если вам надо гладкую поверхность построить, лучше сами побольше вершин рассчитайте. И/или триангуляцией пользуйтесь.

Eddy_Em ☆☆☆☆☆
()

Так нормали для вершин у тебя нормально подсчитаны (усреднены)? GL_SMOOTH же просто интерполирует рассчитанные для вершин цвета. А если они оказываются одинаковыми (одни и те же нормали), то и интерполировать нечего.

Amp ★★★
()
Ответ на: комментарий от ECLIPSE

Собственно сейчас единственный выход который я вижу это сгладить нормали. Но может это не единственный выход?

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

У вас на гладкой поверхности есть какие-то выбросы, которые отображаются резко выделяющимися треугольниками? Попробуйте проредить на них сетку вершин.

Ну и нормали надо считать тщательно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Да у меня сейчас все отображаеться треугольниками. Всем большое спасибо. Я думаю реально надо усреднить нормали.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

Может, лучше просто продумать алгоритм вычисления нормалей? Вдруг он у вас какой-то неполноценный?

Вы их как считаете? Через векторное произведение?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ECLIPSE

Я и сам в принципе могу и рассчитать и усреднить, но раз есть возможность уже их сохранить высчитанными и усредненными, то нет смысла перегружать дивайс.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

Ну так сделайте в 3D-максе более приличную триангуляцию.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Это сглаживание вроде не обязано работать.

buddhist ★★★★★
()

Предлагаю по итогам треда выдать медаль «Телепат месяца» Eddy_Em

unC0Rr ★★★★★
()
Ответ на: комментарий от ECLIPSE

>Но я точно знаю, что использую OpenGL 1.0. А что касаеться расширений, то я никакие не использую.
А вот это разве входит в стандарт OpenGL 1.0 ? Сомневаюсь...
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);

Bad_ptr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.