2010-12-04 90 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)。

有一些技术可以渲染复杂的alpha混合场景(例如“Depth peeling”),它避免了排序问题,甚至可以用于相交几何体,但它们相当昂贵。

+0

非常感谢!我会努力的 – 2010-12-05 18:21:35