2011-05-11 62 views
2

美好的一天,我親愛的社區。動態2d陰影 - 混合問題

我正在爲一款遊戲開發動態陰影,但是由於它經常發生,我會帶給你一個問題,希望(我確信)有人會提供幫助。

這就是我現在: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

如果你想堅持固定功能流水線,那麼使用光衰參數怎麼樣? (請參閱glLightf手冊)。 – datenwolf 2011-05-11 12:28:41

回答

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並在光廣場和光的半徑reletive位置飼料。

[編輯] ...或者這將是一個稍微optomised版本,如果你不預先檢查它的燈內半徑:

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; 
} 
+0

我應該知道的。萬分感謝。 – nullpotent 2011-05-11 13:27:20

1

井光在全亮度posX,posY和完全「耗竭」(即黑色)range。兩者之間的值是線性插值的。因此距光源距離爲d的任何位置的點被點亮rgb * (d/range)

如果現在計算出您的紅色正方形的每個頂點v_i的距離d_i,你可以申請乘以(d_i/range)把它遮蔽每個頂點顏色c_i。如果希望整個正方形顯示爲相同的顏色,而不考慮更遠的頂點,則只需使用每個頂點的中心距離即在繪製正方形之前僅設置一次顏色。