중간에 색이 변하는 빛을 얻는 방법?


11

나는 광원과 몇 가지 색깔의 창문을 만드는 것을 생각했습니다. 이제 창문은 반투명합니다. 빛 (예 : 순수한 흰색)이 유리에 닿아 유리를 통과 할 때 색상을 통과 한 유리와 동일한 색상으로 변경하려면 어떻게해야합니까?

여기에 설명 된 효과가 창의 "색"쪽 영역 조명을 사용하여 위조 될 수 있다는 것을 알고 있습니다. 그러나 하나의 흰색 점 조명을 원한다면 어떻게해야합니까?


조명의 색상을 바꾸는 대신 유리 반대편에있는 조명이있는 물체의 기본 색상을 바꿀 수 있습니까? 어쩌면 그 트릭을 할 것입니까?
HumanCatfood

투명 윈도우는 두 번째 패스로 렌더링되며 셰이더는 단순히 각 픽셀 출력의 색상 균형을 수정합니다. 작동하지 않습니까?
Patrick Hughes

이것은 그림자 문제와 유사하다고 생각됩니다. 반투명 객체로 캐스트 된 그림자에 대한 멋진 알고리즘이있는 경우 (실제인지 여부는 알 수 없음) 3 개의 병렬 색상 채널에 대해 실행해야합니다.
Kevin Reid

답변:


14

이를 수행하는 방법에는 여러 가지가 있습니다. 이것들은 쉐이더를 사용해야하며 이미 픽셀 당 조명을하고 있다고 가정합니다. 다음은 몇 가지 제안이지만 올바른 기술을 찾는 데는 더 많은 연구가 필요할 수 있습니다.

빠르고 더러운

내부 영역을 정의하는 경계 상자를 지정할 수 있습니다. 라이트가 상자 외부에 있지만 지오메트리 (그림자에 있지 않음)가 상자 내부에있는 경우, 창을 통과하여 라이트에 영향을 주었을 것입니다 (지오메트리가 상자 외부에 있고 라이트도 마찬가지입니다) 안에 있습니다). 여기서 유일한 문제는 박스 정보를 쉐이더에 전달하는 방법과 라이트에 미치는 영향을 나타내는 방법입니다.

다른 옵션은 창을 평면에있는 객체로 지정하는 것입니다. 먼저 지오메트리와 라이트가 평면의 반대편에 있는지 확인하고 그 사이의 길이 창 경계 내의 점에서 평면과 교차하는지 확인합니다. 이것은 첫 번째 방법보다 정확하며 유리가 다른 동일한 실내에 창문을 두는 것이 더 쉽습니다.

창의 기하학적 표현으로 더 자세하게 설명하면 더 정확한 결과를 얻을 수 있지만 계산도 더 무거워집니다.

이러한 기술은 복도 사수에게는 합리적으로 잘 작동하지만 역동적이거나 개방 된 세계에는 적합하지 않습니다. 너무 많은 인공물이 없어도 제대로 보이도록 조정해야 할 수도 있습니다. 또한 이러한 기술은 빠르게 강렬해질 수 있으므로 지연된 음영 파이프 라인으로 이동하는 것이 좋습니다.

그림자 맵

또 다른 옵션은 그림자 매핑과 유사한 작업을 수행하는 것입니다.

그림자 매핑에서 빛의 영향을받는 일부 비트 맵 이미지를 생성합니다. 각 픽셀은 여전히 ​​색상이지만 가장 불투명 한 형상의 가장 가까운 부분의 거리입니다 (4 개의 색상 대신 1 개의 부동 소수점에 4 바이트를 사용함). 라이트에서 지오메트리 조각까지의 거리를 계산하고 섀도우 맵의 해당 값 이상인 경우 지오메트리 조각이 그림자에 있습니다 (일반적으로 지오메트리와 라이트 사이의 광선을 사용하여 맵을 색인화 함).

