Мне нужно нарисовать контур вокруг 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. Я не могу использовать шейдеры (см. Ниже, почему).
Ответы:
Для дополнительного удовольствия попробуйте нарисовать контурный проход в отдельной цели рендеринга и примените небольшое размытие, затем смешайте эту текстуру с финальной сценой, используя подходящие значения Z.
источник
Я сделаю это так:
Сортировка объектов в порядке «спереди назад» (расстояние от камеры)
Нарисуйте границу объекта (как линии и точки) с отключенным
GL_DEPTH_TEST
Рисовать объект с включенным
GL_DEPTH_TEST
Сделайте последние два шага для каждого объекта
Я постараюсь сделать это таким образом, но если у кого-то есть идеи лучшего решения этой проблемы (УМНЫЕ КОНКАВНЫЕ ОБЪЕКТЫ, ПОЖАЛУЙСТА), не стесняйтесь поделиться с нами.
PS. Я не полностью удовлетворен своими состояниями OpenGL, меняющими решения, поэтому часто может быть вредным. Но если никто не может помочь мне с настройками буфера трафарета, я думаю, что это единственный способ для меня.
источник