Thursday, November 14, 2013

Depth, z-buffer, z-fighting, depth-sorting ....

Гүн нь ажиглагчийн зүгээс рэндэрлэх объект маань хэр наанатай цаанатай байна вэ гэдгийг илтгэдэг.



Тэгвэл ялгаатай гүний утгатай объектүүдийг хэрхэн рэндэрлэх вэ?
Гүний утга нь их бол арай бага утгатай объектийн цаана харагдан рэндэрлэгдэнэ.
Дээрхи асуудлыг шийдвэрлэхийн тулд хаагдсан-гадаргууг хасах асуудлыг шийдвэрлэх шаардлагатай.

Будагчины алгоритм
энэ алгоритм нь хаагдсан-гадаргууг хасах асуудлыг шийдвэрлэхэд тусалдаг. Яаж ажилладаг вэ гэхээр эхлээд объектүүдийг тэдгээрийн гүнийх нь утгаар нь эрэмбэлдэг үүнийг англиар depth sorting гэдэг. Дараагаар нь объектүүдээ араас нь урагш байдлаар буюу цаад объектийн өмнө нь объектээ давхарлах байдлаар рэндэрлэнэ.
Хамгийн эхний зураг нь яг гаргахыг хүссэн үр дүн. Гүнээр нь эрэмбэлээд дарааллын дагуу зурагдаж байгааг харж болно.

Гэвч энэ алгоритмд дутагдалтай сөрөг талууд бий. Гүний эрэмбэлэлтийг камерийн байрлалийн төлөв нь өөрчлөгдөх тутам байнга хийж байх хэрэгтэй байдаг. Объектүүд янз бүрийн хэмжээтэй гүний зузаантай байх боломжтой учраас объектүүд хоорондоо давхарлагдах боломж маш өндөр.
объектүүд давхарлагдах боломжтойг харуулсан байна
Гүний эрэмбэлэлт хийх үед объектүүд хоорондоо байр булаалдах буюу давхцал үүсэн буруу үр дүнд хүрэх боломжтой.
Шийдвэрлэлт
Аз болоход эдгээр асуудлыг шийдвэрлэхэд туслах нэмэлт өгөгдөл бий. Fragment Processor-т оройнуудад харгалзах гүний утгууд хооронд дөхөлт хийгдэн нормчилсон утгууд орж ирдэг. нормчилсон гэхээр depth утга буюу z-value нь [-1, 1] ийн интервал дотор байна гэсэн үг.

Z-Value

Тэгэхээр fragment бүрт гүний утга буюу z-value байдаг гэсэн үг. Хэрэв бид гүний утгыг frame buffer-т хадгалвал үүнийгээ ашиглаад бусад орж ирэх fragment-үүдийг эдгээр framebuffer дэх утгуудтай харьцуулан пикселийг тооцоолох боломж бүрдэнэ. Үүнийг z-buffering аль эсвэл depth-buffering гэж нэрлэдэг.

Z-Buffer
Z-Buffer алгоритм нь хаагдсан-гадаргууд хасах асуудалд хамгийн их хэрэглэгддэг алгоритм юм. Стандартаар хэрэглэгддэг framebuffer-т depth-buffer байнга хамт хэрэглэгддэг. Энэ алгоритмыг ашигласнаар объект-огторгуйд гүнээр эрэмбэлэх шаардлагагүй болдог.
Хэрэв fragment-ийн гүний утга нь depth-buffer ийн утгаас их хэмжээтэй бол тэр fragment-ийг тооцооллохгүй зүгээр орхидог. Яагаад гэвэл энэ fragment нь юмны цаагуур байгаа гэсэн үг өөрөөр хэлбэл наана нь өөр fragment байна гэсэн үг.
Бусад тохиолдолд framebuffer ийнхээ өнгийг тооцооллон шинэчилдэг.

Суурь дүрсүүдийг rasterize хийж үүсгэсэн fragment-үүд нэг пикселд давхардан буулгагдаж болно. Тэдгээрийг тэгвэл z-buffer хэрэглэн жишиж утгыг нь шинэчлэх байдлаар ажиллуулдаг гэсэн үг. Тун ухаалаг алгоритм байгаа биз?


Мөн z-buffer -т нягтаршил болон гүн гэсэн хоёр төрлийн утгууд бий. Нягтаршил нь голдуу дэлгэцийн зургийн хавтгайн урт өргөний хэмжээтэй таарч байх ёстой. Пиксел болгонд харгалзан гүн буюу depth утга байдаг гэсэн үг.

Хэрэв гүний утга хангалттай сайн нарийвчлалгүй байвал Z-Fighting хэмээх таагүй үр дүн хүрэх боломжтой