이 아이디어를 문제에 적용하면 가장 가까운 투명 지오메트리 조각의 빛과의 거리 맵을 저장하고 해당 지오메트리를 통과 한 후 빛의 색을 두 번째 맵으로 만듭니다 ( 빛이 흰색이면 단순히 기하학의 색상).

지오메트리 조각이이지도에서 거리보다 멀리 떨어져 있으면 맵 색상을 사용하고 그렇지 않은 경우 원래 밝은 색상을 사용하십시오.

지도에서 각 픽셀의 색상을 계산하는 기능은 대략적으로되어야합니다. lightColor-invertedWindowColor입니다. 따라서 순수한 백색광과 적색 스펙트럼을 흡수하지 않는 순수한 적색 창을 위해; (255,255,255)-(0,255,255) = (255,0,0)입니다. 따라서 다른 쪽의 빛의 색은 순수한 빨강입니다. 스테인드 글라스 창과 같은보다 복잡한 투명 물체의 경우 재료 색상을 얻기 위해 텍스처 조회를 원할 수 있습니다.

비슷한 것을 찾고 있다면 Reflective Shadow Maps 를 확인하십시오 .

이 기술은 많은 충실도를 제공하며 스테인드 글라스 창과 같은 복잡한 투명 형상을 사용하려는 경우 가장 좋습니다.

일반적인 해결책을 시도

조명 정보를 복셀 표현으로 인코딩하는 것이 최근 대중화되었습니다 (지오메트리만을위한 것이 아닙니다). 최신 crytek 엔진은 고급 조명 ( 광 전파 량 )을 위해 이러한 종류의 전략을 사용합니다 .

일반적인 아이디어는 다음과 같습니다.

  • 장면을 둘러싸는 균일 한 간격의 큐브 맵을 만듭니다 ( z 순서 곡선 사용 ).
  • 각 복셀에 대한 입사 조명 정보를 저장하는 방법을 찾으십시오 (구면 고조파 표현이 유용합니다).
  • 조명이 포함 된 복셀을 찾아 복셀에서 해당 조명을 나타냅니다.
    • 인접한 복셀 (마인 크래프트 수와 같은 종류)을 통해 빛을 바깥쪽으로 전파
    • 각 복셀의 형상이 통과하는 빛에 어떻게 영향을 미치는지 계산 (흡수, 반사, 투과)
    • 빛이 사라질 때까지 반복

이 복셀 정보를 작성하는 방법에는 여러 가지가 있지만 위의 목록은 일반적인 아이디어를 제공합니다. 예를 들어; 그림자 맵 / 볼륨을 생성 한 다음 해당 정보를 복셀 맵에 투영하여 직접 조명 맵을 신속하게 만들 수 있습니다. 그런 다음 영향을받는 영역의 가장자리를 따라 복셀에서 전파를 시작합니다. 이 경우 그림자 맵 / 볼륨을 생성 할 때 형상이 투명한지 여부를 무시하고 싶을 것입니다.

디퍼 드 렌더러의 최종 패스에서 지오메트리 점의 조명을 계산할 때 단순히 지오메트리 위치를 사용하여 복셀 맵을 인덱싱하여 공간의 해당 지점에서 입사 조명이 어떤지 알아냅니다. 그런 다음 입사 조명 CPU 측의 화면 맵을 만들거나 cuda 로이 작업을 수행 할 수 있습니다.


긴 게시물 주셔서 감사합니다! 현재 작업중인 현재 프로젝트에 대해 렌더링을 진행할 것인지 지연시킬 것인지를 조사하고 있습니다. 현재로서는 아마도 연기 될 것입니다. 창문이 다색 일 때 (예 : 교회의 스테인드 글라스) 어떻게 하시겠습니까?
manabreak 2013

@ manabreak-섀도 맵 확장은 그 경우에 대한 최상의 충실도를 제공하기 때문에 사용합니다. 이를 설명하기 위해 게시물을 편집하겠습니다.
OriginalDaemon

고마워! 이 게시물은 실제로 하루를 보냈습니다. 아마도 단일 게시물에 많은 노력을 기울인 적이 없었습니다.
manabreak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.