나는 광원과 몇 가지 색깔의 창문을 만드는 것을 생각했습니다. 이제 창문은 반투명합니다. 빛 (예 : 순수한 흰색)이 유리에 닿아 유리를 통과 할 때 색상을 통과 한 유리와 동일한 색상으로 변경하려면 어떻게해야합니까?
여기에 설명 된 효과가 창의 "색"쪽 영역 조명을 사용하여 위조 될 수 있다는 것을 알고 있습니다. 그러나 하나의 흰색 점 조명을 원한다면 어떻게해야합니까?
나는 광원과 몇 가지 색깔의 창문을 만드는 것을 생각했습니다. 이제 창문은 반투명합니다. 빛 (예 : 순수한 흰색)이 유리에 닿아 유리를 통과 할 때 색상을 통과 한 유리와 동일한 색상으로 변경하려면 어떻게해야합니까?
여기에 설명 된 효과가 창의 "색"쪽 영역 조명을 사용하여 위조 될 수 있다는 것을 알고 있습니다. 그러나 하나의 흰색 점 조명을 원한다면 어떻게해야합니까?
답변:
이를 수행하는 방법에는 여러 가지가 있습니다. 이것들은 쉐이더를 사용해야하며 이미 픽셀 당 조명을하고 있다고 가정합니다. 다음은 몇 가지 제안이지만 올바른 기술을 찾는 데는 더 많은 연구가 필요할 수 있습니다.
내부 영역을 정의하는 경계 상자를 지정할 수 있습니다. 라이트가 상자 외부에 있지만 지오메트리 (그림자에 있지 않음)가 상자 내부에있는 경우, 창을 통과하여 라이트에 영향을 주었을 것입니다 (지오메트리가 상자 외부에 있고 라이트도 마찬가지입니다) 안에 있습니다). 여기서 유일한 문제는 박스 정보를 쉐이더에 전달하는 방법과 라이트에 미치는 영향을 나타내는 방법입니다.
다른 옵션은 창을 평면에있는 객체로 지정하는 것입니다. 먼저 지오메트리와 라이트가 평면의 반대편에 있는지 확인하고 그 사이의 길이 창 경계 내의 점에서 평면과 교차하는지 확인합니다. 이것은 첫 번째 방법보다 정확하며 유리가 다른 동일한 실내에 창문을 두는 것이 더 쉽습니다.
창의 기하학적 표현으로 더 자세하게 설명하면 더 정확한 결과를 얻을 수 있지만 계산도 더 무거워집니다.
이러한 기술은 복도 사수에게는 합리적으로 잘 작동하지만 역동적이거나 개방 된 세계에는 적합하지 않습니다. 너무 많은 인공물이 없어도 제대로 보이도록 조정해야 할 수도 있습니다. 또한 이러한 기술은 빠르게 강렬해질 수 있으므로 지연된 음영 파이프 라인으로 이동하는 것이 좋습니다.
또 다른 옵션은 그림자 매핑과 유사한 작업을 수행하는 것입니다.
그림자 매핑에서 빛의 영향을받는 일부 비트 맵 이미지를 생성합니다. 각 픽셀은 여전히 색상이지만 가장 불투명 한 형상의 가장 가까운 부분의 거리입니다 (4 개의 색상 대신 1 개의 부동 소수점에 4 바이트를 사용함). 라이트에서 지오메트리 조각까지의 거리를 계산하고 섀도우 맵의 해당 값 이상인 경우 지오메트리 조각이 그림자에 있습니다 (일반적으로 지오메트리와 라이트 사이의 광선을 사용하여 맵을 색인화 함).
이 아이디어를 문제에 적용하면 가장 가까운 투명 지오메트리 조각의 빛과의 거리 맵을 저장하고 해당 지오메트리를 통과 한 후 빛의 색을 두 번째 맵으로 만듭니다 ( 빛이 흰색이면 단순히 기하학의 색상).
지오메트리 조각이이지도에서 거리보다 멀리 떨어져 있으면 맵 색상을 사용하고 그렇지 않은 경우 원래 밝은 색상을 사용하십시오.
지도에서 각 픽셀의 색상을 계산하는 기능은 대략적으로되어야합니다. lightColor-invertedWindowColor입니다. 따라서 순수한 백색광과 적색 스펙트럼을 흡수하지 않는 순수한 적색 창을 위해; (255,255,255)-(0,255,255) = (255,0,0)입니다. 따라서 다른 쪽의 빛의 색은 순수한 빨강입니다. 스테인드 글라스 창과 같은보다 복잡한 투명 물체의 경우 재료 색상을 얻기 위해 텍스처 조회를 원할 수 있습니다.
비슷한 것을 찾고 있다면 Reflective Shadow Maps 를 확인하십시오 .
이 기술은 많은 충실도를 제공하며 스테인드 글라스 창과 같은 복잡한 투명 형상을 사용하려는 경우 가장 좋습니다.
조명 정보를 복셀 표현으로 인코딩하는 것이 최근 대중화되었습니다 (지오메트리만을위한 것이 아닙니다). 최신 crytek 엔진은 고급 조명 ( 광 전파 량 )을 위해 이러한 종류의 전략을 사용합니다 .
일반적인 아이디어는 다음과 같습니다.
이 복셀 정보를 작성하는 방법에는 여러 가지가 있지만 위의 목록은 일반적인 아이디어를 제공합니다. 예를 들어; 그림자 맵 / 볼륨을 생성 한 다음 해당 정보를 복셀 맵에 투영하여 직접 조명 맵을 신속하게 만들 수 있습니다. 그런 다음 영향을받는 영역의 가장자리를 따라 복셀에서 전파를 시작합니다. 이 경우 그림자 맵 / 볼륨을 생성 할 때 형상이 투명한지 여부를 무시하고 싶을 것입니다.
디퍼 드 렌더러의 최종 패스에서 지오메트리 점의 조명을 계산할 때 단순히 지오메트리 위치를 사용하여 복셀 맵을 인덱싱하여 공간의 해당 지점에서 입사 조명이 어떤지 알아냅니다. 그런 다음 입사 조명 CPU 측의 화면 맵을 만들거나 cuda 로이 작업을 수행 할 수 있습니다.