눈 적응 및 HDR과 함께 톤 매핑을 구현하려고합니다. 실제로 나는 이것을 이미 구현했지만 결과에 만족하지 못하고 뭔가 잘못했다고 생각합니다.
최종 이미지 (후 처리 전)는 플로트 텍스처를 반으로 저장합니다. 도우미 텍스처도 2 개 있습니다. 첫 번째 것은 마지막 밉맵에 로그 휘도와 평균, 최소 및 최대 색상을 저장합니다. 두 번째는 다음과 같이 계산되는 적응 값을 저장합니다.
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
여기서 prevLum은 이전 조정 값입니다 (이 텍스처의 크기는 1x1 임). 로그 휘도 텍스처는 R8B8G8 형식이고 두 번째는 R8입니다. 튜토리얼에서는 절반의 플로트 텍스처가 사용되는 것을 보았지만 제 경우에는 너무 밝은 이미지 (거의 흰색)가 있습니다.
최종 포스트 프로세싱 셰이더에서는이 코드를 사용하여 눈 적응과 톤 매핑을 얻기 위해 모든 값을 사용하고 있습니다.
float autokey(in float lum) {
return 1.03 - 2.0 / (2.0 + log10(lum + 1.0));
}
float hejl(in float color) {
float x = max(0.0, color - 0.004);
return (x * (A * x + B)) / (x * (A * x + C) + D);
}
float adaptedLum = texture(adaptedLuminance, vec2(0.5)).r;
float exp = exposure * autokey(adaptedLum) / adaptedLum;
result *= exp;
result.xyz=RGB2xyY(result.xyz); // conversion to CIE xyY
result.z = hejl(result.z);
result.xyz=xyY2RGB(result.xyz);
그리고 내 결과는 다음과 같습니다.
- 눈 적응 및 톤 매핑이 켜져 있습니다.
- 눈 적응 만
- 톤 매핑 만
- 모든 것 떨어져
보시다시피 톤 매핑이 켜져있을 때 토끼 색상이 더 옅습니다. 눈 적응이 켜지면 최종 이미지가 훨씬 어둡습니다. 누군가 내가 그 원인을 설명 할 수 있습니까? 여기서 뭔가 잘못되었다고 생각하기 때문입니다. 어쩌면 내가 이해하지 못하는 색 공간이있는 것일 수 있습니까? 또는 톤 매핑 및 눈 적응 전에 적용되는 블룸이 있습니까?
나는 눈 적응과 함께 또 다른 이상한 행동을했습니다. 어두운 곳을 보면 배경 (하늘)이 더 밝아집니다. 괜찮지 만 카메라의 중심이 검은 색 영역에있을 때 항상 발생합니다 (카메라 가이 영역에서 얼마나 멀리 떨어져 있든 상관없이).
이 페이지의 프로젝트에 포함 된 구현을 기반으로합니다 : John Chapman , Nutty Software