2011-05-11 2 views
2

좋은 하루 나의 친애하는 커뮤니티.동적 인 2 차원 그림자 - 블렌딩 문제

저는 작업 할 게임의 동적 그림자에 대해 작업하고 있지만 일반적으로 나는 누군가에게 도움이 될 것이라는 희망으로 (사실 저는 확신합니다) 문제를 제기합니다. 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

답변

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

1

잘 빛은 최대 밝기에있다 posX,posY이고 완전히 "고갈되었습니다"(예 : 검정색)는 range입니다. 그 사이의 값은 선형 적으로 보간됩니다. 따라서 광원으로부터의 거리가 d 인 임의의 위치의 점은 rgb * (d/range)으로 표시됩니다.

당신은 지금 당신의 빨간색 사각형의 각 정점 v_i의 거리 d_i을 계산하는 경우, 당신이 그것에 (d_i/range)를 곱하여 각 정점 색상 c_i에 그림자 적용 할 수 있습니다. 더 멀리 떨어져있는 정점에 관계없이 전체 사각형을 같은 색으로 나타나게하려면 모든 정점에 대해 중심점 거리를 사용하면 정사각형을 그리기 전에 한 번만 색을 설정합니다.