亲爱的社区,祝你好运。
我正在研究一个我将要处理的游戏的动态阴影,但是因为它经常发生,我带给你一个问题,希望(我确实确实)有人会帮助。
这就是我现在所处的位置:
注意红色方块,我希望它随着光源移出视线逐渐消失。我确定一个多边形的点是否在圆的半径内,但那当然不能解决它;就像我说的那样,我希望它逐渐消失,直到它完全变黑如果光线太远了。
我有一个想法,但我希望有一个更好的想法。我不会谈论它,因为它确实是最后一个选项,我发现它是一种“强力”技术。
这就是我渲染光线的方式:
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);
就是这样。如果我没有说清楚,或者如果我错过了发布相关代码的话,请说出来并且不要贬低。
答案 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)
应用阴影。如果您希望整个正方形以相同的颜色显示而不考虑更远的顶点,只需使用每个顶点的中心距离,即在绘制正方形之前仅将颜色设置为一次。