Deferred Lighting with YCoCg LitAcc Buffer

Color= Ambient + Shadow * Att * (N.L * DiffColor * DiffIntensity * LightColor +R.V^n * SpecColor * SpecIntensity * LightColor)

기본적인 방식은 Wolfgal Engel 의 Light pre-pass renderer 에서 출발한다

diffuse term 과 specular term 을 저장할 공간이 부족한 것을 해결해야 하는데..

아래 6개의 값이 있다.

NdotL * Att * Light.r
NdotL * Att * Light.g
NdotL * Att * Light.b
NdotH * Att * Light.r
NdotH * Att * Light.g
NdotH * Att * Light.b

6개의 채널값을 하나의 버퍼에 담을 수 없게 된다.

* 방법 #1 diffuse rgb + specular intensity (CryEngine3)

diffuse term 은 rgb 로 저장하고 specular term 은 강도(intensity) 값만 저장
차이는 보이나 다행히 크게 어색하지 않다.

a0008416_4ac4326da791e

a0008416_4ac43286036c1

* 방법 #2 interaced YCoCg (내가 생각한 방법)

diffuse/specular term rgb 를 각각 YCoCg 로 변환한다음
Y(luma) 정보는 매 픽셀 write 하고 CoCg(chroma) 정보를 라인마다 엇갈려 write 한다

픽셀 쉐이더에서 VPOS(gl_FragCoords.xy) 로 위치를 정할 수 있다

light accumulation 버퍼 2×2 layout

(dY, dCo, sY, sCo) (dY, dCo, sY, sCo)
(dY, dCg, sY, sCg) (dY, dCg, sY, sCg)

라이팅 패스에서 4 개의 픽셀을 읽어 rgb 정보로 reconstruct

chroma 정보가 1/2 로 유실되나 눈으로 거의 차이를 못느낄 것임

참고 자료:
http://diaryofagraphicsprogrammer.blogspot.com/2008/03/light-pre-pass-renderer.html
http://www.crytek.com/fileadmin/user_upload/inside/presentations/2009/A_bit_more_deferred_-_CryEngine3.ppt
http://aras-p.info/texts/CompactNormalStorage.html
http://software.intel.com/sites/products/documentation/hpc/ipp/ippi/ippi_ch6/ch6_Intro.html
http://developer.nvidia.com/object/real-time-ycocg-dxt-compression.html

Leave a Reply

Your email address will not be published. Required fields are marked *