我正在编写一个简单的赛车游戏。在尝试在我的场景中添加阴影时,通过绘制黑色透明多边形,我发现自己陷入了一个奇怪的问题。
当在水平表面上绘制阴影时,当我从远处看它们时,我可以透过表面看到它们是透明的。
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);
但没有改变。
提前致谢
答案 0 :(得分:1)
使用混合时,需要从前到后渲染。因此,您需要对模型甚至三角形进行z排序。 通常,您首先以任意顺序渲染所有不透明的东西,然后将东西混合在一起。
由于所有阴影都具有相同的颜色,对您来说并不是那么糟糕。只需在渲染几何体后渲染阴影 还有其他方法可以渲染阴影看起来更好并且没有这个问题(例如marking the shadowed parts of the geometry in the stencil buffer)。
有一些技术可以渲染复杂的alpha混合场景(例如“深度剥离”),避免了排序问题,甚至可以用于交叉几何,但它们相当昂贵。