390 likes | 649 Views
HDR Meets Black & White 2. Shader Study 10.06.07 임정 환. What’s HDR rendering. 1.0 보다 큰 color luminance 를 표현할 수 있는 format 이 필요 Display device 들은 LDR 이라 HDR 에서 LDR 로 변환시켜줘야함. Why HDR?. 밝고 어두운 것을 명확하게 표현 밝고 어두움이 극명하게 표현된 씬에서 saturating 없이 표현. Black & white2 by night.
E N D
HDR Meets Black & White 2 Shader Study 10.06.07 임정환
What’s HDR rendering • 1.0보다 큰 color luminance를 표현할 수 있는 format이 필요 • Display device들은 LDR이라 HDR에서 LDR로 변환시켜줘야함
Why HDR? • 밝고 어두운 것을 명확하게 표현 • 밝고 어두움이 극명하게 표현된 씬에서 saturating 없이 표현
Black& white2 by night • 모든 케이스에 들어맞는 lighting을 셋업하기 참힘듬 • 특히 밤 Scene은 low dynamic rage때문에 아주 참기힘들정도였다는 • HDR rendering과 auto exposure를 도입하여 밤 scene에서 visual 퀄리티를 향상시킴
Black& white2 by night(2) 밤에는 luminance 히스토그램의 95퍼센트가 0.5보다 적은 값임
color luminance • 빠르고 간편함 : HSL space에서 직관적으로 color 밝기를 표현할수 있는 값임 • RGB로부터 luminance = dot(color, LUMINANCE_VECTOR) • LUMINANCE_VECTOR ( 0.2125, 0.7154, 0.0721)
Tonemapping • 간단한 톤매핑 if (luminance > 1.0) color = white • 간단하지만 좀 더 생각해 볼 톤매핑 new_luminance= luminance / max_luminance new_color = color * new_luminance / luminance • 그러나 Tone mapping은 아티스트가 관여해야 함, 아티스트로부터의 input을 받는 것이 필요
HDR in Games • 이 당시에는….(2005년) • Half Life 2 Lost Coast (HDRL) • Far Cry and Splinter Cell (HDRR) • Some XBOX 360 Games
HDR “a la” Half Life 2 (1) • High dynamic range values를 사용함 • Frame buffer에 결과값을 쓰기전에 라이팅 계산의 마지막에 Tone map • D3DFMT_A8R8G8B8 render target 사용
HDR “a la” Half Life 2 (2) • 장점: • HDR hardware를 요구하지 않음 • MSAA 호환가능, 상대적으로 값싼 • 단점 • tone mapping 포함하기위해 각각의 모든shader를 만져줘야했음 • Scene의 전체적인 dynamic range를 이해하기 힘들었음 • 많이 overdraw되면 값이 비쌈(?)
HDR : The “floating” way(1) • High dynamic range를 사용하여 lighting 계산하는것은 결과값은 Floating point(16,32 bit per component) render target에 값을 기입하는 것(D3DFMT_A16FG16FB16F) • 평균,최대 luminance를 HDR Image로부터 계산한다. • HDR image를 LDR render target으로 tone map한다.
HDR : The “floating” way(2) • 장점 • 픽셀당 고정되고 예측가능한 코스트가 든다. • 높은 정밀성, 평균값과 최대값을 이용함으로써 노출도를 쉽게 조정가능하다. • 단점 • 비싸다. 많은 bandwidth가 요구된다. 많은 메모리도 요구(fp16 render target) • 최신의 하드웨어에서만 이용가능(이당시) • MSAA와 잘 맞지않다. MSAA를 해결할 수 있는 하드웨어적 지원이 필요함
Other ways to do HDR • HDR 컬러를 표현가능한 RGBE를 사용 • manually하게 blending해줘야함 • NO MSAA • HSL에서 더 많은 BIT를 L에 할당을 하고 계산한다. • 올바르게 구현하기 어렵고, 값이 비쌈 • 애네들은16-bit floating-point를 썻다고 함
High Quality 32-Bit HDR Colors with LogLUV(책에있는챕터) • CIE Luv – 3가지 요소 • L – Luminance • u,v – Chromaticity coordinate • 우선 RGB -> XYZ 로 변형 • 그다음XYZ -> CIE Luv로
High Quality 32-Bit HDR Colors with LogLUV (책) • U,v는 8비트로 L은 16 bit logarithm으로 저장 • Shader를 사용하여 가능 • 장점 • 4 byte로 표현가능 • 계산이 쉬움 • 단점 • Alpha blending 에 제약이있음 • LogLuv texture를 sampling하면 artifact가 있음(왜냐하면 LogLuv가 linear하지 못하기 때문이라고 함)
High Quality 32-Bit HDR Colors with LogLUV (책) float eps = pow(2, -64); float3x3 mRGB_to_XYZ = { {0.497, 0.256, 0.023}, {0.339, 0.678, 0.113}, {0.164, 0.066, 0.864} }; float4 ConvertRGBToLogLuv(float3 RGB) { float3 XYZ = mul(mRGB_to_XYZ, RGB); XYZ = max(XYZ, float3(eps, eps, eps)); //avoid by 0 float2 xy = XYZ.xz / dot( float3(1,1,1), XYZ); float2 uv = float4(4, 9) * xy / dot(float3(-2,12,3), float3(xy, 1)); float LogL = 256 * log(XYZ,y + 64); //avoid neg value float LogL_LSB = frac(LogL); // get 8 least significant bits; return float4(uv, LogL_LSB, LogL); }
Tonemapping(책) • Lw는 mapping되어지는 pixel의 luminance • Lwhite는 완전 하얀색에 mapping될 가장 작은 luminance • Lmin은 완전 검정색에 mapping될 가장 작은 luminance • Lave는 scene의 평균 luminance • Ld(x,y)는 coordinate x,y위치에 [0..1] 사이의 값으로 새로구해져매핑될luminance 이해하기 쉽고 아티스트가 조정가능하면서realtime에 적합한 Tone Mapping 이다~
Minimum, Maximum, and Average Luminance(책) • 최대값, 최소값, 평균값을 다운 샘플하면서Average 구할수 있다.
Average luminance and the GPU • 평균luminance를 구하는 것은 전형적인 ‘gathering’ operation인데… • GPU는 data를 gathering하기에 좋지 않음 • CPU가 매우좋다.
Average luminance and the CPU • HDR 이미지를 메인메모리로다시가져와야한다. • 메우느림(PCI-E 에서는 그렇게 느리지는 않다고함) • 다음 콘솔환경에서는 문제가 되지 않을것으로 봄 • 전체 image histogram을 계산해보자.
Image Histogram(책) • 씬에서min,max,avg값을 구하는 것은 이미 전체영역에 대한 모든 픽셀들에 대한 계산이 요구되는 작업임 • 여기에다가 약간의 작업을 좀 더 추가하면 더 많은 정보를 얻어낼 수 있다. • Luminance 를 단계(슬롯)를 나누어 구분하자.(예를 들어 1024) • 각 슬롯들은 해당되는 luminance를 가지는 픽셀들의 숫자를 기록함
Image Histogram • 최대값과 최소값을 찾자(Lmax, Lmin) • Luminance range를 확실한 숫자슬롯으로 나누자(예를들어 1024) • 각 슬롯마다 픽셀의 숫자를 찾자. • Frequency를 얻기위해 각 슬롯을 픽셀의 숫자로 나누자.
Histogram Equalisation(1) • 여기서는전체dynamic range를 이용할 수 있게균등화할 수 있는 image histogram로 바꿔봅시다.~
Histogram Equalisation(2) • From “Digital image processing”, page 91-93: • Input image에서 R의 luminance를 가지는 각각의 slot들을 S로 mapping 시킨다. • S는 R보다 작거나 같은 모든 frequency들의 합
AutoExposure(1) • 균등화된 histogram으로부터Lnew_min, Lnew_max, Lnew_avg를 계산해내자. • Lnew_min은 S가Pmin보다 큰 첫번째 slot임.. • Lnew_max는 S가Pmax보다 큰 첫번째 slot임 • Lnew_avg는 S가Pavg보다 큰 첫번째 slot임 • 일반적으로Pmin, Pmax, Pavg는 0.01(1%), 0.99(99%), 0.50(50%) 임
AutoExposure(2) • 최소값과 최대값의 percentage는 매우작은 부분의 밝거나 어두운 지역을 무시해버릴수도있음..
AutoExposure(3) • Auto exposure는 최소값,최대값,평균값을 트래킹함으로써 구현된다. • Act_value += new_value * (1.0f –pow(1.0f – speed, 30.0f * elapsed_time)); • Speed는 아티스트가 조절가능한 숫자로 얼마나 빨리 노출도가 적용되는가를 나타낸다.
Luminance mapping(1) • Luminance mapping을 저장할 1024 * 1 짜리 texture를 만든다. • Lact_min보다 적은 luminance는 0.0으로 매핑 • Lact_max보다 큰 것은 1.0으로 매핑(그러면 bloomed) • 나머지 영역은 간단한 gamma ramp로 map할수있다. float xp = 1.0f + (Lact_avg – Lact_min)/(Lact_max-Lact_min); gamma_ramp= powf(x, xp + bias);
Luminance mapping(2) • Bias 값은 scene 에 contrast를 증감시킬수있는 값이다. • 낮에는contrast를 높게 • 밤에는 낮게
Luminance mapping(3) • 아티팩트를줄이기위해 luminance map은 D3DFMT_R16F 로 • Tone mapper에서의 픽셀쉐이더 Float Li = dot(colorln, LUMINANCE_VECTOR); Float Ld = tex1D(LuminanceMapSampler, Li); colorOut.rgb = LuminanceScale * (Colorln.rgb/Li)*Ld;
Histogram based HDR Pros and Cons • 장점(Pros.) • GPU파워를 위해 GPU에서 CPU로 bandwidth를 옮길수있다.(보통 남지만 그러나 부족한) • 이미지를 특색있게컨트롤할수있음 • 매우 flexible하고 simple한 pixel shader tone mapper • 3d texture들에 기초한 color correction techniques로 plug하기 쉽다.(색변형시키기 쉽다) • 단점(Cons) • 많은 GPU에서 CPU로의 bandwidth가 필요함 • 그러나 console에서는 free • HDR image의 더블 buffer에 많은 메모리가 필요하다. • HDR IMAGE를 분석하는데 CPU 사이클이 필요하다.
HDR in Black & White 2 • B&W에서는 HDR을 끼워넣는데 부분적인 수정만하였다. • 기존의Shader를 수정할 필요가없음 • Art asset을 수정할 필요없음 • HDR의 장점을 잘이용하기위해 아티스트가 Process중간에서 개입할필요는있다.
Performance analysis • Origin size(1024*768)은 대략 6MB의 video Ram을 더먹고 4xMSAA를 사용하면 최대 25MB까지 더 먹음.. • 1024*768 fp16 의 scaled down version은 대략 11mb/s의bandwidth를 요구한다. • 꽤 많이 먹네;; • 약 10ms 가 걸리며 분석하는데는 AMD64 3500mhz로 1ms가 걸린다.