Прозрачные многоугольники также делают подстилающие поверхности прозрачными - PullRequest
2 голосов
/ 04 декабря 2010

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

Когда тени нарисованы на горизонтальных поверхностях, когда я смотрю на них издалека, я могу видеть сквозь поверхности, как будто они были прозрачными.

void PolyShadow::Draw(){
 glColor4f(0,0,0,0.5f);
  glEnable (GL_BLEND);
  glBlendFunc (GL_DST_COLOR,GL_ONE_MINUS_SRC_ALPHA);

  this->drawShadow();
 glDisable (GL_BLEND);
   shadow_initialized = true;
}

Чтобы избежать конфликтов, я назначаю любому объекту, проецирующему тени, другой shadow_offset и выполняю этот вызов перед рисованием тени

glEnable(GL_POLYGON_OFFSET_FILL);

//call to object.drawShadows()

glDisable(GL_POLYGON_OFFSET_FILL);

И

void Object::drawShadows(){
glPolygonOffset(-1.0-shadow_offset,-1.0-shadow_offset);
//Draw shadow
}

Я тоже пробовал с

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

но ничего не изменилось.

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

1 Ответ

1 голос
/ 04 декабря 2010

Когда вы используете смешивание, вы должны выполнять рендеринг задом наперед. Таким образом, вам нужно z-порядок ваших моделей или даже треугольников. Как правило, сначала вы рендерируете все непрозрачные элементы в произвольном порядке, а затем смешиваете их в обратном порядке.

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

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

...