간접 광에 대한 기여도를 계산할 때 코사인 가중 반구 샘플링에 여전히 NdotL이 필요합니까?


12

균일 한 반구 샘플링에서 코사인 가중치 반구 샘플링으로 변환 할 때 기사의 설명에 혼동됩니다.

내 현재 간접 기여는 다음과 같이 계산됩니다.

Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)

내적이 cos (θ) 인 경우

그러나 더 나은 샘플링 ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ )에 대한 이 기사에서 저자는 PDF가 (cos (θ) / pi)라고 제안하며 증거는 없습니다. N 도트 L 계산

내 질문은-PDF에 포함되어 있기 때문에 더 이상 정상적인 도트 레이 디렉션을 수행 할 필요가 없거나 PDF에 추가되어 있습니까?

답변:


12

항상 코사인 항을 곱해야합니다 (렌더링 방정식의 일부 임). 광선 추적을 사용하여 간접 확산을 수행하여 몬테 캐롤 통합 (이 경우 가장 일반적인 기술)을 사용하는 경우 각 샘플의 기여도를 PDF나누어야 합니다 . 이것은 여기에 잘 예시되어 있습니다 .

언급 된 참조에서 PDF에 렌더링 방정식에도있는 용어가있는 경우이 용어를 취소하여 원하는 경우 코드를 최적화 할 수 있습니다.

확산 표면의 BRDF는 ρ / π이며, 여기서 ρ는 표면 알베도를 나타냅니다. 따라서 결과를 π로 나누어야합니다. 간접 확산 구성 요소의 경우, castRay의 결과를 임의 변수의 PDF로 나눠야한다는 것을 잊지 마십시오.이 장의 앞부분에서 보여 드렸듯이 1 / (2π)입니다. 간접 확산을 1 / (2π)로 나누면이 값에 2π를 곱하는 것과 동일하지 않습니다. 그리고 albedo도 π로 나눠지기 때문에 코드를 단순화 할 수 있습니다 ...

비슷한 상황이 있습니다. 코사인 샘플링에 대한 PDF를 보면 용어가 취소 될 수 있음을 알 수 있습니다. 그렇다고 그들이 꼭 '필요하지 않다'는 것은 아닙니다. 그것들은 서로를 취소하여 코드를 약간 최적화 할 수 있습니다 (분할, 곱셈 등을 피하십시오). 당신은 여기에 미세 최적화에 더 많이 있습니다 ... 최적화 된 코드 (주로 적절하게 주석 처리되지 않음)를보고 이론을 배우려고하면 혼란 스러울 수 있습니다.

(cos(θ)...)PDF=(cos(θ)...)cos(θ)π=...


1
감사합니다! 말이 되네요 직관적으로 나는 그것이 필요하다는 것을 알았지 만 그것이 최적화라는 것을 인식하지 못했습니다.
Steven

5
이것이 명백한 지 확인하는 것입니다. 코사인 가중치 반구는 명령이 적기 때문에 최적화 일뿐만 아니라 더 빨리 수렴하기 때문에 최적화이기도합니다. 더 나은 결과를 얻으려면 샘플 수가 적습니다. 이것은 중요도 샘플링의 한 형태입니다.
Alan Wolfe

정확합니다-라이트 맵퍼에서 간접 계산을 위해 샘플 수를 줄이려고했기 때문에 저의 소망이었습니다.
Steven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.