2014-02-06 5 views
2

매우 많은 겹치는 그림자를 많이 그리는 프로그램에서 작업하고 있습니다. 그림자는 아무 것도 없으며 가장자리가 단단하고 무한대의 단일 광원이 있습니다 (즉, 모든 그림자가 평행합니다). 독특한 측면은 그림자가 부분적으로의 빛을 흡수한다는 것을 나타내며 점차적으로 어두운 영역을 만들기 위해 너무 많은 그림자가 겹칠 수 있습니다. (볼록 사각형으로 저장)하고 효율적으로 그려 내 프로그램에 그림자를 취할 수있는 좋은 방법이 될 것입니다 무엇 :많은 겹치는 2D 쉐도우 그리기

2D overlapping shadows

내 질문은 이것이다 : 여기

는 아이디어를 설명하는 이미지입니다 화면에 표시 할 수 있습니까?

모든 알파 값을 그려서 간단하게 그릴 수 있지만 결과는 좋지만 너무 느리게 나타날 수 있습니다. 나는 이것이 많은 그림자 속에있는 픽셀들이 여러 번 그려지기 때문이라고 생각합니다. 한 번만 각 픽셀을 그리는 접근법이 훨씬 빠를 것이라고 생각합니다.

내 프로그램은 C++이고 UI 및 그리기 작업을 위해 Qt를 사용하고 있습니다. 폴리곤 클리핑 또는 무언가 (예 : Clipper 또는 부스트)를 수행하는 라이브러리를 사용하게되어 기쁩니다. 그러나 OpenGL/GPU 세계로 뛰어 들기를 꺼립니다.).

아이디어가 있으십니까? 감사!

답변

1

글쎄 그림자를 그리는 효율적인 방법은 광선 추적과 같은 일을하는 것이라고 생각합니다. 기본적으로 이미지의 모든 픽셀을 반복하고 반전 된 광선이 지나가는 "벽"을 확인하여 올바른 색을 그립니다. 같은 :

For every pixel in the image 
    compute the reversed lightray (from the pixel to your light direction) 
    compute the number of walls traversed by your lightray 
    (= nb of intersections with all the segments/walls) 
    draw the pixel according to the number of intersections 
    (the more intersections, the darker) 

그것은 쉽게해야하고 O 픽셀 수 그런데 ^^

와 복잡성 (n은) 내가 부스트 :: 형상 교차로를 관리 할 수 ​​있다고 생각합니다.

+0

아, 감사합니다! 그림자 다각형이 아니라 픽셀이라는 관점에서 생각하면 훨씬 더 단순 해 보입니다. 이것을 구현해 볼 것이고, 성능이 상당히 올라갈 것으로 생각됩니다. 속도가 충분히 빠르면 픽셀을 수퍼 샘플링하여 약간의 앤티 앨리어싱을 시도해 볼 수도 있습니다. – rrwick

+0

@rrwick : 천만에요. 코드와 함께 행운을 빌어 요. 가능한 경우 결과를 공유하십시오. – neuro