Рендеринг гладких сфер и цилиндра с помощью gluSphere () и gluCylinder ()

Я использую OpenGL с C ++ (но без шейдеров и GLSL) и рисую сферы (шар для пула) и цилиндры (кий), используя функции библиотеки glu для их рисования. Я использую glBindTexture() для привязки текстуры и загрузки текстуры с помощью библиотеки SOIL.

Как вы можете видеть на скриншотах, как у цилиндра, так и у сферы есть неровные края. Вызов следующего glHint() Как мне избавиться от неровных краев. gluSphere() имеет 25 стопок и срезов, а gluCylinder() - 100 стопок и срезов. Увеличение стопок и срезов не улучшает качество изображения.

Использование freeglut для остальной части рисунка

glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); //Smooth polygons
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //Best perspective corrections
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //Smooth points
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //Smooth lines

Снимок экрана


person viraj    schedule 05.06.2013    source источник
comment
Что вам нужно сделать, так это сглаживание.   -  person Vite Falcon    schedule 06.06.2013


Ответы (1)


Прежде всего, ваш вопрос связан с термином псевдонима, это то, что происходит, когда трэнглс и некоторые другие примитивы (это очень простые объекты, которые создают всю сцену) растрируются (на основе геометрического описания некоторые пиксели на экране окрашены или нет). Попробуйте поискать «Как включить сглаживание» - вот много полезной информации об этом и некоторых связанных темах: http://www.glprogramming.com/red/chapter06.html. В вашем случае это наверняка будет glEnable для GL_POLYGON_SMOOTH и GL_BLEND. например.

glEnable (GL_POLYGON_SMOOTH);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint (GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);

Если вы планируете использовать линии, будут GL_LINE_SMOOTH и GL_LINE_SMOOTH_HINT.

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

person Marek Kijo    schedule 05.06.2013
comment
Есть ли другой способ рисовать сферы и цилиндры без функций glu ()? Или вы говорите об уменьшении количества стопок и срезов? - person viraj; 06.06.2013
comment
РЕДАКТИРОВАТЬ: мне также пришлось включить GL_MULTISAMPLE. И передайте GL_MUTLISAMPLE в качестве параметра glutInit(), чтобы получить сглаживание - person viraj; 06.06.2013
comment
Да, я говорил об уменьшении количества стеков и срезов - 25 - это довольно круто, если у вас есть пара сфер, построенных с таким количеством треугольников, вы можете получить небольшую потерю производительности - это не критично в такой сцене, просто оставьте это в своем ум на будущее. Эти функции подходят для некоторых образцов (эти модели имеют хорошие координаты текстуры и векторы нормалей), но для более сложных проектов попробуйте найти какую-нибудь библиотеку для чтения моделей из файлов, хорошую и простую в использовании, с большим количеством features - это assimp. - person Marek Kijo; 06.06.2013
comment
Хм. Я чувствую, что через какое-то время производительность выходит на плато. При связывании, чтобы избавиться от неровных краев, я увеличил количество стопок и срезов до какого-то непристойного числа, например 1000000, и все равно получил ту же производительность. - person viraj; 06.06.2013
comment
Например. Аргументы срезов и стеков для gluSphere fun имеют некоторые ограничения, это зависит от текущей реализации, например. взгляните на Mesa-реализация этого метода, найдите gluSphere и отслеживайте, что происходит с этими двумя аргументами. В этом случае, если они ›= чем const с именем CACHE_SIZE (== 240), они округляются до этого значения :) Попробуйте провести тест в своем приложении, включите каркасы, чтобы увидеть, насколько сложна модель, и начните увеличивать срезы & stacks, вы наверняка заметите, что есть некоторые ограничения. - person Marek Kijo; 07.06.2013