Нарисуйте контур вокруг объекта в Opengl


8

Мне нужно нарисовать контур вокруг 2D-объектов в 3D-пространстве. Я попытался нарисовать линии вокруг объекта (+ точки, чтобы заполнить зазор), но из-за ширины линии некоторая часть (~ 50%) покрывала объект. Я попытался использовать буфер трафарета, чтобы устранить эту проблему, но я получил что-то вроде этого (контур зеленый):

http://goo.gl/OI5uc (извините, я не могу публиковать изображения из-за своей репутации)

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

    glColorMask(1,1,1,1);
    std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
    int countStencilBit=1;
    while(objIter!=objEnd)
    {
        glColorMask(1,1,1,1);
        glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
        glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
        (*objIter)->DrawYourVertices();

        glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
        glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
        (*objIter)->DrawYourBorder();

        ++objIter;
        ++countStencilBit;
    }

Я пробовал разные настройки буфера трафарета, но всегда получал вот так. Вот вопрос: 1. Я неправильно установил трафаретный буфер?

2. Существуют ли другие простые способы создания контура на таких объектах?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

1. У меня нет нормалей объектов.

2. Объект может быть вогнутым.

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


Вы можете проверить «toon» или затенение ячейки, где вокруг объекта нарисован контур. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Джонатан Коннелл

Дело в том, что я не могу использовать шейдеры в этом проекте ...
therealszaka

@Maciekp Почему вы не можете использовать шейдеры? Это домашнее задание?
Джонатан Коннелл

Это приложение должно работать на многих компьютерах, не всегда на самом новом (это 1 балл) .2. Это не игра, это приложение с графикой в ​​составе + оно должно работать на Mac, Win, Linux.
Therealszaka

1
Возможно, он должен был быть опубликован на SO, если это не для GameDev, и вы должны предоставить максимально возможную информацию, если вы хотите, чтобы ваш вопрос ответил.
Джонатан Коннелл

Ответы:


12
  • Нарисуйте всю сцену, кроме выделенных объектов.
  • Нарисуйте объекты, которые вы хотите выделить, чистым цветом, отсортированные сзади и спереди, с небольшим примененным масштабом (1.05f - 1.1f).
  • Нарисуйте окончательные объекты, опять же, спереди назад.

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


Это отличный Барба-трюк!
FxIII

Это старый трюк, который они использовали для контуров, когда конвейер gfx все еще был исправлен.
Джонатан Коннелл

2
Это не будет работать для вогнутых объектов
Therealszaka

@Maciekp Ваш вопрос был о двухмерных объектах (плоскостях) в трехмерном пространстве, откуда вогнутость? Просто масштабируйте вдоль двух осей! = В направлении грани.
Джонатан Коннелл

Он должен работать для вогнутых объектов, если при рисовании контуров вы инвертируете нормали (у вас должен быть включен выбор лица).
r2d2rigo

0

Я сделаю это так:

  • Сортировка объектов в порядке «спереди назад» (расстояние от камеры)

  • Нарисуйте границу объекта (как линии и точки) с отключенным GL_DEPTH_TEST

  • Рисовать объект с включенным GL_DEPTH_TEST

  • Сделайте последние два шага для каждого объекта

Я постараюсь сделать это таким образом, но если у кого-то есть идеи лучшего решения этой проблемы (УМНЫЕ КОНКАВНЫЕ ОБЪЕКТЫ, ПОЖАЛУЙСТА), не стесняйтесь поделиться с нами.

PS. Я не полностью удовлетворен своими состояниями OpenGL, меняющими решения, поэтому часто может быть вредным. Но если никто не может помочь мне с настройками буфера трафарета, я думаю, что это единственный способ для меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.