动态2d阴影 - 混合问题

时间:2011-05-11 12:19:56

标签: c++ opengl

亲爱的社区,祝你好运。

我正在研究一个我将要处理的游戏的动态阴影,但是因为它经常发生,我带给你一个问题,希望(我确实确实)有人会帮助。

这就是我现在所处的位置:enter image description here

注意红色方块,我希望它随着光源移出视线逐渐消失。我确定一个多边形的点是否在圆的半径内,但那当然不能解决它;就像我说的那样,我希望它逐渐消失,直到它完全变黑如果光线太远了。

我有一个想法,但我希望有一个更好的想法。我不会谈论它,因为它确实是最后一个选项,我发现它是一种“强力”技术。

这就是我渲染光线的方式:

    glBegin(GL_TRIANGLE_FAN);
    {
        Graphics::Instance()->SetColor(r_,g_,b_,intensity_);
        glVertex2f(posX_,posY_);

        glColor4f(0.f, 0.f, 0.f, 0.0f);

        for (angle_=0.0; angle_<=3.14159265*2; angle_+=((3.14159265*2)/64.0f) )
        {
            glVertex2f(range_*(float)cos(angle_) + posX_,
                       range_*(float)sin(angle_) + posY_);
        }

        glVertex2f(posX_+range_, posY_);
    }

这就是我如何融合它:

glBlendFunc(GL_SRC_ALPHA, GL_ONE);
l0->Render();

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
l0->ProjectShadow(*mmm);
l0->ProjectShadow(*bb);

就是这样。如果我没有说清楚,或者如果我错过了发布相关代码的话,请说出来并且不要贬低。

2 个答案:

答案 0 :(得分:3)

如何从光源中心计算红场中心的范围?将该值标准化为合适的范围并调整红色方块的透明度或颜色?像这样:

double Range(double x1, double y1, double x2, double y2)
{
    double xDist = x1-x2;
    double yDist = y1-y2;
    return math::sqrt(xDist*xDist+yDist*yDist);
}

double CalcIntensity(double lightX, double lightY, double lightRadius, double objectX, double objectY)
{
    double range = Range(lightX, lightY, objectX, objectY);
    double intensity;
    if( range > lightRadius )
    {
        intensity = 0.0;
    }
    else
    {
        intensity = range/lightRadius;
    }
    return intensity;
}

然后只需拨打CalcIntensity并输入光线和方形的相关位置以及光线的半径。

[编辑] ...如果你没有预先检查它在光线范围内,这将是一个稍微更加优化的版本:

double CalcIntensity(double lightX, double lightY, double lightRadius, double objectX, double objectY)
{
    double intensity = 0.0;
    double xDist = lightX-objectX;
    if( xDist < lightRadius )
    {
        yDist = lightY-objectY;
        if( yDist < lightRadius )
        {
            double range = math::sqrt(xDist*xDist+yDist*yDist);
            intensity = range/lightRadius;
        }
    }

    return intensity;
}

答案 1 :(得分:1)

光在posX,posY处于全亮度,在range处完全“耗尽”(即黑色)。两者之间的值线性插值。因此,d点亮与光源距离rgb * (d/range)的任何位置的点。

如果您现在计算红色方块的每个顶点d_i的距离v_i,则可以通过将c_i乘以它来为每个顶点颜色(d_i/range)应用阴影。如果您希望整个正方形以相同的颜色显示而不考虑更远的顶点,只需使用每个顶点的中心距离,即在绘制正方形之前仅将颜色设置为一次。