2010-12-04 6 views
2

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

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

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

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

Поскольку все тени имеют один и тот же цвет, это не так уж плохо для вас. Просто визуализируйте тени после рендеринга геометрии.
Существуют и другие методы рендеринга теней, которые выглядят лучше и не имеют этой проблемы (например, marking the shadowed parts of the geometry in the stencil buffer).

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

+0

Спасибо, много! Я буду работать над этим – 2010-12-05 18:21:35

Смежные вопросы