Saturday, December 7, 2013

Frame Buffer Object, Post Processing

Орчин үеийн тоглоомууд график дүрслэлээ үүсгэхийн тулд геометр өгөгдлүүдээ зөвхөн ганцхан удаа буфферлүү бичээд рэндэрлэчихдэггүй. Буфферийг дэлгэцэнд харуулахаас өмнө нэмэлт post processing үйл ажиллагаа явагддаг. Иймэрхүү нэмэлт боловсруулалах үйл ажиллагаанд өнгө буулгалт(tone mapping), bloom, blur гэх мэт зураглал сайжруулах зориулалттай техникүүд байж болно.



Хэрэглэгддэг нэр томъёонууд
FBO(Frame Buffer Object), MRT(Multiple Render Targets), Render To Texture, Post Processing, ping-pong texturing

FBO буюу Frame Buffer Object
OpenGL д олон Frame Buffer Object-руу зэрэг рэндэр хийх боломжтой байдаг. FBO нь дотроо attachment гэж нэрлэгдэх жижиг дэд хэсгүүдтэй, нэг attachment-д нь өнгө, depth, stencil гэх мэтийн мэдээлэл байж болно. Рэндэрлэж байгаа геометрийн мэдээлэл эдгээр буфферүүдийн аль нэгрүү нь чиглэгдэн рэндэрлэгдэж болно. Энгийн ганц pass рэндэр хийхэд бид дотроо back color, depth, stencil гэсэн attachment-үүдийг агуулсан FBO хэрэглэж байдаг.

FBO бүрт эдгээр attachment-үүд байж ч болно байхгүй ч байж болно, гэхдээ FBO-д ядаж ганц attachment заавал байх хэрэгтэй. OpenGL ийн FBO нь MRT-г дэмжин ажилладаг. MRT гэдэг нь ганц fragment shader дотор олон attachment ашиглах боломжийг олгодог технологи юм. Нийт хэрэглэж болох attachment-үүдийн тоо нь график картнаас хамаарна, магадгүй 8-н ширхэг attachment-үүдийг ч хэрэглэж болно. Ер нь яагаад заавал олон текстурлуу янз бүрийн өнгө рэндэрлэх хэрэгтэй байдаг юм бол? Тэхээр дан геометрийн нормал утгуудыг postprocessing зорилгоор бичих хэрэгцээ гарч болно эсвэл рэндэрлэгдсэн үр дүндээ blur мэтийн эффект оруулах хэрэгцээ гарч болно. Энэ чанар бол FBO MRT ийн давуу тал бөгөөд ямар ч төрлийн шаардлагатай мэдээллийг пиксел байдлаар текстурлүү хадгалах боломжийг олгодог байхнээ.

Attachment-үүд бол зүгээр л нэг OpenGL-д хэрэглэгддэг энгийн 2D текстур юм. Тийм болохоор FBO-руу кадраа рэндэрлээд дараа нь тэр FBO-ийнхоо color attachment хэсгийг нь дараагийн кадр рэндэрлэхдээ текстур байдлаар хэрэглэн ашиглаж болно. Гэхдээ FBO-д ашиглаж болох attachment текстурт тодорхой хязгаарлалт бий. Жишээлбэл attachment текстурыг шахаж хэрэглэж боломжгүй мөн бүх attachment-үүд бүгд ижилхэн урт болон өргөний хэмжээтэй байх хэрэгтэй гэх мэт.

FBO нь шахсан текстур дэмждэггүй ч багцалсан(packed) текстуруудыг дэмжиж ажиллаж чадна. Энгийн рэндэр хийхэд хэрэглэгддэг pipeline-ийг FBO ашиглан дуурайлгахын тулд colour attachment нь 32 битийнх байх хэрэгтэй(тус бүр нь 8 битийн RGBA өнгүүд) бас 24-н битийн z-buffer ашиглах хэрэгтэй болдог. Зарим график картууд бүх attachment-үүдийг ижилхэн bit тэй байхыг шаарддаг. Үүнтэй нийцүүлэх нэг хялбар шийдэл гэвэл зүгээр л 32 битийн z-buffer хэрэглэх явдал бөгөөд нэмэлт битүүдийг нь хэрэглэх юм. Гэхдээ stencil attachment хэрэглэх болвол яах вэ? хэрэв пиксел бүрт 32битийн stencil өгөгдөл ашиглавал хэт их нөөц үрсэн хэрэг болж магадгүй юм. Иймээс texture packing хэрэглэх нь үр дүнтэй. stencil болон depth attachment-үүдийг тус тусад нь текстур болгож хэрэглэхийн оронд тэр хоёрыг багцлаад нэг текстур болгон хэрэглэж болно, жишээ нь 32 битээс 24 битийг нь depth мэдээлэл хадгалах зорилгоор үлдсэн 8 битийг нь stencil мэдээлэл хадгалах зорилгоор хэрэглэж болно.

Post Processing
3D талбарыг дараа нь ашиглах боломжтой олон текстурлүү рэндэрлэх боломжтой байх нь blur, sharpening, motion blur, depth of the field гэх мэтийн маш олон post processing техникүүдийг хэрэглэх боломжийг олгоно. Photoshop-д хэрэглэгддэг ямар ч үйл ажиллагааг frame buffer дотор FBO-ийн attachment-үүд дээр хийж болно. OpenGL-д post processing ашиглая гэвэл эхлээд дэлгэцээ дүүргэсэн тэгш өнцөгт(quad) бүхий текстур үүсгээд үүнийгээ FBO-ийн colour attachment байдлаар рэндэрлэж ашиглах хэрэгтэй бөгөөд үүнийгээ fragment shader дотор post processing боловсруулалт хийхэд хэрэглэх юм. Мэдээж post processing shader хэрэглэсний үр дүнд үр дүнг нь дараагаар нь өөр боловсруулалтанд хэрэглэх өөр FBO дотор бичх боломжтой.

3D талбарыг FBO-рүү рэндэрлээд colour texture attachment-ийг нь тэгш өнцөгттэй хамтатган
ашиглаж post processing shader ажиллуулж байна.

Ping-pong texturing
Олон янзын post processing эффектүүдийг дээр тайлбарлсан байдлаар хэрэглэхийг ping-pong texturing гэж нэрлэдэг. Үүний ажиллуулахын тулд хоёр текстур хэрэглэх ба тэдгээрийг postprocessing үе шатуудад хэрэглэх оролтын болон гаралтын текстур байгууламж байдлаар хэрэглэнэ. Үүнийг рэндэрлэх үйл ажиллагаанд хэрэглэгддэг арын болон өмнө буфферүүдийн өргөтгөл болгон ашиглаж болно. Хэдэн ч ширхэг post processing эффект хэрэглэх хэрэгтэй байсан зөвхөн оролтын болон гаралтын текстур л хэрэглэх шаардлагатай байдаг.

A текстурыг post processing тэгш өнцөгт хэрэглэж B текстурлуу FBO ашиглан рэндэрлэж байна. Дараагаар нь B текстурыг
өөр post processing тэгш өнцөгт хэрэглэн A текстурлуу рэндэрлэж байна, ингээд дараагийн иймэрхүү боловсруулалтанд бэлэн