Буцах туяа хянах. Сарнисан тусгал бүхий дүрслэл

Gamescom 2018 дээр Nvidia нь Nvidia RTX бодит цагийн туяа хянах технологийг дэмжих Nvidia GeForce RTX график картуудыг зарлалаа. Манай редакторууд энэ технологи хэрхэн ажиллах, яагаад хэрэгтэй байгааг олж мэдсэн.

Nvidia RTX гэж юу вэ?

Nvidia RTX нь компьютерийн графикийн шинэ түвшинд нэвтрэх боломжийг олгодог хөгжүүлэгчдэд зориулсан хэд хэдэн хэрэгтэй хэрэгслийг агуулсан платформ юм. Nvidia RTX нь зөвхөн Тюринг архитектур дээр бүтээгдсэн Nvidia GeForce RTX шинэ үеийн график картуудад зориулагдсан. Платформын гол онцлог нь чадвар юм бодит цагийн туяа хянах(мөн туяа хянах гэж нэрлэдэг).

Raa tracing гэж юу вэ?

Ray tracing нь гэрлийн үйлдлийг дуурайж, найдвартай гэрэлтүүлгийг бий болгох боломжийг олгодог функц юм. Одоо тоглоомуудад туяа бодит цагт хөдөлдөггүй тул зураг нь ихэвчлэн үзэсгэлэнтэй харагддаг ч хангалттай бодитой биш хэвээр байна - одоо ашиглаж буй технологиуд нь туяаг хянахад асар их нөөц шаарддаг.

Үүнийг Nvidia GeForce RTX видео картуудын шинэ цувралаар зассан бөгөөд энэ нь цацрагийн замыг тооцоолох хангалттай хүч чадалтай юм.

Хэрхэн ажилладаг?

RTX нь тоглуулагчийн өнцгөөс (камераас) гэрлийн туяаг хүрээлэн буй орон зайд тусгаж, өнгөт пиксел хаана харагдахыг тооцоолдог. Цацраг ямар нэгэн зүйлд тусах үед тэд дараахь зүйлийг хийж чадна.

  • Тусгал - энэ нь гадаргуу дээр тусгалыг өдөөх болно;
  • Зогсоох - энэ нь гэрэл тусаагүй объектын тал дээр сүүдэр үүсгэх болно
  • Хугаралт - энэ нь цацрагийн чиглэлийг өөрчлөх эсвэл өнгөт нөлөөлнө.
Эдгээр функцууд байгаа нь илүү найдвартай гэрэлтүүлэг, бодит графикийг бий болгох боломжийг олгодог. Энэ процесс нь маш их нөөц шаарддаг бөгөөд киноны эффектийг бүтээхэд эртнээс ашиглагдаж ирсэн. Цорын ганц ялгаа нь киноны фрэймийг үзүүлэхдээ зохиогчид асар их хэмжээний эх сурвалж, хязгааргүй хугацааг ашиглах боломжтой байдаг. Тоглоомын хувьд төхөөрөмж нь зураг үүсгэх секундын хэдхэн хувийг эзэлдэг бөгөөд ихэнхдээ кино боловсруулахдаа хэд хэдэн биш нэг видео карт ашигладаг.

Энэ нь Nvidia-г GeForce RTX график картуудад нэмэлт цөмүүдийг нэвтрүүлэхэд хүргэсэн бөгөөд энэ нь ихэнх ачааллыг үүрч, гүйцэтгэлийг сайжруулах болно. Тэд мөн хиймэл оюун ухаанаар тоноглогдсон бөгөөд тэдний даалгавар нь мөрдөх явцад гарч болзошгүй алдааг тооцоолох бөгөөд энэ нь үүнээс урьдчилан сэргийлэхэд тусална. Энэ нь хөгжүүлэгчдийн хэлснээр ажлын хурдыг нэмэгдүүлэх болно.

Мөн туяа хянах нь чанарт хэрхэн нөлөөлдөг вэ?

Видео картуудыг танилцуулах үеэр Nvidia туяа хянах хэд хэдэн жишээг үзүүлэв: ялангуяа Shadow of the Tomb Raider, Battlefield 5 зэрэг удахгүй гарах тоглоомууд RTX платформ дээр ажиллах нь тодорхой болсон. Гэхдээ энэ функц нь тоглоомонд нэмэлт байх болно, учир нь мөшгих нь шинэ видео картуудын аль нэгийг шаарддаг. Танилцуулгын үеэр тус компанийн үзүүлсэн трейлерүүдийг доороос харж болно.

Энэ оны 9-р сарын 14-нд нээлтээ хийх Shadow of the Tomb Raider:

10-р сарын 19-нд гарах Battlefield 5:

2019 оны 2-р сарын 19-нд гарах Metro Exodus:

Хяналтын хугацаа нь тодорхойгүй байгаа:

Энэ бүхний хажуугаар Nvidia, өөр ямар тоглоомууд туяа хянах функцийг хүлээн авах болно.

RTX-г хэрхэн идэвхжүүлэх вэ?

Энэ технологийн техникийн шинж чанаруудаас шалтгаалан зөвхөн Тюринг архитектуртай видео картууд туяаг хянахыг дэмждэг - одоогоор байгаа төхөөрөмжүүд нь мөрдөх шаардлагатай ажлын хэмжээг даван туулж чадахгүй. Одоогийн байдлаар ийм архитектуртай цорын ганц видео карт бол Nvidia GeForce RTX цуврал бөгөөд загваруудыг 48,000-аас 96,000 рубль хүртэл урьдчилан захиалах боломжтой.

AMD-д аналог байдаг уу?

AMD нь Radeon ProRender хөдөлгүүрт байдаг бодит цагийн туяа хянах технологийн өөрийн хувилбартай. Тус компани 3-р сард болсон GDC 2018 үзэсгэлэнд өөрийн бүтээн байгуулалтаа зарлав. AMD-н арга болон Nvidia-ийн гол ялгаа нь AMD нь зөвхөн мөшгих төдийгүй растержуулалтад хандах боломжийг олгодог бөгөөд одоо бүх тоглоомд ашиглагдаж байгаа технологи юм. Энэ нь танд мөшгих аргыг ашиглах, илүү сайн гэрэлтүүлэг авах, видео картанд шаардлагагүй ачаалал өгөх газруудад нөөцийг хэмнэх боломжийг олгоно.

Vulkan API дээр ажиллах технологи нь хөгжиж байна.

Nvidia танилцуулгадаа дурдсанчлан, RTX технологийг эзэмшсэнээр тоглоомын график бүрэлдэхүүн хэсэг нь сайжирч, хөгжүүлэгчдийн ашиглах боломжтой хэрэгслүүдийн хүрээ өргөжих болно. Гэсэн хэдий ч графикийн ерөнхий хувьсгалын талаар ярихад эрт байна - бүх тоглоомууд энэ технологийг дэмждэггүй бөгөөд үүнийг дэмждэг видео картуудын үнэ нэлээд өндөр байна. Шинэ видео картуудын танилцуулга нь графикийн дэлгэрэнгүй мэдээлэлд ахиц дэвшил гарч байгаа бөгөөд цаг хугацаа өнгөрөхөд энэ нь өсч, өсөх болно гэсэн үг юм.

Цацрагийн мөрдөх аргууд (Рэй Мөшгих) Өнөөдөр тэдгээрийг бодит дүр төрхийг бий болгох хамгийн хүчирхэг, олон талт арга гэж үздэг. Хамгийн төвөгтэй гурван хэмжээст үзэгдлүүдийг өндөр чанартай харуулахын тулд мөрдөх алгоритмыг хэрэгжүүлэх олон жишээ бий. Мөшгих аргуудын түгээмэл байдал нь бидний эргэн тойрон дахь ертөнцийг мэдрэх бидний туршлагыг тусгасан энгийн бөгөөд тодорхой ойлголтууд дээр үндэслэсэнтэй холбоотой гэдгийг тэмдэглэж болно.

Цагаан будаа. 8.12. Тусгалын загвар: a – хамгийн тохиромжтой толин тусгал, б – төгс бус толь, в – сарнисан, d – сарнисан ба өргөний нийлбэр, d – урвуу, f – сарнисан, толин тусгал ба урвуу нийлбэр.

Бид эргэн тойрон дахь бодит байдлыг хэрхэн харж байна вэ? Эхлээд бид юу харж чадахаа шийдэх хэрэгтэй. Үүнийг тусгай мэргэжлээр судалдаг бөгөөд тодорхой хэмжээгээр энэ бол философийн асуулт юм. Гэхдээ энд бид эргэн тойрон дахь объектууд гэрэлтэй харьцуулахад дараах шинж чанаруудтай гэж таамаглах болно.

    цацрах;

    тусгах, шингээх;

    өөрсдөө дамжин өнгөрөх.

Цагаан будаа. 8.13. Цацраг - a - бүх чиглэлд жигд, b - чиглэлтэй

Эдгээр шинж чанар бүрийг тодорхой шинж чанаруудаар тодорхойлж болно. Жишээлбэл, цацрагийг эрч хүч, чиглэл, спектрээр тодорхойлж болно. Цацраг нь харьцангуй цэгийн эх үүсвэрээс (алс холын од) эсвэл сарнисан гэрлийн эх үүсвэрээс (галт уулын тогооноос дэлбэрч буй хайлсан лаав гэх мэт) ирж болно. Цацраг нь нэлээд нарийхан туяа (төвлөрсөн лазер туяа) эсвэл конус (нүдний гэрэл) дагуу, эсвэл бүх чиглэлд (Нар) жигд тархаж болно. Ойлголтын шинж чанарыг (шингээлт) сарнисан тархалт ба спекуляр тусгалын шинж чанараар тодорхойлж болно. Ил тод байдлыг эрчмийн бууралт ба хугарлаар тодорхойлж болно.

Гэрлийн цацрагийн боломжит чиглэлийн дагуу гэрлийн энергийн тархалтыг векторын урт нь эрчимтэй харгалзах вектор диаграммыг ашиглан харуулж болно (Зураг 8.12 - 8.14).

Өмнөх догол мөрүүдэд бид хамгийн их дурдагддаг тусгалын төрлүүдийг аль хэдийн мэддэг болсон - толь болон сарнисан. Уран зохиолд урвуу толин тусгал эсвэл -аас толины эсрэгялагдал,хамгийн их тусгалын эрчим нь эх үүсвэр рүү чиглэсэн чиглэлтэй тохирч байна. Цагаан будааны талбайн өндрөөс ажиглагдсан дэлхийн гадаргуу дээрх зарим төрлийн ургамал урвуу толин тусгалтай байдаг.

Хугарлын хоёр туйлын, оновчтой тохиолдлыг Зураг дээр үзүүлэв. 8.13.

Зарим бодит биетүүд цацрагийг илүү төвөгтэй аргаар хугардаг, тухайлбал мөсөөр хучигдсан шил.

Бодит байдлын нэг объектыг гэрлийн эх үүсвэр гэж ойлгож болно, эсвэл өөр өөр бодолтойгоор зөвхөн гэрлийг тусгаж, дамжуулдаг объект гэж үзэж болно. Жишээлбэл, зарим гурван хэмжээст үзэгдэл дэх үүлэрхэг тэнгэрийг өргөтгөсөн (тархсан) гэрлийн эх үүсвэр болгон загварчилж болох бөгөөд бусад загварт ижил тэнгэр нь нарны чиглэлээс гэрэлтдэг тунгалаг орчны үүрэг гүйцэтгэдэг.

Цагаан будаа. 8.14. Хугарлын а – хамгийн тохиромжтой, b – сарнисан

Ерөнхийдөө объект бүрийг дээрх гурван шинж чанарын зарим хослолоор дүрсэлсэн байдаг. Дасгалын хувьд эдгээр гурван шинж чанарыг нэгэн зэрэг агуулсан объектын жишээг өгөхийг хичээгээрэй - энэ нь гэрэл ялгаруулж, нэгэн зэрэг бусад эх үүсвэрээс гэрлийг тусгаж, дамжуулдаг. Таны төсөөлөлд улаан халуун шил гэхээс өөр жишээ гарч ирэх байх.

Одоо хэд хэдэн орон зайн объектыг агуулсан үзэгдлийн дүрс хэрхэн үүсдэгийг харцгаая. Бид гэрлийн туяа ялгарсан объектын гадаргуу (эзэлхүүн) дээрх цэгүүдээс гарч ирдэг гэж таамаглах болно. Бид ийм туяаг анхдагч гэж нэрлэж болно - тэд бусад бүх зүйлийг гэрэлтүүлдэг.

Нэг чухал зүйл бол чөлөөт орон зайд гэрлийн туяа тархдаг гэсэн таамаглал юм шулуун шугамын дагуу (хэдийгээр физикийн тусгай хэсгүүдэд муруйлт үүсч болзошгүй шалтгааныг судалж үздэг). Гэхдээ дотор геометрийн оптикГэрлийн цацраг нь цацруулагч гадаргуу эсвэл хугарлын орчны хилтэй тулгарах хүртэл шулуун шугамаар тархдаг гэж үздэг. Бид ч бас тэгж итгэх болно.

Тоо томшгүй олон тооны анхдагч туяа цацрагийн эх үүсвэрээс янз бүрийн чиглэлд гарч ирдэг (лазер туяа ч төгс төвлөрөх боломжгүй - ямар ч байсан гэрэл нь нэг нимгэн шугамаар биш, харин конус хэлбэрээр тархах болно). Зарим туяа чөлөөт орон зайд орж, зарим нь (тэдгээрийн тоо томшгүй олон байдаг) бусад объектуудыг цохино. Хэрэв цацраг тунгалаг биетийг мөргөх юм бол хугарч цааш хөдөлж, гэрлийн энергийн зарим хэсгийг шингээдэг. Үүний нэгэн адил, хэрэв цацрагийн зам дээр тусгай гэрэлтдэг гадаргуутай тулгарвал түүний чиглэл өөрчлөгддөг бөгөөд гэрлийн энергийн нэг хэсэг нь шингэдэг. Хэрэв объект нь толин тусгал, нэгэн зэрэг ил тод (жишээлбэл, энгийн шил) байвал аль хэдийн хоёр цацраг байх болно - энэ тохиолдолд цацраг нь хуваагдсан гэж хэлдэг.

Анхан шатны туяа объектуудад нөлөөлсний үр дүнд хоёрдогч туяа үүсдэг гэж бид хэлж чадна. Тоо томшгүй олон тооны хоёрдогч цацрагууд чөлөөт орон зайд ордог боловч тэдгээрийн зарим нь бусад объектуудыг цохиж байдаг. Тиймээс олон удаа тусгаж, хугарч, бие даасан гэрлийн туяа нь ажиглалтын цэг - хүний ​​нүд эсвэл камерын оптик системд хүрдэг. Цацрагийн эх үүсвэрээс шууд гарч буй анхдагч цацрагуудын зарим нь ажиглалтын цэгт хүрч чаддаг нь ойлгомжтой. Тиймээс тухайн үзэгдлийн дүр төрх нь тодорхой тооны гэрлийн туяагаар үүсдэг.

Зургийн бие даасан цэгүүдийн өнгийг цацрагийн эх үүсвэрийн анхдагч цацрагийн спектр, эрч хүч, түүнчлэн харгалзах цацрагийн замд тааралдсан объектуудад гэрлийн энергийг шингээх зэргээр тодорхойлно.

Цагаан будаа. 8.15. Буцах туяа хянах схем

Энэхүү туяа дүрслэлийн загварыг шууд хэрэгжүүлэх нь хэцүү мэт санагдаж байна. Та заасан аргыг ашиглан зураг бүтээх алгоритмыг боловсруулахыг оролдож болно. Ийм алгоритмын хувьд бүх анхдагч туяаг тоолж, тэдгээрийн аль нь объект, камерт өртөж байгааг тодорхойлох шаардлагатай. Дараа нь бүх хоёрдогч туяаг давтаж, зөвхөн объект болон камерт туссан цацрагийг анхаарч үзээрэй. гэх мэт. Энэ аргыг нэрлэж болно Чигээрээтуяа хянах. Ийм аргын практик үнэ цэнэ нь эргэлзээтэй байх болно. Үнэн хэрэгтээ, бүх чиглэлд дамждаг хязгааргүй тооны туяаг хэрхэн тооцох вэ? Хязгааргүй тооны туяаг бүрэн хайх нь зарчмын хувьд боломжгүй гэдэг нь ойлгомжтой. Хэдийгээр бид үүнийг ямар нэгэн байдлаар хязгаарлагдмал тооны үйлдлүүд болгон бууруулсан ч (жишээлбэл, чиглэлийн бүх хүрээг өнцгийн секторт хувааж, хязгааргүй нимгэн шугамаар биш, харин секторуудтай ажилладаг) аргын гол сул тал хэвээр байна - олон шаардлагагүй үйлдлүүд. цацрагийн тооцоотой холбоотой бөгөөд дараа нь ашиглагдахгүй. Тэгэхээр ямар ч байсан одоогийн байдлаар гарч ирж байна.

Арга ухрах туяа нь гэрлийн цацрагийн хэт ачааллыг мэдэгдэхүйц бууруулах боломжийг олгодог. Энэ аргыг 80-аад онд боловсруулсан бөгөөд үндсэн ажлуудыг авч үзсэн Витте-даТэгээд Кей. Энэ аргын дагуу туяаг гэрлийн эх үүсвэрээс биш харин эсрэг чиглэлд - ажиглалтын цэгээс хянадаг тул зөвхөн зураг үүсгэхэд хувь нэмэр оруулдаг туяаг харгалзан үздэг.

Зарим 3D үзэгдлийн растер зургийг буцаах аргыг ашиглан хэрхэн авахыг харцгаая. Проекцын хавтгай нь олон квадрат - пикселд хуваагдсан гэж үзье. Проекцын хавтгайгаас тодорхой зайд алга болох төвтэй төвийн проекцийг сонгоцгооё. Проекцын хавтгайн дөрвөлжин (пиксел) дундуур алга болох төвөөс шулуун шугамыг зуръя (Зураг 8.15). Энэ нь үндсэн арын туяа байх болно. Хэрэв энэ цацрагийн шулуун шугам нь тухайн үзэгдэл дэх нэг буюу хэд хэдэн объектыг мөргөвөл хамгийн ойрын огтлолцлын цэгийг сонгоно уу. Зургийн пикселийн өнгийг тодорхойлохын тулд тухайн объектын шинж чанар, мөн тухайн объектын харгалзах цэг дээр ямар гэрлийн цацраг унадаг болохыг анхаарч үзэх хэрэгтэй.

Цагаан будаа. 8.16. Үзэмжийн болон хугарлын шинж чанартай объектуудын хувьд ухрах

Хэрэв объект нь толин тусгалтай (наад зах нь хэсэгчлэн) байвал бид өмнөх, анхдагч, тэмдэглэсэн туяаг тусгах туяа гэж үзвэл хоёрдогч туяа - ослын туяаг бүтээдэг. Дээр бид спекуляр ойлтыг авч үзээд, ойсон туяаны векторын томъёог олж авав. Гэхдээ энд бид ойсон цацрагийн векторыг мэдэж байгаа боловч туссан цацрагийн векторыг хэрхэн олох вэ? Үүнийг хийхийн тулд та ижил ойлтын томъёог ашиглаж болно, гэхдээ шаардлагатай туяа векторыг туссан туяа гэж тодорхойлж болно. Өөрөөр хэлбэл тусгал нь эсрэгээрээ байна.

Тохиромжтой толины хувьд хоёрдогч цацрагийн зарим объекттой огтлолцох дараагийн цэгийг л зурахад хангалттай. "Төгс толь" гэсэн нэр томъёо нь юу гэсэн үг вэ? Ийм толь нь төгс тэгш өнгөлсөн гадаргуутай тул нэг ойсон туяа нь зөвхөн нэг туссан туяатай тохирч байна гэж бид таамаглах болно. Толин тусгал нь харанхуйлж, өөрөөр хэлбэл гэрлийн энергийн нэг хэсгийг шингээж авах боломжтой боловч дүрмийг дагаж мөрддөг: нэг туяа туссан, нэг нь тусдаг. Та мөн "төгс бус толь" гэж үзэж болно. Энэ нь гадаргуу тэгш бус байна гэсэн үг юм. Ойсон туяаны чиглэл нь хамгийн тохиромжтой толины тусгалын цацрагийн шугамын дагуу тэнхлэгтэй, тэгш бус байж болох тодорхой конусыг үүсгэдэг хэд хэдэн туссан туяатай тохирч (эсвэл эсрэгээр, нэг туссан туяа нь хэд хэдэн ойсон туяа үүсгэдэг). Конус нь тодорхой эрчим хүчний хуваарилалтын хуульд нийцдэг бөгөөд хамгийн энгийн нь Phong загвараар тодорхойлогддог - тодорхой хүч хүртэл өргөгдсөн өнцгийн косинус. Төгс бус толь нь ул мөрийг судлахад ихээхэн хүндрэл учруулдаг - та нэг биш, харин олон тооны туяаг хянах хэрэгтэй бөгөөд тухайн цэгээс харагдах бусад объектын цацрагийн хувь нэмрийг анхаарч үзэх хэрэгтэй.

Хэрэв объект ил тод байвал хугарсан үед өмнөх туяаг үүсгэх шинэ туяаг бүтээх шаардлагатай. Энд та хугарлын хувьд ч мөн адил буцах чадварын давуу талыг ашиглаж болно. Хүссэн цацрагийн векторыг тооцоолохын тулд хугарал эсрэг чиглэлд явагдана гэж үзвэл хугарлын векторын хувьд дээр дурдсан томъёог хэрэглэж болно (Зураг 8.16).

Хэрэв объект нь сарнисан тусгал, хугарлын шинж чанартай бол ерөнхий тохиолдолд, тохиромжгүй толины хувьд одоо байгаа бүх объектоос ирж буй туяаг хянах шаардлагатай. Сарнисан ойлтын хувьд ойсон гэрлийн эрч хүч нь гэрлийн эх үүсвэрээс ирсэн цацрагийн вектор ба норм хоорондын өнцгийн косинустай пропорциональ байна. Энд гэрлийн эх үүсвэр нь гэрлийн энергийг дамжуулж чадах өгөгдсөн цэгээс харагдах аливаа объект байж болно.

Хэрэв одоогийн ухрах туяа нь ямар ч объектыг огтолдоггүй, харин чөлөөт орон зайд чиглүүлдэг бол энэ туяаны мөр дуусна.

Бидний энд авч үзсэн хэлбэрээр ухрах туяа нь хэдийгээр хайлтыг багасгадаг ч дүн шинжилгээ хийсэн хязгааргүй тооны туяанаас ангижрах боломжийг бидэнд олгодоггүй зураг дээр. Гэсэн хэдий ч хязгааргүй тооны хоёрдогч тусгал туяа аль хэдийн байж болно. Жишээлбэл, хэрэв объект нь бусад объектоос гэрлийг тусгаж чаддаг бол эдгээр бусад объектууд нь нэлээд том бол, жишээлбэл, сарнисан тусгалд харгалзах туяаг бий болгохын тулд ялгаруулах объектын аль цэгийг анхаарч үзэх хэрэгтэй. ? Мэдээжийн хэрэг, бүх оноо.

Буцах аргыг практикт хэрэгжүүлэхэд хязгаарлалтыг нэвтрүүлсэн. Тэдгээрийн зарим нь зургийн нийлэгжилтийн асуудлыг зарчмын хувьд шийдвэрлэх чадвартай байх шаардлагатай бөгөөд зарим хязгаарлалт нь мөрийн гүйцэтгэлийг мэдэгдэхүйц сайжруулж чадна. Ийм хязгаарлалтын жишээ.

1. Бүх төрлийн объектуудын дотроос зарим нь ялгарах бөгөөд бид үүнийг нэрлэх болно эх сурвалжууд гэрэл.Гэрлийн эх үүсвэрүүд нь зөвхөн гэрлийг ялгаруулж болох боловч үүнийг тусгаж, хугалж чадахгүй (бид зөвхөн авч үзэх болно цэггэрлийн эх үүсвэр).

2. Цацруулагч гадаргуугийн шинж чанарыг сарнисан ба спекуляр гэсэн хоёр бүрэлдэхүүн хэсгийн нийлбэрээр тодорхойлно.

3. Эргээд спекуляризмыг мөн хоёр бүрэлдэхүүн хэсэгээр дүрсэлсэн байдаг. Эхлээд (тусгал) гэрлийн эх үүсвэр биш бусад объектын тусгалыг харгалзан үздэг. Зөвхөн нэг л тусгай ойсон туяа баригдсан r нэмэлт мөрдөн шалгах зорилгоор ( Үзэмжтэй ) гэрлийн эх үүсвэрээс гялбаа гэсэн үг. Үүнийг хийхийн тулд туяаг бүх гэрлийн эх үүсвэр рүү чиглүүлж, арын туяагаар туссан эдгээр туяанаас үүссэн өнцгийг тодорхойлно. (r). Спекуляр тусгалд гадаргуу дээрх цэгийн өнгө нь туссан зүйлийн өнгөөр ​​тодорхойлогддог. Хамгийн энгийн тохиолдолд толин тусгал нь өөрийн гэсэн гадаргуугийн өнгөтэй байдаггүй.

4. Сарнисан тусгалтай үед зөвхөн гэрлийн эх үүсвэрийн цацрагийг харгалзан үздэг. Үзэсгэлэнтэй цацруулагч гадаргуугаас туяаг үл тоомсорлодог. Хэрэв өгөгдсөн гэрлийн эх үүсвэр рүү чиглэсэн цацраг өөр объектоор хаагдсан бол объектын энэ цэг сүүдэрт байна. Сарнисан тусгалтай бол гадаргуу дээрх гэрэлтүүлсэн цэгийн өнгийг гадаргуугийн өөрийн өнгө, гэрлийн эх үүсвэрийн өнгөөр ​​тодорхойлно.

5. Ил тод байдлын хувьд (1 зай5 уур хилэн()объектын хувьд хугарлын илтгэгчийн долгионы уртаас хамаарах хамаарлыг ихэвчлэн тооцдоггүй. Заримдаа ил тод байдлыг ерөнхийд нь хугаралгүйгээр загварчдаг, өөрөөр хэлбэл хугарсан цацрагийн чиглэл I туссан цацрагийн чиглэлтэй давхцаж байна.

    Бусад объектоор тархсан гэрлээр объектын гэрэлтүүлгийг харгалзан үзэхийн тулд дэвсгэр бүрэлдэхүүнийг нэвтрүүлсэн. (цагтхоёрдогч).

7. Мөрийг дуусгахын тулд тодорхой хязгаарлагдмал гэрэлтүүлгийн утгыг нэвтрүүлсэн бөгөөд энэ нь үүссэн өнгөт нөлөөлөхгүй байх ёстой, эсвэл давталтын тоо хязгаарлагдмал байна.

дагуу Цагаан өнгөтэй загваруудобъектын тодорхой цэгийн өнгө нь нийт эрч хүчээр тодорхойлогддог

би() = KaIa()C() + KdId()C() + KsIs() + KrIr() + KtIt()

Энд λ нь долгионы урт,

C (λ) - объектын цэгийн заасан анхны өнгө,

K a, K d, Ks, K r ​​, K t - арын гэрэлтүүлэг, сарнисан сарнилт, толин тусгал, тусгал, ил тод байдлын параметрүүдээр дамжуулан тодорхой объектын шинж чанарыг харгалзан үздэг коэффициентүүд;

I а - дэвсгэр гэрэлтүүлгийн эрч хүч,

I г - сарнисан тархалтын эрчимийг харгалзан үзсэн;

I с - эрч хүчийг харгалзах зорилгоор авч үзэх,

I r - ойсон цацрагийн дагуу ирж буй цацрагийн эрч хүч;

I т - хугарсан цацрагийн дагуу ирж буй цацрагийн эрчим.

Арын гэрлийн эрч хүч (1 А ) зарим объектын хувьд ихэвчлэн тогтмол байдаг. Бусад эрчим хүчний томъёог бичье. Сарнисан тусгалын хувьд

I г =

Хаана I би (λ) - цацрагийн эрчим би- ro гэрлийн эх үүсвэр, θ би- объектын гадаргуугийн хэвийн хэмжээ ба тийш чиглэсэн чиглэлийн хоорондох өнцөг би- vi Гэрлийн эх үүсвэр.

Тодорхой байдлын хувьд:

I г =

Хаана Р- нэгээс хэдэн зуу хүртэлх илтгэгч (Фонгийн загварын дагуу), α би- ойсон туяа (арын мөр) ба гэрлийн r" эх үүсвэр рүү чиглэсэн чиглэлийн хоорондох өнцөг.

Ойсон цацрагийн дагуу дамжих цацрагийн эрч хүч ( I r), түүнчлэн хугарсан цацрагийн дагуу ( I т ) , цацрагийн туулсан зайнаас хамаарч эрчмийг сулруулж буй хүчин зүйлээр үржүүлнэ. Энэ коэффициентийг хэлбэрээр бичнэ д - гХаана г- явсан зай, – цацраг тархаж буй орчны шинж чанарыг харгалзан үздэг сулралтын параметр.

Анхдагч цацрагийн хувьд сонгосон төсөөлөлд тохирох чиглэлийг тохируулах шаардлагатай. Хэрэв проекц нь төв байвал анхдагч туяа нь нийтлэг цэгээс салж, параллель проекцын хувьд анхдагч цацрагууд параллель байна. Туяа нь жишээлбэл, сегментийн эхлэл ба төгсгөлийн цэгүүдийн координат, эхлэх цэг ба чиглэлийн координат эсвэл өөр аргаар тодорхойлогддог. Анхдагч туяаг тохируулах нь проекцийг өвөрмөц байдлаар тодорхойлдог дүрсэлсэн дүр зураг . Урвуу туяаны тусламжтайгаар координатын ямар ч хувиргалт хийх шаардлагагүй. Проекцийг автоматаар авдаг - зөвхөн хавтгай төдийгүй, жишээлбэл, цилиндр эсвэл бөмбөрцөг хэлбэртэй. Энэ бол мөшгих аргын олон талт байдлын нэг илрэл юм.

Цацрагийн ажиглалтын явцад шулуун туяаны объекттой огтлолцох цэгүүдийг тодорхойлох шаардлагатай. Уулзвар цэгийг тодорхойлох арга нь ямар төрлийн объект, тодорхой график системд хэрхэн дүрслэгдсэнээс хамаарна. Тиймээс, жишээлбэл, олон талт ба олон өнцөгт торон хэлбэрээр үзүүлсэн объектуудын хувьд аналитик геометрт авч үзсэн шулуун ба хавтгайн огтлолцох цэгийг тодорхойлох сайн мэддэг аргуудыг ашиглаж болно. Гэсэн хэдий ч хэрэв ажил нь туяаны нүүртэй огтлолцохыг тодорхойлох явдал юм бол олсон уулзварын цэг нь нүүрний контур дотор байх шаардлагатай.

Дурын цэг нь олон өнцөгт хамаарах эсэхийг шалгах хэд хэдэн мэдэгдэж байгаа арга байдаг. Үндсэндээ ижил аргын хоёр сортыг авч үзье (Зураг 8.17).

Эхний арга.Өгөгдсөн цэгийн Y координаттай тохирох хэвтээ шугамтай контур огтлолцох бүх цэгүүд олддог. Уулзвар цэгүүдийг X координатын утгуудын өсөх дарааллаар эрэмбэлсэн. Хэрэв шалгаж байгаа цэг нь сегментүүдийн аль нэгэнд хамаарах бол (үүнд өгөгдсөн цэгийн X координат ба сегментийн төгсгөлийг харьцуулсан) энэ нь дотоод байна.

Цагаан будаа. 8.17. Хэрэв цэг нь дотоод байна: a - цэг нь таслагч сегментэд хамаарах, b - уулзварын тоо сондгой бол.

Хоёрдахь арга.Туршилтын цэгтэй ижил хэвтээ шугам дээр байрлах цэгийг тодорхойлох бөгөөд энэ нь олон өнцөгтийн контурын гадна байрлахыг шаарддаг. Олдсон гадаад цэг ба туршилтын цэг нь хэвтээ сегментийн төгсгөл юм. Энэ сегментийн олон өнцөгт контуртай огтлолцох цэгүүдийг тодорхойлно. Хэрэв уулзварын тоо сондгой байвал энэ нь туршилтын цэг нь дотоод байна гэсэн үг юм.

Хэрэв туяа хэд хэдэн объекттой огтлолцсон бол одоогийн цацрагийн чиглэлд хамгийн ойрын цэгийг сонгоно.

Урвуу туяа хянах аргын талаар ерөнхий дүгнэлт хийцгээе.

Эерэг шинж чанарууд

1. Аргын олон талт байдал, түүнийг орон зайн нэлээд төвөгтэй схемийн зургийг нэгтгэхэд ашиглах чадвар. Геометрийн оптикийн олон хуулийг агуулсан. Төрөл бүрийн төсөөллийг зүгээр л хэрэгжүүлдэг.

2. Энэ аргын тайрсан хувилбарууд ч гэсэн нэлээд бодитой зургийг авах боломжийг олгодог. Жишээлбэл, хэрэв та өөрийгөө зөвхөн анхдагч туяагаар (проекцын цэгээс) хязгаарлавал энэ нь үл үзэгдэх цэгүүдийг арилгахад хүргэдэг. Нэг эсвэл хоёр хоёрдогч туяаг судлах нь сүүдэр, тод байдал, ил тод байдлыг өгдөг.

3. Бүх координатын хувиргалтууд (хэрэв байгаа бол) шугаман байдаг тул бүтэцтэй ажиллахад маш хялбар байдаг.

4. Растер зургийн нэг пикселийн хувьд та хэд хэдэн ойр зайтай туяаг мөрдөж, дараа нь шатлалын эффектийг арилгахын тулд өнгийг нь дундажлаж болно.

5. Нэг зургийн цэгийн тооцоог бусад цэгээс хамааралгүйгээр хийдэг тул цацрагийг нэгэн зэрэг хянах боломжтой зэрэгцээ тооцоолох системд энэ аргыг хэрэгжүүлэхэд үүнийг үр дүнтэй ашиглах боломжтой.

Алдаа дутагдал

1. Сарнисан тусгал ба хугарлыг загварчлахад тулгарч буй асуудлууд

2. Зургийн цэг бүрийн хувьд олон тооны тооцооллын үйлдлийг гүйцэтгэх шаардлагатай. Ray tracing бол хамгийн удаан зургийн синтезийн алгоритмуудын нэг юм.

Энэ нь жаахан урам хугарч байгааг би мэднэ. Тусгал, сүүдэр, үзэсгэлэнтэй дүр төрх хаана байна вэ? Бид дөнгөж эхэлж байгаа учраас бүгдийг нь авах болно. Гэхдээ энэ нь сайн эхлэл юм - бөмбөрцөг нь тойрог шиг харагддаг бөгөөд энэ нь муур шиг харагдахаас илүү дээр юм. Тэд бөмбөрцөг шиг харагддаггүй, учир нь бид хүмүүст объектын хэлбэрийг тодорхойлох боломжийг олгодог чухал бүрэлдэхүүн хэсгийг орхигдуулсан - энэ нь гэрэлтэй хэрхэн харьцдаг.

Гэрэлтүүлэг

Манай үзэгдлийн дүрслэлд "реализм" нэмэх эхний алхам бол гэрэлтүүлгийг дуурайх явдал юм. Гэрэлтүүлэг бол үнэхээр нарийн төвөгтэй сэдэв тул би бидний зорилгод хангалттай хялбаршуулсан загварыг танилцуулах болно. Энэ загварын зарим хэсэг нь физик загваруудын ойролцоо ч биш, зүгээр л хурдан бөгөөд сайхан харагдаж байна.

Бидний амьдралыг хөнгөвчлөх зарим хялбаршуулсан таамаглалуудаас бид эхлэх болно.

Эхлээд бид бүх гэрэлтүүлгийг цагаан гэж зарлах болно. Энэ нь ямар ч гэрлийн эх үүсвэрийг нэг бодит тоогоор тодорхойлох боломжийг бидэнд олгоно тод байдалгэрэлтүүлэг. Өнгөт гэрэлтүүлгийг дуурайх нь тийм ч төвөгтэй биш (таньд зөвхөн нэг сувагт нэг гэрэлтүүлгийн гурван утга хэрэгтэй бөгөөд бүх өнгө, гэрэлтүүлгийг суваг тус бүрээр тооцоолох хэрэгтэй), гэхдээ бидний ажлыг хөнгөвчлөхийн тулд би үүнийг хийхгүй.

Хоёрдугаарт, бид уур амьсгалаас ангижрах болно. Энэ нь гэрлүүд нь тэдгээрийн хүрээнээс үл хамааран гэрэл багасдаггүй гэсэн үг юм. Зайнаас хамааран гэрлийн гэрэлтүүлгийг бууруулах нь тийм ч хэцүү биш боловч тодорхой болгохын тулд бид үүнийг алгасах болно.

Гэрлийн эх үүсвэрүүд

Гэрэл байх ёстой хаа нэгтээгээсүйлдэл хийх. Энэ хэсэгт бид гурван төрлийн гэрлийн эх үүсвэрийг тодорхойлох болно.

Цэг эх сурвалж

Цэг эх сурвалжгэж нэрлэгддэг орон зайн тогтсон цэгээс гэрэл цацруулдаг байрлал. Гэрэл бүх чиглэлд жигд ялгардаг; ийм учраас үүнийг бас нэрлэдэг бүх чиглэлтэй гэрэлтүүлэг. Тиймээс цэгийн эх үүсвэр нь түүний байрлал, гэрэл гэгээгээр бүрэн тодорхойлогддог.

Улайсдаг гэрлийн чийдэн нь цэгийн гэрлийн эх үүсвэрийг ойролцоогоор илэрхийлдэг бодит жишээ юм. Хэдийгээр улайсдаг чийдэн нь нэг цэгээс гэрэл ялгаруулдаггүй бөгөөд энэ нь бүхэлдээ бүх чиглэлтэй биш боловч ойролцоогоор хангалттай сайн байна.

Үзэгдлийн P цэгээс Q гэрлийн эх үүсвэр хүртэлх чиглэлийг вектор гэж тодорхойлъё. Энэ векторыг нэрлэдэг гэрлийн вектор, зүгээр л тэнцүү байна. Q тогтмол бөгөөд P нь үзэгдлийн аль ч цэг байж болох тул дүр зураг дээрх цэг бүрийн хувьд ерөнхийдөө өөр байх болно гэдгийг анхаарна уу.

Чиглүүлсэн эх сурвалжууд

Хэрэв цэгийн эх үүсвэр нь улайсдаг гэрлийн чийдэнг сайн ойролцоолсон бол Нарыг сайн ойртуулах нь юу вэ?

Энэ бол төвөгтэй асуулт бөгөөд хариулт нь таны үзүүлэхийг хүсч буй зүйлээс хамаарна.

Нарны аймгийн хэмжээнд Нарыг ойролцоогоор цэгийн эх үүсвэр гэж үзэж болно. Эцсийн эцэст, энэ нь нэг цэгээс (нэлээн том ч гэсэн) гэрэл цацруулж, бүх чиглэлд ялгаруулдаг тул энэ нь хоёр шаардлагад нийцдэг.

Гэсэн хэдий ч, хэрэв таны дүр зураг Дэлхий дээр болсон бол энэ нь тийм ч сайн тооцоолол биш юм. Нар маш хол байгаа тул гэрлийн туяа бүр яг ижил чиглэлтэй байх болно (Тэмдэглэл: энэ тооцоолол нь хотын хэмжээнд хамаарах боловч хол зайд биш - үнэн хэрэгтээ эртний Грекчүүд дэлхийн радиусыг тооцоолж чаддаг байсан. өөр өөр газар нарны гэрлийн янз бүрийн чиглэлд суурилсан гайхалтай нарийвчлал). Хэдийгээр үзэгдлээс маш алслагдсан цэгийн эх үүсвэрийг ашиглан үүнийг ойролцоогоор тооцоолох боломжтой боловч энэ зай болон үзэгдэл дэх объектуудын хоорондох зай нь хэмжээнээсээ маш өөр тул тоон нарийвчлалын алдаа гарч болно.

Ийм тохиолдлуудад бид тохируулах болно чиглэлтэй гэрэлтүүлгийн эх үүсвэрүүд. Цэгэн эх сурвалжийн нэгэн адил чиглэлтэй эх үүсвэр нь тод өнгөтэй байдаг боловч тэдгээрээс ялгаатай нь энэ нь байрлалгүй байдаг. Үүний оронд тэр байна чиглэл. Та үүнийг тодорхой чиглэлд гэрэлтдэг хязгааргүй алслагдсан цэгийн эх үүсвэр гэж ойлгож болно.

Цэгэн эх үүсвэрийн хувьд бид үзэгдэл дэх P цэг бүрт шинэ гэрлийн векторыг тооцоолох шаардлагатай боловч энэ тохиолдолд өгөгдсөн болно. Нар, Дэлхийтэй ижил төстэй үзэгдэлд энэ нь тэнцүү байх болно.

Орчны гэрэлтүүлэг

Бодит ертөнцийн аливаа гэрэлтүүлгийг цэг эсвэл чиглэлтэй эх үүсвэр болгон загварчлах боломжтой юу? Бараг үргэлж тийм (Тэмдэглэл: гэхдээ энэ нь хялбар байх албагүй; талбайн гэрэлтүүлгийг (диффузорын ард байгаа эх үүсвэрийг бодоорой) гадаргуу дээрх олон цэгийн эх үүсвэрээр ойролцоогоор тооцож болно, гэхдээ энэ нь төвөгтэй, тооцоолоход илүү үнэтэй бөгөөд үр дүн нь тохиромжтой биш.). Эдгээр хоёр төрлийн эх сурвалжууд бидний зорилгод хангалттай юу? Харамсалтай нь үгүй.

Саран дээр юу болж байгааг төсөөлөөд үз дээ. Ойролцоох гэрлийн цорын ганц чухал эх үүсвэр бол Нар юм. Өөрөөр хэлбэл, Нартай харьцуулахад сарны "урд тал" нь бүх гэрэлтүүлгийг хүлээн авдаг бол "арын тал" нь бүрэн харанхуйд байдаг. Бид үүнийг Дэлхий дээр өөр өөр өнцгөөс харж байгаа бөгөөд энэ нөлөө нь бидний нэрлэдэг сарны "үе шат"-ыг бий болгодог.

Гэсэн хэдий ч дэлхий дээрх нөхцөл байдал арай өөр байна. Гэрлийн эх үүсвэрээс шууд гэрэл хүлээн авдаггүй цэгүүд хүртэл харанхуйд бүрэн ороогүй байна (ширээний доорх шалыг харахад л хангалттай). Хэрэв гэрлийн эх үүсвэрийн "үзэгдэл" ямар нэгэн зүйлээр хаагдсан бол гэрлийн туяа эдгээр цэгүүдэд хэрхэн хүрэх вэ?

Би хэсэгт дурдсанчлан Өнгөт загваруудБие махбодид гэрэл тусах үед түүний зарим хэсэг нь шингэж, үлдсэн хэсэг нь үзэгдэлд тархдаг. Энэ нь гэрэл нь зөвхөн гэрлийн эх үүсвэрээс биш, гэрлийн эх үүсвэрээс түүнийг хүлээн авч, буцааж тарааж буй бусад объектуудаас ч гэрэл ирж болно гэсэн үг юм. Гэхдээ яагаад тэнд зогсох вэ? Сарнисан гэрэлтүүлэг нь эргээд өөр объект дээр унаж, нэг хэсэг нь шингэж, хэсэг нь дүр зураг дээр дахин тархдаг. Тусгал тус бүрт гэрэл тодорхой хэмжээгээрээ алддаг ч онолын хувьд та үргэлжлүүлж болно хязгааргүй(Тэмдэглэл: Үнэндээ үгүй, учир нь гэрэл нь квант шинж чанартай боловч хангалттай ойрхон байдаг.)

Энэ нь гэрлийн эх үүсвэрийг анхаарч үзэх хэрэгтэй гэсэн үг юм объект бүр. Таны төсөөлж байгаачлан энэ нь манай загварын нарийн төвөгтэй байдлыг ихээхэн нэмэгдүүлж байгаа тул бид энэ замаар явахгүй (Тэмдэглэл: гэхдээ та ядаж Google-ээс Global Illumination-д ороод гайхалтай зургуудыг үзэх боломжтой).

Гэхдээ бид объект бүрийг шууд гэрэлтүүлэх эсвэл бүрэн харанхуй болгохыг хүсэхгүй байна (хэрэв бид нарны аймгийн загварыг гаргахгүй бол). Энэ саадыг даван туулахын тулд бид гэрлийн эх үүсвэрийн гуравдахь төрлийг тодорхойлох болно орчны гэрэлтүүлэг, энэ нь зөвхөн тодоор тодорхойлогддог. Энэ нь үзэгдлийн бүх цэгүүдэд гэрэлтүүлгийн болзолгүй хувь нэмрээ оруулдаг гэж үздэг. Энэ бол гэрэл ба үзэгдлийн гадаргуугийн хоорондох маш нарийн төвөгтэй харилцан үйлчлэлийн асар том хялбаршуулсан зүйл боловч энэ нь ажилладаг.

Нэг цэгийн гэрэлтүүлэг

Ерөнхийдөө үзэгдэл нь нэг орчны гэрлийн эх үүсвэртэй байх болно (учир нь орчны гэрэл нь зөвхөн тод байдлын утгатай бөгөөд тэдгээрийн аль ч тоо нь нэг орчны гэрлийн эх үүсвэрт нийлдэг) болон дурын тооны цэг болон чиглэлтэй гэрлүүд байх болно.

Нэг цэгийн гэрэлтүүлгийг тооцоолохын тулд бид эх үүсвэр бүрийн оруулсан гэрлийн хэмжээг тооцоолж, тэдгээрийг нэгтгэж цэгийн хүлээн авсан нийт гэрэлтүүлгийн хэмжээг илэрхийлэх нэг тоог гаргах хэрэгтэй. Дараа нь бид зөв гэрэлтүүлэх өнгийг авахын тулд тухайн цэгийн гадаргуугийн өнгийг энэ тоогоор үржүүлж болно.

Тэгэхээр, чиглэлтэй эсвэл цэгийн эх үүсвэрийн чиглэлтэй гэрлийн туяа манай үзэгдлийн аль нэг объектын P цэгт хүрэхэд юу болох вэ?

Зөн совингийн хувьд бид объектыг гэрэлтэй хэрхэн харьцаж байгаагаас нь хамааран ерөнхий хоёр ангилалд ангилж болно: "царцсан" ба "гялалзсан". Бидний эргэн тойрон дахь ихэнх объектыг "царцсан" гэж үзэж болох тул бид тэднээс эхэлнэ.

Сарнисан тархалт

Гэрлийн туяа царцсан объект дээр унах үед түүний гадаргуу нь микроскопийн түвшинд тэгш бус байдаг тул туяаг бүх чиглэлд жигд тусгадаг, өөрөөр хэлбэл "тарсан" ("сарнисан") тусгалыг олж авдаг. .

Үүнийг шалгахын тулд зарим царцсан объектыг, жишээлбэл, ханыг сайтар хараарай: хэрвээ та хана дагуу хөдөлвөл түүний өнгө өөрчлөгдөхгүй. Өөрөөр хэлбэл, объектоос ойж буй гэрэл нь объектыг хаанаас ч харсан ижил байна.

Нөгөө талаас ойсон гэрлийн хэмжээ нь гэрлийн туяа болон гадаргуугийн хоорондох өнцөгөөс хамаарна. Энэ нь зөн совингийн хувьд тодорхой юм - өнцгөөс хамааран цацрагийн дамжуулсан энерги нь жижиг эсвэл том гадаргуу дээр тархах ёстой, өөрөөр хэлбэл үзэгдэлд туссан нэгж талбайд ногдох энерги нь тус тус өндөр эсвэл бага байх болно.

Үүнийг математикийн хувьд илэрхийлэхийн тулд гадаргуугийн чиглэлийг түүгээр нь тодорхойлъё хэвийн вектор. Ердийн вектор буюу зүгээр л "хэвийн" гэдэг нь ямар нэгэн цэг дээр гадаргуутай перпендикуляр байдаг вектор юм. Энэ нь мөн нэгж вектор бөгөөд урт нь 1 гэсэн утгатай. Бид үүнийг вектор гэж нэрлэх болно.

Сарнисан тусгалын загварчлал

Тиймээс чиглэл, тод гэрэлтэй гэрлийн туяа хэвийн гадаргуу дээр унадаг. Аль хэсэг нь дүр зурагт буцаж тусгагдсан нь , ба ?

Геометрийн зүйрлэлийн хувьд гэрлийн тод байдлыг цацрагийн "өргөн" гэж үзье. Түүний энерги нь хэмжээтэй гадаргуу дээр тархдаг. Хэзээ ба ижил чиглэлтэй, өөрөөр хэлбэл цацраг нь гадаргууд перпендикуляр байх бөгөөд энэ нь нэгж талбайд туссан энерги нь нэгж талбайд туссан энергитэй тэнцүү байна гэсэн үг юм;< . С другой стороны, когда угол между и приближается к , приближается к , то есть энергия на единицу площади приближается к 0; . Но что происходит в промежутках?

Нөхцөл байдлыг доорх диаграммд харуулав. Бид мэднэ, мөн; Энэ диаграмтай холбоотой тэмдэглэлийг хялбар болгохын тулд би өнцөг болон , мөн цэгүүдийг нэмсэн.

Техникийн хувьд гэрлийн туяа нь өргөнгүй тул бүх зүйл гадаргуугийн хязгааргүй жижиг хавтгай талбайд тохиолддог гэж үзэх болно. Хэдийгээр энэ нь бөмбөрцгийн гадаргуу байсан ч гэсэн энэ талбай нь маш хязгааргүй жижиг бөгөөд энэ нь бөмбөрцгийн хэмжээтэй харьцуулахад бараг хавтгай юм.

Өргөнтэй гэрлийн туяа гадаргуу дээр өнцгөөр нэг цэг дээр тусдаг. Нэг цэгийн хэвийн хэмжээ нь -тэй тэнцүү байх ба цацрагийн дамжуулсан энерги нь дээр тархсан байна. Бид тооцоолох хэрэгтэй.

Нэг өнцөг нь тэнцүү, нөгөө нь тэнцүү байна. Дараа нь гурав дахь өнцөг нь тэнцүү байна. Гэхдээ тэд бас зөв өнцөг үүсгэдэг гэдгийг тэмдэглэх нь зүйтэй, өөрөөр хэлбэл тэд бас байх ёстой. Тиймээс,:

Гурвалжинг харцгаая. Түүний өнцөг нь , ба -тай тэнцүү байна. Хажуу тал нь тэнцүү, тал нь тэнцүү байна.

Тэгээд одоо ... тригонометр нь аврах ажилд ирдэг! A-priory; -аар, ба -аар солих ба бид авна


юу болж хувирдаг
Бид бараг дууслаа. - ба хоёрын хоорондох өнцөг бөгөөд өөрөөр хэлбэл гэж илэрхийлж болно
Мөн эцэст нь
Тиймээс бид гэрлийн ойсон хэсгийг гадаргуугийн норм ба гэрлийн чиглэлийн хоорондох өнцөгтэй холбосон маш энгийн тэгшитгэлтэй болно.

Илүү том өнцгөөр үнэ цэнэ нь сөрөг болно гэдгийг анхаарна уу. Хэрэв бид энэ утгыг эргэлзээгүйгээр ашиглавал үр дүн нь гэрлийн эх үүсвэр болно хасахгэрэл. Энэ нь ямар ч физик утгагүй; том өнцөг гэдэг нь гэрэл үнэхээр хүрч байна гэсэн үг буцажгадаргуу, мөн гэрэлтүүлсэн цэгийг гэрэлтүүлэхэд хувь нэмэр оруулдаггүй. Өөрөөр хэлбэл, хэрэв энэ нь сөрөг байвал бид үүнийг тэнцүү гэж үзнэ.

Сарнисан тусгалын тэгшитгэл

Бид одоо орчны гэрэлтэлттэй дүр зураг болон тодорхой (чиглэлийн эх үүсвэрийн хувьд) эсвэл P-ээр тооцсон гэрэлтэлт ба гэрлийн вектор бүхий цэг эсвэл чиглэлтэй гэрлийн эх үүсвэрийн хэвийн цэгийн хүлээн авсан гэрлийн нийт хэмжээг тооцоолох тэгшитгэлийг томъёолж болно. цэгийн эх сурвалжууд):
Тухайн цэгийг гэрэлтүүлэхэд ямар нэр томъёо нэмж болохгүй гэдгийг дахин давтах нь зүйтэй.

Бөмбөрцгийн хэвийн хэмжээ

Энд дутагдаж байгаа цорын ганц жижиг зүйл бол хэвийн байдал хаанаас ирдэг вэ?

Энэ асуулт нь санагдсанаас хамаагүй илүү төвөгтэй бөгөөд бид нийтлэлийн хоёрдугаар хэсэгт үзэх болно. Аз болоход, бидний авч үзэж байгаа тохиолдолд маш энгийн шийдэл байдаг: бөмбөрцгийн аль ч цэгийн хэвийн вектор нь бөмбөрцгийн төвийг дайран өнгөрөх шулуун шугам дээр байрладаг. Өөрөөр хэлбэл, хэрэв бөмбөрцгийн төв нь байвал хэвийн цэг рүү чиглэсэн чиглэл нь дараахтай тэнцүү байна.

Би яагаад "хэвийн" биш харин "хэвийн чиглэл" гэж бичсэн юм бэ? Гадаргуутай перпендикуляр байхаас гадна нормаль нь нэгж вектор байх ёстой; Хэрэв бөмбөрцгийн радиус нь -тэй тэнцүү бол энэ нь үнэн байх бөгөөд энэ нь үргэлж үнэн байдаггүй. Нормативыг өөрөө тооцоолохын тулд бид векторыг уртаар нь хувааж, уртыг олж авах хэрэгтэй.


Дээр бичсэн гэрэлтүүлгийн тэгшитгэл нь -д хуваагдах тул энэ нь гол төлөв онолын сонирхол татдаг боловч "үнэн" нормыг бий болгох нь сайн арга байх болно; Энэ нь цаашдаа бидний ажлыг хөнгөвчлөх болно.

Сарнисан тусгал бүхий дүрслэл

Энэ бүгдийг псевдокод болгон хөрвүүлье. Эхлээд үзэгдэлд хэд хэдэн гэрэл нэмье:

Гэрэл ( төрөл = орчны эрчим = 0.2 ) гэрэл ( төрөл = цэгийн эрчим = 0.6 байрлал = (2, 1, 0) ) гэрэл ( төрөл = чиглэлийн эрчим = 0.2 чиглэл = (1, 4, 4) )
Гэрэлтүүлгийн тэгшитгэл нь ямар ч цэг нэгээс илүү гэрлийн хурц тод байх боломжгүй гэсэн утгатай тул гэрэлтүүлгийг товчоор тайлбарласан болохыг анхаарна уу. Энэ нь бид "хэт их ил гарсан" газруудтай үлдэхгүй гэсэн үг юм.

Гэрэлтүүлгийн тэгшитгэлийг псевдокод болгон хувиргахад хялбар байдаг:

ComputeLighting(P, N) ( үзэгдэл дэх гэрлийн хувьд i = 0.0. Гэрэл (хэрэв гэрэл. төрөл == орчны ( i += гэрэл. эрчим ) бол (хэрэв гэрэл. төрөл == цэг L = гэрэл. байрлал - P өөр L бол). = гэрэл.чиглэл n_dot_l = цэг(N, L) хэрэв n_dot_l > 0 i += light.intensity*n_dot_l/(урт(N)*урт(L)) ) буцаана i )
Зөвхөн TraceRay дээр ComputeLighting ашиглах л үлдлээ. Бид бөмбөрцгийн өнгийг буцааж өгөх мөрийг солих болно

Хамгийн ойрын_бөмбөрцөг.өнгө буцаана
энэ хэсэг рүү:

P = O + хамгийн ойрын_t*D # огтлолцлыг тооцоолох N = P - хамгийн ойрын_бөмбөрцөг.төв # огтлолцлын цэг дээрх бөмбөрцгийн нормийг тооцоолох N = N / урт(N) буцах хамгийн ойрын_бөмбөрцөг.color*ComputeLighting(P, N)
Хөгжилтэй байхын тулд том шар бөмбөрцөг нэмье:

Бөмбөрцөг (өнгө = (255, 255, 0) # Шар төв = (0, -5001, 0) радиус = 5000 )
Бид дүрслэгчийг асааж, харагтун, бөмбөрцөгүүд эцэст нь бөмбөрцөг шиг харагдаж эхэлнэ!

Гэхдээ хүлээгээрэй, том шар бөмбөрцөг яаж хавтгай шар шал болж хувирав?

Энэ нь тийм биш байсан, зүгээр л нөгөө гурвынх нь хувьд маш том биетэй, камер нь түүнд маш ойрхон тул хавтгай харагдаж байна. Яг л манай гараг гадаргуу дээр зогсоход хавтгай харагддаг шиг.

Гөлгөр гадаргуугаас тусгал

Одоо бид "гялалзсан" объектуудад анхаарлаа хандуулж байна. "Гялалзсан" объектууд нь "царцсан" объектуудаас ялгаатай нь тэдгээрийг өөр өөр өнцгөөс харахад гадаад төрх нь өөрчлөгддөг.

Бильярдын бөмбөг эсвэл зүгээр л угаасан машин авцгаая. Эдгээр объектууд нь гэрлийн тархалтын тодорхой хэв маягийг харуулдаг бөгөөд ихэвчлэн тэднийг тойрон алхах үед хөдөлж байгаа мэт тод хэсгүүд байдаг. Царцсан объектуудаас ялгаатай нь эдгээр объектын гадаргууг хэрхэн хүлээж авах нь таны үзэл бодлоос хамаарна.

Улаан бильярдын бөмбөлөгүүд хэд хэдэн алхам ухрахад улаан хэвээр үлддэг ч тэдэнд "гялалзсан" харагдах тод цагаан толбо хөдөлж байгааг анзаараарай. Энэ нь шинэ нөлөө нь сарнисан тусгалыг орлохгүй, харин түүнийг нөхөж байна гэсэн үг юм.

Яагаад ийм зүйл болж байна вэ? Бид яагаад ийм байна вэ гэдгээс эхэлж болно Үгүйцарцсан объектууд дээр үүсдэг. Өмнөх хэсэгт бидний харсанчлан гэрлийн туяа царцсан объектын гадаргуу дээр тусах үед тэр нь бүх чиглэлд жигд тархдаг. Зөн совингийн хувьд энэ нь объектын гадаргуугийн тэгш бус байдлаас үүдэлтэй, өөрөөр хэлбэл микроскопийн түвшинд санамсаргүй чиглэлд чиглэсэн олон жижиг гадаргуу шиг харагддаг.

Гэхдээ гадаргуу нь тэгш бус биш бол яах вэ? Нөгөө туйлшралыг авч үзье - төгс өнгөлсөн толь. Гэрлийн туяа толинд тусах үед нэг чиглэлд тусдаг бөгөөд энэ нь толины хэвийн хэмжээтэй харьцуулахад тусах өнцөгт тэгш хэмтэй байдаг. Хэрэв бид ойсон гэрлийн чиглэлийг нэрлээд, энэ нь заадаг гэдгийг хүлээн зөвшөөрвөл дээрГэрлийн эх үүсвэрийн хувьд бид дараах нөхцөл байдлыг олж авна.

Гадаргууг "өнгөлөх" зэргээс хамааран энэ нь толин тусгалтай адил юм; өөрөөр хэлбэл бид "толин тусгал" тусгалыг олж авдаг (Латин "спекулум", өөрөөр хэлбэл "толин тусгал" гэсэн үг).

Төгс өнгөлсөн толины хувьд туссан гэрлийн туяа нэг чиглэлд тусдаг. Энэ нь толинд байгаа объектуудыг тодорхой харах боломжийг бидэнд олгодог: туссан туяа тус бүрт нэг туссан туяа байдаг. Гэхдээ объект бүр төгс өнгөлсөн байдаггүй; гэрлийн ихэнх хэсэг нь чиглэлд тусдаг боловч зарим нь ойролцоо чиглэлд тусдаг; -д ойртох тусам тэр чиглэлд илүү их гэрэл тусна. Объектын "гялалзсан" нь туссан гэрэл нь дараахаас холдох тусам хэр хурдан буурч байгааг тодорхойлдог.

Бидний харах өнцөг рүү хэр их гэрэл тусдагийг мэдэхийг бид сонирхож байна (учир нь бид цэг бүрийн өнгийг тодорхойлоход ашигладаг гэрэл юм). Хэрэв "харах вектор" нь камер руу чиглэж байгаа бол ба хоёрын хоорондох өнцөг бол бидэнд дараах зүйл байна:

Бүх гэрэл тусах үед. Гэрэл тусдаггүй. Сарнисан тусгалын нэгэн адил -ийн завсрын утгуудад юу тохиолдохыг тодорхойлох математик илэрхийлэл хэрэгтэй.

"Толь" тусгалыг загварчлах

Бүх загварууд физик загвар дээр суурилдаггүй гэж би өмнө нь дурьдсаныг санаж байна уу? За, үүний нэг жишээ энд байна. Доорх загвар нь дур зоргоороо боловч тооцоолоход хялбар, сайхан харагддаг тул ашигладаг.

Үүнийг авч үзье. Энэ нь сайн шинж чанартай: , , утгууд нь маш үзэсгэлэнтэй муруй дагуу аажмаар буурч байна:

Толин тусгал функцэд тавигдах бүх шаардлагыг хангасан тул яагаад үүнийг ашиглаж болохгүй гэж?

Гэхдээ бидэнд бас нэг нарийн ширийн зүйл дутуу байна. Энэ найрлагад бүх объектууд адилхан гэрэлтдэг. Янз бүрийн түвшний гялбаа үүсгэхийн тулд тэгшитгэлийг хэрхэн өөрчлөх вэ?

Энэхүү гялбаа нь таныг нэмэгдүүлэх тусам тусгалын функц хэр хурдан буурч байгааг илтгэх хэмжүүр гэдгийг бүү мартаарай. Янз бүрийн гэрлийн муруйг олж авах маш энгийн арга бол эерэг үзүүлэлтийн хүчийг тооцоолох явдал юм. Учир нь энэ нь тодорхой байна; өөрөөр хэлбэл, энэ нь зөвхөн "аль хэдийн"-тэй яг адилхан ажилладаг. Энд өөр өөр утгуудын хувьд:

Утга нь том байх тусмаа "нарийссан" шинж чанар нь -ийн ойролцоо байх ба объект илүү гялалзсан харагдана.

Ихэвчлэн дууддаг тусгалын үзүүлэлт, мөн энэ нь гадаргуугийн өмч юм. Загвар нь физик бодит байдалд үндэслээгүй тул утгыг зөвхөн туршилт, алдаагаар тодорхойлох боломжтой, өөрөөр хэлбэл утгыг "байгалийн" харагдах хүртэл тохируулах боломжтой (Тэмдэглэл: физикт суурилсан загвар ашиглах, хоёр цацрагийн тусгал функцийг (DRF) үзнэ үү )).

Бүгдийг нь нэгтгэе. Цацраг нь гадаргуу дээр нормтой тэнцүү, тусгалын индекс нь . Харах чиглэлд хэр их гэрэл тусах вэ?

Бид аль хэдийн энэ утга нь тэнцүү байна гэж шийдсэн байна , болон хоорондын өнцөг хаана байна, энэ нь эргээд харьцангуй тусгагдсан байна. Өөрөөр хэлбэл, эхний алхам нь ба -аас тооцоолох болно.

Бид хоёр вектор болгон задалж болно, тэгвэл , параллель ба перпендикуляр байна:

Энэ нь проекц юм; скаляр үржвэрийн шинж чанараар болон энэ проекцын урт нь -тэй тэнцүү байна гэдгийг үндэслэн. Энэ нь зэрэгцээ байх болно гэдгийг бид тодорхойлсон тул .

Учир нь бид үүнийг шууд авах боломжтой.

Одоо харцгаая; тэгш хэмтэй тул түүний зэрэгцээ бүрэлдэхүүн хэсэг нь -ийнхтэй ижил, перпендикуляр бүрэлдэхүүн хэсэг нь -ийн эсрэг; тэр бол :

Өмнө нь олж авсан илэрхийллүүдийг орлуулснаар бид олж авна


мөн бага зэрэг хялбаршуулж, бид олж авдаг

"Толь" тусгалын утга

Одоо бид "толь" тусгалын тэгшитгэлийг бичихэд бэлэн боллоо.

Сарнисан гэрэлтүүлгийн нэгэн адил энэ нь сөрөг байж болох тул бид үүнийг дахин үл тоомсорлох хэрэгтэй. Түүнчлэн, объект бүр гялалзах шаардлагагүй; Ийм объектын хувьд (бид үүнийг -ээр дамжуулан илэрхийлэх болно) "онцлог" утгыг огт тооцохгүй.

"Толь" тусгал бүхий дүрслэл

Бидний ажиллаж байсан "толин тусгал" тусгалаа дүр зураг дээр нэмье. Эхлээд үзэгдэлд зарим өөрчлөлтийг хийцгээе:

Бөмбөрцөг ( төв = (0, -1, 3) радиус = 1 өнгө = (255, 0, 0) # Улаан толбо = 500 # Гялалзсан ) бөмбөрцөг ( төв = (-2, 1, 3) радиус = 1 өнгө = ( 0, 0, 255) # Цэнхэр бөмбөрцөг = 500 # Гялалзсан ) бөмбөрцөг ( төв = (2, 1, 3) радиус = 1 өнгө = (0, 255, 0) # Ногоон толь = 10 # Бага зэрэг гялалзсан ) бөмбөрцөг ( өнгө = (255, 255, 0) # Шар төв = (0, -5001, 0) радиус = 5000 толь = 1000 # Маш гялалзсан )
Код дээр бид ComputeLighting-ийг өөрчлөх шаардлагатай бөгөөд шаардлагатай бол "specularity" утгыг тооцоолж, ерөнхий гэрэлтүүлэгт нэмнэ. Энэ нь одоо дараах зүйлийг шаарддаг болохыг анхаарна уу:

ComputeLighting(P, N, V, s) ( үзэгдэл дэх гэрлийн хувьд i = 0.0. Гэрэл (хэрэв гэрэл. төрөл == орчны ( i += гэрэл. эрчим ) бол өөр (хэрэв гэрэл. төрөл == цэг L = гэрэл. байрлал бол). - P өөр L = гэрэл.чиглэл # Сарнисан n_цэг_l = цэг(N, L) хэрэв n_цэг > 0 i += гэрэл.intensity*n_dot_l/(урт(N)*урт(L)) # Тооцоолол s != -1 ( R = 2*N*цэг(N, L) - L r_dot_v = цэг(R, V) бол r_dot_v >
Эцэст нь бид TraceRay-ийг шинэ ComputeLighting параметрүүдийг нэвтрүүлэхийн тулд өөрчлөх хэрэгтэй. илэрхий; Энэ нь бөмбөрцгийн өгөгдлөөс авсан болно. Гэхдээ яах вэ? нь объектоос камер руу чиглэсэн вектор юм. Аз болоход TraceRay дээр бид камераас объект руу чиглэсэн вектортой болсон - энэ бол зурсан цацрагийн чиглэл юм! Энэ нь энгийн зүйл юм.

"Толь" тусгалтай шинэ TraceRay код энд байна:

TraceRay(O, D, t_min, t_max) ( ойрын_t = inf хамгийн ойрын_бөмбөрцөг = үзэгдэл дэх бөмбөрцгийн NULL. Бөмбөрцөг ( t1, t2 = IntersectRaySphere(O, D, бөмбөрцөг) хэрэв t1 ба t1 бол< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } if closest_sphere == NULL return BACKGROUND_COLOR P = O + closest_t*D # Вычисление пересечения N = P - closest_sphere.center # Вычисление нормали сферы в точке пересечения N = N / length(N) return closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) }
Энэ бүх векторуудтай хийсэн жонглёрын шагнал энд байна:

Сүүдэр

Гэрэл, объект байгаа газар сүүдэр бас байх ёстой. Тэгэхээр бидний сүүдэр хаана байна вэ?

Илүү үндсэн асуултаас эхэлье. Яагаад ёстойсүүдэр болох уу? Гэрэл байгаа газарт сүүдэр гарч ирдэг боловч түүний туяа нь тухайн объектод хүрч чадахгүй, учир нь тэдний замд өөр объект байдаг.

Өмнөх хэсэгт бид өнцөг, векторын талаар сонирхож байсан ч бид зөвхөн гэрлийн эх үүсвэр, өнгөөр ​​​​будах ёстой цэгийг л авч үзэн, тухайн үзэгдэлд болж буй бусад бүх зүйлийг, тухайлбал, дотогшоо орж буй объектыг огт тоохгүй байсныг та анзаарах болно. арга.

Үүний оронд бид "гэж хэлэх логикийг нэмэх хэрэгтэй. Хэрэв цэг ба эх үүсвэрийн хооронд объект байгаа бол энэ эх үүсвэрээс гарч буй гэрэлтүүлгийг нэмэх шаардлагагүй болно".

Бид дараах хоёр тохиолдлыг онцлохыг хүсч байна.

Үүнийг хийхэд шаардлагатай бүх хэрэгсэл бидэнд байгаа бололтой.

Чиглэлийн эх сурвалжаас эхэлье. Бид мэднэ ; Энэ бол бидний сонирхлыг татдаг зүйл юм. Бид мэднэ ; Энэ нь гэрлийн эх үүсвэрийг тодорхойлох нэг хэсэг юм. ба-тай бол бид цэгээс хязгааргүй алслагдсан гэрлийн эх үүсвэр рүү дамждаг туяаг тодорхойлж болно. Энэ туяа өөр объекттой огтлолцдог уу? Хэрэв тийм биш бол цэг ба эх үүсвэрийн хооронд юу ч байхгүй, өөрөөр хэлбэл бид энэ эх үүсвэрээс гэрэлтүүлгийг тооцоолж, нийт гэрэлтүүлэгт нэмж болно. Хэрэв энэ нь хөндлөн гарсан бол бид энэ эх сурвалжийг үл тоомсорлодог.

Бид туяа ба бөмбөрцгийн хоорондох хамгийн ойрын огтлолцлыг хэрхэн тооцоолохыг аль хэдийн мэддэг болсон; Бид үүнийг камерын цацрагийг хянахад ашигладаг. Бид үүнийг гэрлийн туяа болон үзэгдлийн үлдсэн хэсгийн хоорондох хамгийн ойрын огтлолцлыг тооцоолоход дахин ашиглаж болно.

Гэсэн хэдий ч параметрүүд нь арай өөр байна. Камераас эхлэхийн оронд туяа нь . Чиглэл нь биш, харин . Мөн бид хязгааргүй зайд байгаа бүх зүйлтэй огтлолцохыг сонирхож байна; энэ нь гэсэн үг ба .

Бид цэгийн эх сурвалжийг хоёр эс тооцвол тун төстэй байдлаар авч үзэж болно. Нэгдүгээрт, , гэж заагаагүй боловч эх үүсвэрийн байрлалаас тооцоолоход маш хялбар бөгөөд . Хоёрдугаарт, бид -ээс эхэлсэн аливаа уулзварыг сонирхож байна, гэхдээ зөвхөн хүртэл (өөрөөр бол объектууд) ардгэрлийн эх үүсвэр нь сүүдэр үүсгэж болно!); өөрөөр хэлбэл, энэ тохиолдолд болон .

Бидний анхаарах ёстой нэг захын тохиолдол бий. Нэг цацраг авцгаая. Хэрэв бид -ээс эхэлсэн уулзваруудыг хайж олох юм бол энэ нь үнэхээр бөмбөрцөг дээр байгаа тул -г олох магадлалтай ба ; өөрөөр хэлбэл, объект бүр өөр дээрээ сүүдэр тусгах болно (Тэмдэглэл: илүү нарийвчлалтай, бид бүхэл бүтэн объект биш харин цэг нь өөр дээрээ сүүдэр тусгах нөхцөл байдлаас зайлсхийхийг хүсч байна; бөмбөрцөгөөс илүү төвөгтэй хэлбэртэй объект (тухайлбал ямар ч хотгор биет) өөр дээрээ жинхэнэ сүүдэр тусгаж чадна!

Үүнийг шийдвэрлэх хамгийн энгийн арга бол -ийн оронд жижигийг доод хязгаар болгон ашиглах явдал юм. Геометрийн хувьд бид туяа нь гадаргуугаас бага зэрэг хол, өөрөөр хэлбэл -тэй ойрхон, гэхдээ яг цагт биш гэдгийг баталгаажуулахыг хүсч байна. Өөрөөр хэлбэл, чиглэлтэй эх үүсвэрийн хувьд интервал нь , цэгийн эх үүсвэрийн хувьд - байна.

Сүүдэртэй дүрслэх

Үүнийг псевдокод болгон хувиргацгаая.

Өмнөх хувилбарт TraceRay нь хамгийн ойрын туяа-бөмбөрцгийн уулзварыг тооцоолж, дараа нь уулзвар дээрх гэрэлтүүлгийг тооцоолсон. Бид сүүдрийг тооцоолохдоо дахин ашиглахыг хүсч байгаа тул бид хамгийн ойрын уулзварын кодыг гаргаж авах хэрэгтэй.

Хамгийн ойрын уулзвар(O, D, t_min, t_max) ( хамгийн ойрын_t = inf хамгийн ойрын_бөмбөрцөг = үзэгдэл дэх бөмбөрцгийн хувьд NULL. Бөмбөрцөг ( t1, t2 = t1 болон t1 бол IntersectRaySphere(O, D, бөмбөрцөг))< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } return closest_sphere, closest_t }
Үүний үр дүнд TraceRay нь илүү хялбар болсон:

TraceRay(O, D, t_min, t_max) (хамгийн ойрын_бөмбөрцөг, хамгийн ойрын_t = Хамгийн ойрын уулзвар(O, D, t_min, t_max) хэрэв хамгийн ойрын_бөмбөрцөг == NULL буцах BACKGROUND_COLOR P = O + хамгийн ойрын_t*D # N = - хамгийн ойрын_t*D уулзварыг тооцоолох. Тооцоолох бөмбөрцөг огтлолцол дээр хэвийн N = N / урт(N) буцах хамгийн ойрын_бөмбөрцөг.өнгө*ComputeLighting(P, N, -D, бөмбөрцөг.specular) )
Одоо бид ComputeLighting-д сүүдрийн чек нэмэх хэрэгтэй:

ComputeLighting(P, N, V, s) ( үзэгдэл дэх гэрлийн хувьд i = 0.0. Гэрэл (хэрэв гэрэл. төрөл == орчны ( i += гэрэл. эрчим ) өөр (хэрэв гэрэл. төрөл == цэг ( L = гэрэл). байрлал - P t_max = 1 ) else ( L = light.direction t_max = inf ) # Shadow shadow_sphere, shadow_t = Хамгийн ойрын огтлолцол(P, L, 0.001, t_max) хэрэв сүүдэр_бөмбөрцөг != NULL үргэлжлүүлнэ # Тархалт n_dot_l = t ) хэрэв n_dot_l > 0 i += light.intensity*n_dot_l/(length(N)*length(L)) # Specularity if s != -1 ( R = 2*N*dot(N, L) - L r_dot_v = цэг(R, V) хэрэв r_dot_v > 0 i += light.intensity*pow(r_dot_v/(урт(R)*урт(V)), s) ) ) ) буцаана i )
Бидний дахин үзүүлсэн дүр зураг иймэрхүү харагдах болно:


Эх код болон ажиллаж байгаа демо >>

ОдооБид аль хэдийн ямар нэгэн зүйл хийж байна.

Тусгал

Бидэнд гялалзсан объектууд бий. Гэхдээ яг л толь шиг ажилладаг объектуудыг бүтээх боломжтой юу? Мэдээжийн хэрэг, тэдгээрийг туяа хэмжигч дээр хэрэгжүүлэх нь үнэндээ маш энгийн, гэхдээ энэ нь эхлээд ойлгомжгүй мэт санагдаж магадгүй юм.

Толин тусгал хэрхэн ажилладагийг харцгаая. Толин тусгал руу харахад бид толинд туссан гэрлийн цацрагийг хардаг. Гэрлийн цацраг нь гадаргуугийн хэвийн хэмжээтэй харьцуулахад тэгш хэмтэй тусдаг.

Бид туяаг зурж байна гэж бодъё, хамгийн ойрын уулзвар бол толь. Гэрлийн туяа ямар өнгөтэй вэ? Мэдээжийн хэрэг, энэ нь толины өнгө биш, харин туссан туяа нь ямар ч өнгө юм. Бидний хийх ёстой зүйл бол ойсон цацрагийн чиглэлийг тооцоолж, тэр чиглэлээс ирж буй гэрлийн өнгө ямар байсныг олж мэдэх явдал юм. Өгөгдсөн туяанд тухайн чиглэлээс унах гэрлийн өнгийг буцаах функц бидэнд байсан бол...

Хүлээгээрэй, бидэнд нэг байгаа: үүнийг TraceRay гэдэг.

Тиймээс бид камераас ялгарах туяа юуг "харж" байгааг харахын тулд TraceRay гол гогцооноос эхэлнэ. Хэрэв TraceRay туяа нь цацруулагч объектыг хардаг болохыг тогтоовол туссан цацрагийн чиглэлийг тооцоолж, өөрөө ... дуудах хэрэгтэй.

Энэ үед би сүүлийн гурван догол мөрийг ойлгох хүртлээ дахин уншихыг санал болгож байна. Хэрэв та рекурсив туяа хянах талаар анх удаа уншиж байгаа бол та үүнийг хэд хэдэн удаа уншиж, бодитоор хийхээсээ өмнө бага зэрэг бодох хэрэгтэй. чи ойлгох болно.

Цаг заваа аваарай, би хүлээнэ.

Одоо энэ гайхалтай мөчийн эйфори Эврика!бага зэрэг унтлаа, үүнийг бага зэрэг албан ёсоор болгоё.

Бүх рекурсив алгоритмуудын хамгийн чухал зүйл бол хязгааргүй давталтаас урьдчилан сэргийлэх явдал юм. Энэ алгоритм нь тодорхой гарах нөхцөлтэй байдаг: цацраг нь тусгалгүй объектыг цохих эсвэл юуг ч цохихгүй байх үед. Гэхдээ бид хязгааргүй гогцоонд баригдаж болох энгийн тохиолдол байдаг: үр нөлөө төгсгөлгүй коридор. Энэ нь өөр толины өмнө толь тавиад, дотроос өөрийнхөө эцэс төгсгөлгүй хуулбарыг харах үед илэрдэг!

Энэ асуудлаас урьдчилан сэргийлэх олон арга бий. Бид орох болно рекурсын хязгааралгоритм; тэр явж чадах "гүн"-ээ хянах болно. Үүнийг нэрлэе. Хэзээ , бид объектуудыг хардаг, гэхдээ тусгалгүй. Бид зарим объект, зарим объектын тусгалыг харах үед. Бид зарим объектыг харахад зарим объектын тусгал мөн зарим объектын зарим тусгалын тусгал. гэх мэт. Ерөнхийдөө 2-3 түвшнээс илүү гүнзгийрэх нь утгагүй юм, учир нь энэ үе шатанд ялгаа нь бараг мэдэгдэхүйц биш юм.

Бид өөр нэг ялгааг бий болгоно. "Тус тусгал" гэдэг нь тэнд байгаа эсэх гэсэн үг биш юм - объектууд хэсэгчлэн тусгал, хэсэгчлэн өнгөтэй байж болно. Бид гадаргуу тус бүрт түүний тусгалыг тодорхойлдог тооноос - хүртэлх тоог өгнө. Үүний дараа бид орон нутгийн гэрэлтүүлэгтэй өнгө, туссан өнгийг энэ тоотой тэнцүү хэмжээгээр холино.

Эцэст нь TraceRay руу хийх рекурсив дуудлага ямар параметрүүдийг хүлээн авах ёстойг бид шийдэх хэрэгтэй. Цацраг нь объектын гадаргуугаас, цэгээс эхэлдэг. Цацрагийн чиглэл нь -аас туссан гэрлийн чиглэл юм; TraceRay-д бид камераас гэрлийн хөдөлгөөний эсрэг чиглэлтэй, өөрөөр хэлбэл туссан цацрагийн чиглэл нь -тэй харьцуулахад тусгагдана. Сүүдэрт тохиолддогтой адил бид объектууд өөрсдийгөө тусгахыг хүсдэггүй. Бид объектуудыг хичнээн хол байсан ч тусгалаа олж харахыг хүсдэг тул . Эцэст нь хэлэхэд, рекурсын хязгаар нь бидний одоогийн байгаа рекурсын хязгаараас нэгээр бага байна.

Тусгалтай дүрслэх

Raa tracer код дээр тусгал нэмье.

Өмнөх шигээ юуны түрүүнд бид дүр зургийг өөрчилдөг.

Бөмбөрцөг ( төв = (0, -1, 3) радиус = 1 өнгө = (255, 0, 0) # Улаан толин тусгал = 500 # Гялалзсан тусгал = 0.2 # Бага зэрэг тусгалтай ) бөмбөрцөг ( төв = (-2, 1, 3) радиус = 1 өнгө = (0, 0, 255) # Цэнхэр толбо = 500 # Гялалзсан тусгал = 0.3 # Бага зэрэг илүү тусгалтай ) бөмбөрцөг ( төв = (2, 1, 3) радиус = 1 өнгө = (0, 255, 0) # Ногоон толь = 10 # Бага зэрэг гялалзсан тусгал = 0.4 # Бүр илүү тусгалтай ) бөмбөрцөг ( өнгө = (255, 255, 0) # Шар төв = (0, -5001, 0) радиус = 5000 толь = 1000 # Маш гялалзсан тусгал = 0.5# Хагас тусгал)
Бид "тусгалын туяа" гэсэн томъёог хэд хэдэн газар ашигладаг тул үүнийг арилгах боломжтой. Энэ нь туяа ба нормыг хүлээн авч, туссан харьцангуйг буцаана:

ReflectRay(R, N) (буцах 2*N*цэг(N, R) - R; )
ComputeLighting-ийн цорын ганц өөрчлөлт нь тусгалын тэгшитгэлийг шинэ ReflectRay руу залгах замаар солих явдал юм.

Үндсэн аргад бага зэрэг өөрчлөлт оруулсан - бид дээд түвшний TraceRay-д рекурсын хязгаарыг нэвтрүүлэх хэрэгтэй:

Өнгө = TraceRay(O, D, 1, inf, рекурсын_гүнзгий)
Recursion_depth тогтмолыг 3 эсвэл 5 гэх мэт боломжийн утгаар тохируулж болно.

Зөвхөн чухал өөрчлөлтүүд нь TraceRay-ийн төгсгөлд тохиолддог бөгөөд бид тусгалыг рекурсив байдлаар тооцдог.

TraceRay(O, D, t_min, t_max, гүн) (хамгийн ойрын_бөмбөрцөг, хамгийн ойр_t = Хамгийн ойрын уулзвар(O, D, t_min, t_max) хэрэв хамгийн ойрын_бөмбөрцөг == NULL буцах BACKGROUND_COLOR # Орон нутгийн өнгийг тооцоолох P = O + хамгийн ойрын_t*D цэгийг тооцоолох # = P - хамгийн ойрын_бөмбөрцөг.төв # Уулзвар цэг дээр бөмбөрцгийн нормийг тооцоол N = N / урт(N) орон нутгийн_өнгө = хамгийн ойрын_бөмбөрцөг.өнгө*ComputeLighting(P, N, -D, sphere.specular) # Хэрэв бид хүрсэн бол рекурсын хязгаар эсвэл объект тусгалгүй бол бид дууслаа r = хамгийн ойрын_бөмбөрцөг.reflective бол гүн<= 0 or r <= 0: return local_color # Вычисление отражённого цвета R = ReflectRay(-D, N) reflected_color = TraceRay(P, R, 0.001, inf, depth - 1) return local_color*(1 - r) + reflected_color*r }
Үр дүн нь өөрөө ярих болно:

Рекурсын гүнийн хязгаарыг илүү сайн ойлгохын тулд дараах дүрслэлийг нарийвчлан авч үзье.

Энэ удаад дүрсэлсэн ижил дүр зургийг томруулсан зураг энд байна:

Таны харж байгаагаар ялгаа нь бид объектын тусгалын тусгалыг харж байна уу эсвэл зөвхөн объектын тусгалыг харж байна уу.

Захиалгат камер

Цацрагийн ажиглалтын талаар ярилцах хамгийн эхэнд бид хоёр чухал таамаглал дэвшүүлсэн: камер нь тогтмол ба тийшээ чиглэсэн, "дээш" чиглэл нь . Энэ хэсэгт бид эдгээр хязгаарлалтаас ангижрах бөгөөд ингэснээр камерыг үзэгдлийн аль ч хэсэгт байрлуулж, дурын чиглэлд чиглүүлэх боломжтой болно.

Албан тушаалаас эхэлье. Энэ нь псевдокодын туршид зөвхөн нэг удаа ашиглагддаг гэдгийг та анзаарсан байх: дээд түвшний аргад камераас гарах цацрагийн эхлэлийн цэг болгон. Хэрэв бид камерын байрлалыг өөрчлөхийг хүсвэл. Тэр цорын ганц зүйлтаны хийх ёстой зүйл бол өөр утгыг ашиглах явдал юм.

Өөрчлөлт нөлөөлж байна уу заалтууддээр чиглэлтуяа? Ямар ч байдлаар биш. Цацрагийн чиглэл нь камераас проекцын хавтгай руу дамжих вектор юм. Бид камерыг хөдөлгөхөд проекцын хавтгай нь камертай хамт хөдөлдөг бөгөөд энэ нь тэдгээрийн харьцангуй байрлал өөрчлөгдөхгүй гэсэн үг юм.

Одоо анхаарлаа чиглэл рүү хандуулъя. Бид хүссэн харах чиглэлд, мөн хүссэн "дээш" чиглэлд эргэдэг эргэлтийн матрицтай гэж үзье (мөн энэ нь эргэлтийн матриц учраас тодорхойлолтоор энэ нь шаардлагатай зүйлийг хийх ёстой). БайрлалКамераа эргүүлэхэд л камер өөрчлөгдөхгүй. Гэхдээ чиглэл нь өөрчлөгддөг, энэ нь бүхэл бүтэн камертай ижил эргэлтэнд ордог. Өөрөөр хэлбэл, хэрэв бид чиглэл, эргэлтийн матрицтай бол эргүүлэх нь энгийн зүйл юм.

Зөвхөн дээд түвшний функц өөрчлөгддөг:

[-Cw/2, Cw/2] дахь x-ийн хувьд ( [-Ch/2, Ch/2] дахь y-ийн хувьд ( D = camera.rotation * CanvasToViewport(x, y) өнгө = TraceRay(camera.position, D, 1, inf) canvas.PutPixel(x, y, өнгө) ) )
Өөр байр суурь, чиг баримжаагаар харахад бидний дүр зураг иймэрхүү харагдаж байна.

Дараа нь хаашаа явах вэ

Бид судалж үзээгүй зарим сонирхолтой сэдвүүдийн талаар товч тоймлон өгүүллийн эхний хэсгийг дуусгах болно.

Оновчлол

Оршил хэсэгт дурдсанчлан бид янз бүрийн боломжуудыг тайлбарлах, хэрэгжүүлэх хамгийн ойлгомжтой арга замыг хайж байсан. Тиймээс туяа хэмжигч нь бүрэн ажиллагаатай боловч тийм ч хурдан биш юм. Мөрдөгчөө хурдасгахын тулд та өөрөө судалж болох зарим санааг энд оруулав. Зүгээр л хөгжилтэй байхын тулд тэдгээрийг хэрэгжүүлэхээс өмнө болон дараа гүйцэтгэх хугацааг хэмжиж үзээрэй. Та маш их гайхах болно!

Зэрэгцээ байдал

Цацраагчийг хурдасгах хамгийн ойлгомжтой арга бол олон цацрагийг нэгэн зэрэг хянах явдал юм. Камераас гарч буй туяа тус бүр нь бусад бүхнээс хамааралгүй бөгөөд ихэнх бүтэц нь зөвхөн унших боломжтой байдаг тул цаг хугацааны асуудлаас болж бид CPU-ийн цөм болгонд нэг цацрагийг нэг их хүндрэл, нарийн төвөгтэй байдалгүйгээр мөрдөж чадна.

Үнэн хэрэгтээ туяа мөрдөгч нь алгоритмын ангилалд багтдаг туйлын зэрэгцүүлэх боломжтойУчир нь тэдний мөн чанар нь тэдгээрийг зэрэгцүүлэхэд хялбар болгодог.

Кэшлэх утгууд

IntersectRaySphere-ийн тооцоолсон утгуудыг авч үзье, үүнд цацраг хянагч ихэвчлэн ихэнх цагаа зарцуулдаг.

K1 = цэг(D, D) k2 = 2*цэг(OC, D) k3 = цэг(OC, OC) - r*r
Эдгээр утгуудын зарим нь үзэгдлийн туршид тогтмол байдаг - бөмбөрцөг хэрхэн байрлаж байгааг мэдсэний дараа r*r болон цэг (OC, OC) өөрчлөгдөхгүй. Үзэгдэл ачаалах үед та тэдгээрийг нэг удаа тооцоолж, тэдгээрийг бөмбөрцөгт өөрөө хадгалах боломжтой; Хэрэв бөмбөрцөг дараагийн хүрээ рүү шилжих шаардлагатай бол та тэдгээрийг тоолоход л хангалттай. цэг(D, D) нь өгөгдсөн цацрагийн тогтмол тул ClosestIntersection дээр тооцоолж IntersectRaySphere руу дамжуулж болно.

Сүүдрийн оновчлол

Хэрэв тухайн объектын цэг замд өөр объект илэрсэн тул гэрлийн эх үүсвэртэй харьцуулахад сүүдэрт байгаа бол түүний зэргэлдээх цэг нь мөн ижил объектын улмаас гэрлийн эх үүсвэртэй харьцуулахад сүүдэрт байх магадлал өндөр байна ( үүнийг гэж нэрлэдэг сүүдрийн тууштай байдал):

Өөрөөр хэлбэл, бид цэг ба гэрлийн эх үүсвэрийн хоорондох объектуудыг хайж байхдаа эхлээд ижил гэрлийн эх үүсвэртэй харьцуулахад өмнөх цэг дээр сүүдэрлэж буй сүүлчийн объект одоогийн цэг дээр сүүдэрлэж байгаа эсэхийг шалгаж болно. Хэрэв тийм бол бид дуусгаж чадна; Хэрэв тийм биш бол бид үлдсэн объектуудыг ердийн аргаар үргэлжлүүлэн шалгана.

Үүний нэгэн адил, гэрлийн туяа болон үзэгдэл дэх объектуудын хоорондох огтлолцлыг тооцоолохдоо бидэнд хамгийн ойрын огтлолцол огт хэрэггүй - дор хаяж нэг уулзвар байгаа гэдгийг мэдэхэд л хангалттай. Бид ClosestIntersection-ийн тусгай хувилбарыг ашиглаж болох бөгөөд энэ нь эхний уулзварыг олсон даруйд үр дүнг буцаана (мөн үүний тулд бид closest_t биш, зүгээр л логик утгыг тооцоолж, буцаах хэрэгтэй).

Орон зайн бүтэц

Бөмбөрцөг бүртэй цацрагийн огтлолцлыг тооцоолох нь маш их нөөцийн гарз юм. Тусдаа уулзваруудыг тооцоолох шаардлагагүйгээр бүхэл бүтэн бүлэг объектуудыг нэг дор хаях боломжийг олгодог олон өгөгдлийн бүтэц байдаг.

Ийм бүтцийг нарийвчлан авч үзэх нь бидний нийтлэлийн хамрах хүрээнээс гадуур боловч ерөнхий санаа нь: бид хоорондоо ойрхон хэд хэдэн бөмбөрцөгтэй гэж бодъё. Бид эдгээр бүх бөмбөрцгийг агуулсан хамгийн жижиг бөмбөрцгийн төв ба радиусыг тооцоолж болно. Хэрэв туяа энэ хилийн бөмбөрцөгтэй огтлолцохгүй бол энэ нь ямар ч бөмбөрцөгтэй огтлолцохгүй гэдэгт итгэлтэй байж болох бөгөөд үүнийг нэг уулзварын шалгалтаар хийж болно. Мэдээжийн хэрэг, хэрэв энэ нь бөмбөрцөгтэй огтлолцсон бол энэ нь түүнд агуулагдах аль нэг бөмбөрцөгтэй огтлолцсон эсэхийг шалгах шаардлагатай хэвээр байна.

Та энэ талаар уншсанаар илүү ихийг мэдэж болно хязгаарлах эзлэхүүний шатлал.

Дэд дээж авах

Эндээс туяа хэмжигчийг дахин хурдан болгох энгийн арга байна: дахин цөөн пикселийг тооцоол!

Бид пиксел болон туяаг зурсан ба тэдгээр нь нэг объект дээр унасан гэж бодъё. Пикселийн туяа мөн ижил объект дээр бууж, бүх дүр зурагтай огтлолцох эхний хайлтыг алгасаад тухайн цэгийн өнгийг тооцоолоход шууд очно гэж логикоор төсөөлж болно.

Хэрэв та үүнийг хэвтээ ба босоо чиглэлд хийвэл хамгийн ихдээ 75% -иар бага анхны туяаны уулзварын тооцоог хийж болно.

Мэдээжийн хэрэг, энэ нь маш нарийн объектыг амархан алдаж болно: өмнө дурдсан зүйлсээс ялгаатай нь энэ нь "буруу" оновчлол юм, учир нь түүний ашиглалтын үр дүн тийм ч сайн биш юм. адилхантүүнгүйгээр бид юу хүлээж авах байсан бол; Нэг ёсондоо бид эдгээр хэмнэлтийг “хууран мэхэлж” байна. Энэхүү заль мэх нь сэтгэл ханамжтай үр дүнд хүрэхийн тулд хэрхэн зөв хэмнэхийг таах явдал юм.

Бусад командууд

Өмнөх хэсгүүдэд бид бөмбөрцөгийг математикийн үүднээс удирдахад хялбар тул команд болгон ашигласан. Гэхдээ үүнд хүрсэний дараа та бусад командуудыг нэмж болно.

TraceRay-ийн үүднээс авч үзвэл аливаа объектыг зөвхөн хоёр утгыг тооцоолох шаардлагатай бол ашиглах боломжтой гэдгийг анхаарна уу: туяа ба объектын хоорондох хамгийн ойрын огтлолцлын утга ба огтлолцлын цэг дээрх хэвийн. Цацрагчийн бусад бүх зүйл объектын төрлөөс хамааралгүй байдаг.

Гурвалжин бол сайн сонголт юм. Эхлээд та гурвалжинг агуулсан цацраг ба хавтгайн хоорондох огтлолцлыг тооцоолох хэрэгтэй бөгөөд хэрэв огтлолцол байгаа бол тухайн цэг нь гурвалжин дотор байгаа эсэхийг тодорхойлно.

Конструктив блокийн геометр

Харьцангуй хэрэгжүүлэхэд хялбар маш сонирхолтой төрлийн объект байдаг: бусад объектуудын хоорондох логикийн үйлдэл. Жишээлбэл, хоёр бөмбөрцгийн огтлолцол нь линз шиг харагдах зүйлийг бий болгож чаддаг бол том бөмбөрцөгөөс жижиг бөмбөрцгийг хасвал Үхлийн одтой төстэй зүйлийг үүсгэж болно.

Хэрхэн ажилладаг? Объект бүрийн хувьд туяа нь объект руу орж, гарах байршлыг тооцоолж болно; жишээлбэл, бөмбөрцгийн хувьд туяа нь -д орж, гардаг. Бид хоёр бөмбөрцгийн огтлолцлыг тооцоолох хэрэгтэй гэж бодъё; туяа нь хоёр бөмбөрцөг дотор байх үед огтлолцлын дотор, харин эсрэг тохиолдолд гадна талд байна. Хасах тохиолдолд туяа нь эхний объектын дотор байх үед дотор нь байдаг, харин хоёр дахь нь дотор байдаггүй.

Ерөнхийдөө, хэрэв бид туяа ба туяа хоорондын огтлолцлыг тооцоолохыг хүсвэл (ямар ч Булийн оператор хаана байна) эхлээд туяа- ба туяа- хоёрын огтлолцлыг тусад нь тооцоолох хэрэгтэй бөгөөд энэ нь бидэнд объект бүрийн "дотоод" интервалыг өгдөг. Дараа нь бид "дотоод" интервалд байгаа үнэлдэг. Бид зүгээр л "дотоод" интервал болон бидний сонирхож буй интервал дахь анхны утгыг олох хэрэгтэй.

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

Мэдээжийн хэрэг, тэд анхдагч байх албагүй; Тэд өөрсдөө Булийн үйл ажиллагааны үр дүн байж болно! Үүнийг цэвэрхэн хэрэгжүүлбэл мэдэх ч хэрэггүй ХэрхэнБид тэдгээрээс огтлолцол болон нормыг авч чадах л бол тэд. Тиймээс та гурван бөмбөрцөг авч, тооцоолж болно, жишээлбэл, .

Ил тод байдал

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

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

Хугарал

Бодит амьдрал дээр гэрлийн туяа тунгалаг биетээр дамжин өнгөрөхдөө чиглэлээ өөрчилдөг (иймээс л сүрлийг аягатай усанд дүрэхэд "эвдэрсэн" мэт харагддаг). Чиглэлийг өөрчлөх нь үүнээс хамаарна Хугарлын индексматериал бүрийг дараах тэгшитгэлийн дагуу:
Гадаргууг огтлолцохоос өмнөх ба дараах туяа ба нормаль хоёрын хоорондох өнцөг хаана ба байх ба объектуудын гадна ба доторх материалын хугарлын илтгэгч юм.

Жишээлбэл, ойролцоогоор тэнцүү, ойролцоогоор тэнцүү байна. Өөрөөр хэлбэл, бид өнцгөөр ус руу орох цацрагийг авдаг




Хэсэг зуур зогсоод ойлгоорой: хэрвээ та конструктив блок геометр, ил тод байдлыг хэрэгжүүлбэл физикийн хувьд зөв томруулдаг шил шиг ажиллах томруулдаг шилийг (хоёр бөмбөрцгийн огтлолцол) загварчилж болно!

Супер дээж авах

Supersampling гэдэг нь бид хурдны оронд нарийвчлалыг эрэлхийлдэг дэд дээжийн бараг эсрэг зүйл юм. Хоёр зэргэлдээх пикселтэй харгалзах туяа хоёр өөр объект дээр уналаа гэж бодъё. Бид пиксел бүрийг тохирох өнгөөр ​​будах хэрэгтэй.

Гэсэн хэдий ч бидний эхлүүлсэн зүйрлэлийг бүү мартаарай: туяа тус бүрийн "тодорхойлох" өнгийг тохируулах ёстой. дөрвөлжинБидний харж буй "сүлжээ". Пиксел тутамд нэг цацрагийг ашиглан бид квадратын дундуур өнгөрч буй гэрлийн цацрагийн өнгө нь талбайг бүхэлд нь тодорхойлдог гэж үздэг боловч энэ нь тийм биш байж магадгүй юм.

Энэ асуудлыг шийдэх арга бол пиксел бүрт олон тооны туяа - 4, 9, 16 гэх мэтийг ажиглаж, дараа нь пикселийн өнгийг олж авахын тулд тэдгээрийг дундажлах явдал юм.

Мэдээжийн хэрэг, энэ нь туяа хэмжигчийг 4, 9 эсвэл 16 дахин удаашруулдаг бөгөөд энэ нь түүврийн хэмжээг багасгахад хурдасгадагтай ижил шалтгаанаар. Аз болоход буулт хийж байна. Объектын шинж чанар нь түүний гадаргуугийн дагуу жигд өөрчлөгддөг гэж бид таамаглаж болно, өөрөөр хэлбэл нэг объектыг бага зэрэг өөр цэгүүдэд мөргөж буй пиксел тутамд 4 цацраг ялгаруулах нь үзэгдлийн харагдах байдлыг төдийлөн сайжруулахгүй гэсэн үг юм. Тиймээс бид нэг пикселийн цацрагаас эхэлж, хөрш зэргэлдээх туяаг харьцуулж болно: хэрэв тэдгээр нь бусад объектууд дээр унасан эсвэл тэдгээрийн өнгө нь дахин хуваасан босго утгаас илүү ялгаатай байвал бид хоёуланд нь пикселийн хуваагдлыг хэрэглэнэ.

Ray Tracer псевдокод

Доорх нь туяа мөрдөх бүлгүүдэд бидний бүтээсэн псевдокодын бүрэн хувилбар юм.

CanvasToViewport(x, y) ( буцах (x*Vw/Cw, y*Vh/Ch, d) ) ReflectRay(R, N) ( буцах 2*N*цэг(N, R) - R; ) ComputeLighting(P, N, V, s) ( үзэгдэл дэх гэрлийн хувьд i = 0.0. Гэрэл (хэрэв гэрэл. төрөл == орчны ( i += гэрэл. эрчим ) өөр ( гэрэл. төрөл == цэг ( L = гэрэл. байрлал - P t_max бол) = 1 ) else ( L = light.direction t_max = inf ) # Сүүдрийг шалгаж байна shadow_sphere, shadow_t = Хамгийн ойрын огтлолцол(P, L, 0.001, t_max) хэрэв сүүдэр_бөмбөрцөг != NULL үргэлжлэх # Тархалт n_dot_l = цэг(N, L) бол >n_do) 0 i += light.intensity*n_dot_l/(урт(N)*урт(L)) # Гэрэлтэх s != -1 ( R = ReflectRay(L, N) r_dot_v = цэг(R, V) бол r_dot_v > 0 i += light.intensity*pow(r_dot_v/(length(R)*length(V)), s) ) ) буцах i ) Хамгийн ойрын уулзвар(O, D, t_min, t_max) ( closest_t = inf closest_sphere = бөмбөрцгийн хувьд NULL үзэгдэл.Бөмбөлөг ( t1, t2 = IntersectRaySphere(O, D, бөмбөрцөг) хэрэв t1 in болон t1 бол< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } return closest_sphere, closest_t } TraceRay(O, D, t_min, t_max, depth) { closest_sphere, closest_t = ClosestIntersection(O, D, t_min, t_max) if closest_sphere == NULL return BACKGROUND_COLOR # Вычисление локального цвета P = O + closest_t*D # Вычисление точки пересечения N = P - closest_sphere.center # Вычисление нормали сферы в точке пересечения N = N / length(N) local_color = closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) # Если мы достигли предела рекурсии или объект не отражающий, то мы закончили r = closest_sphere.reflective if depth <= 0 or r <= 0: return local_color # Вычисление отражённого цвета R = ReflectRay(-D, N) reflected_color = TraceRay(P, R, 0.001, inf, depth - 1) return local_color*(1 - r) + reflected_color*r } for x in [-Cw/2, Cw/2] { for y in [-Ch/2, Ch/2] { D = camera.rotation * CanvasToViewport(x, y) color = TraceRay(camera.position, D, 1, inf) canvas.PutPixel(x, y, color) } }
Энд жишээнүүдийг үзүүлэхэд ашигласан дүр зураг байна:

Харах талбарын_хэмжээ = 1 x 1 проекцын_онгоц d = 1 бөмбөрцөг ( төв = (0, -1, 3) радиус = 1 өнгө = (255, 0, 0) # Улаан толбо = 500 # Гялалзсан тусгал = 0.2 # Бага зэрэг тусгалтай ) бөмбөрцөг ( төв = (-2, 1, 3) радиус = 1 өнгө = (0, 0, 255) # Цэнхэр толбо = 500 # Гялалзсан цацруулагч = 0.3 # Бага зэрэг илүү тусгалтай ) бөмбөрцөг ( төв = (2, 1, 3) радиус = 1 өнгө = (0, 255, 0) # Ногоон specular = 10 # Бага зэрэг гялалзсан тусгал = 0.4 # Бүр илүү тусгалтай ) бөмбөрцөг (өнгө = (255, 255, 0) # Шар төв = (0, -5001, 0) радиус = 5000 specular = 1000 # Маш гялалзсан тусгал = 0.5 # Хагас тусгал) гэрэл ( төрөл = орчны эрчим = 0.2 ) гэрэл ( төрөл = цэгийн эрчим = 0.6 байрлал = (2, 1, 0) ) гэрэл ( төрөл = чиглэлийн эрчим = 0.2 чиглэл = (1, 4, 4) )

Шошго: шошго нэмэх

Энэ нийтлэлд компьютер тоглоомын дүрсийг дүрслэн харуулах урвуу туяаны аргыг ашиглах талаар авч үзэх болно. Уламжлалт технологитой харьцуулахад түүний давуу болон сул талуудыг авч үздэг. Энэ түүх нь бүхэлдээ урвуу туяа хянах зарчим дээр бүтээгдсэн график хөдөлгүүрийг анх удаа ашигласан концепцийн 3D тоглоомын тухай юм. Тоглоомын видео хурдасгагчийг хөгжүүлэх талаар мөн хөндөж байна.

Уламжлалт технологи

3D графикийн онолын талаар мэдлэггүй хүмүүст зориулж урвуу туяаг хянах арга гэж юу болох, тоглоомын графикийн уламжлалт аргаас юугаараа ялгаатай болохыг товч тайлбарлах болно. Компьютерийн тоглоомын дүрсийг дүрслэн харуулах уламжлалт аргад дүр зураг, хэрэв хүсвэл тоглоомын ертөнцийг гурвалжингаар дүрсэлсэн байдаг. Гурвалжин бүрийн хувьд бүтэц, гэрэлтүүлгийн түвшинг зааж өгсөн болно. Дараа нь зураач цаасан дээр цул гурвалжин зурсантай адил гурвалжнуудыг бөөнөөр нь 3D хурдасгуур руу түлхэж зурдаг. Үүний ялгаа нь гүний буфер ашиглах явдал юм. Үзэгдэл дээрх бусад объектоор бүрхэгдсэн гурвалжин зурахаас зайлсхийхийн тулд гүн буфер шаардлагатай. Шинэ гурвалжны цэгүүдийг зурахдаа харгалзах гүний буферийн утгыг шалгана. Z-буфер гэж нэрлэгддэг гүн буфер нь ажиглагчаас аль хэдийн зурсан зураг хүртэлх зайг хадгалдаг. Хэрэв шинэ гурвалжны цэг хүртэлх зай нь Z-буферт бүртгэгдсэн утгаас бага байвал энэ цэг нь илүү ойр зайтай гурвалжны цэгүүдээр хамрахгүй бөгөөд үүнийг зурж болно, мөн гүн буферийн утга. мөн шинэчлэгдсэн. Энэ арга нь дурын нарийн төвөгтэй гурвалжнуудаас бүрдэх үзэгдлийн дүрсийг бүтээх боломжийг олгодог. Энэ аргын нэг давуу тал нь i386, i486 үеийн "эртний" процессорууд дээр бодит цаг хугацаанд, өндөр нарийвчлалтай тоглоомын дүр төрхийг бодитоор харуулах боломжтой юм.

Зургийг бүтээх янз бүрийн аргууд нь ажлын хурд, түүнчлэн бүтээсэн зургийн чанар, бодит байдал, гоо үзэсгэлэнгээс ялгаатай байж болно. Мэдээжийн хэрэг, илүү бодитой зураг зурах аргууд нь илүү их тооцоолох нөөц шаарддаг. Мэдээжийн хэрэг бид удаан ажилладаг, муу зурдаг муу аргуудыг авч үзэхгүй. Компьютер тоглоомын салбарын хөгжлийн эхэн үед, персонал компьютерууд харьцангуй бага чадалтай байх үед угаасаа хамгийн хурдан, тооцоолол бага шаарддаг дүрслэх аргыг сонгосон нь дээр дурдсан Z-буферийн аргыг сонгосон юм.

Гэсэн хэдий ч гурван хэмжээст дүр зураг нь зөвхөн геометрийн нарийн ширийн зүйлсээс бүрдэх төдийгүй гэрэлгүйгээр төсөөлөхийн аргагүй юм. Мөн Z-буфер арга нь зөвхөн үзэгдлийн геометрийг зурах боломжийг олгодог. Юу хийх вэ? Гэрлийн тархалтын яг физик загвар нь маш нарийн төвөгтэй бөгөөд бид байгалийн гэрэлд ойртох талаар ярьж болно. Шууд гэрлийн туяа хүрэхгүй сүүдэртэй газар харанхуй, гэрлийн эх үүсвэрийн ойролцоо гэрэлтэй байх шаардлагатай. Гэрэлтүүлгийн хувьд бодитой дүр төрхийг бий болгохын тулд тэд үзэгдэл дэх статик объектын гэрэлтүүлгийн утгыг агуулсан гэрлийн зураг гэж нэрлэгддэг урьдчилан тооцоолсон бүтцийг ашиглаж эхэлсэн. Энэ бүтэц нь материалын ердийн бүтэцтэй газар дээр нь хэрэглэж, үзэгдэл дээрх объектын байрлал, түүний гэрэлтүүлгээс хамааран харанхуй болгодог. Мэдээжийн хэрэг, энэ нь дүр зураг болон гэрлийн эх үүсвэрийн бүрэн хөдөлгөөнгүй байдлыг шаарддаг, учир нь эдгээр гэрлийн зураглалыг тооцоолоход маш удаан хугацаа шаардагддаг. Энэхүү технологи нь олон жилийн турш компьютер тоглоомд ашиглагдаж ирсэн бөгөөд түүний хэрэглээ нь график хөдөлгүүрийн хувьд 3D тоглоомууд нь зөвхөн нэг түвшний гурвалжин, бүтэцтэй тоогоор ялгаатай болоход хүргэсэн. Динамик гэрлийн эх үүсвэр, түвшинг устгах чадвар байгаагүйтэй адил гэрэлтүүлэг, сүүдэрлэх динамик тооцоо байхгүй тул байхгүй. Хэрэв та чийдэнг хөдөлгөж эсвэл цонхоо хаавал үзэгдлийн гэрэлтүүлэг өөрчлөгдөхгүй тул тоглоомонд энэ сонголт биш юм. Тодорхой газар ямар нэгэн зүйл хийх боломжтой гэж нэрлэгддэг хуурамч шийдэл байдаг, учир нь энэ боломжийг урьдчилан хангаж, бүх зүйлийг урьдчилан тооцдог.

Саяхан л динамик загварууд, бүх төрлийн мангасууд, роботуудын сүүдэр гарч ирэв. Эдгээр сүүдрийг хэрхэн тооцдог тухай сэдвийг бид бас хөндөх болно, гэхдээ ихэнхдээ тэдгээр нь байгалийн харагддаггүй, учир нь жишээлбэл, олон гэрлийн эх үүсвэр байдаг, гэхдээ сүүдэр нь зөвхөн нэгээс ирдэг, хурц, үзэсгэлэнтэй биш юм.
Тоглоомын графикийн хөгжил нь олон жилийн туршид зөвхөн шинэ үеийн график хурдасгуурууд гарч ирсэнтэй холбоотой байв. Үнэхээр гурвалжин зурах ажлыг хурдасгуур руу шилжүүлэх нь маш тохиромжтой байсан. Гурвалжныг растержуулах, бүтэцжүүлэх ажил нь тоглоомын графикийн гол цөмд оршдог тул тусгайлан оновчтой техник хангамжийг бий болгосноор энэхүү онцгой бөгөөд тодорхой үйлдлийг эрс хурдасгасан нь зүйн хэрэг юм. Гэсэн хэдий ч хурдасгуурыг ашигласнаар зөвхөн зургийн чанар сайжирч, өндөр чанартай бүтэцтэй давхцах горим, гурван шугаман болон анизотроп шүүлтүүр, илүү өндөр нарийвчлалтай, бүрэн дэлгэцийн зургийн эсрэг хамгаалалтыг ашиглах боломжтой болсон. Үзэсгэлэнгийн гэрэлтүүлэг, динамикийг тооцоолохын тулд юу ч өөрчлөгдөөгүй байна. Динамик гэрэлтүүлгийн дутагдал нь орчин үеийн тоглоомын түвшинг уйтгартай болгодог. Статик гэрэлтүүлэг, үзэгдэл аажмаар уйтгартай болдог. Цаг зогссон мэт, тоглогчид энэ зогссон цагт гүйж байна. Өнөө үед шинэ хурдасгууруудын чадавхийг судлахдаа тэд томруулдаг шилний доор дэлгэцийг харах дуртай бөгөөд дараа нь зургийн чанар бага зэрэг нэмэгдэхийг эрэлхийлдэг бөгөөд үүнийг тоглоомын явцад ялгахад маш хэцүү байдаг.

Туяа мөрдөх арга


Бодит үзэгдэл, хүүхэлдэйн кино, хүүхэлдэйн киног үзүүлэхдээ бодит гэрэлтүүлгийг тооцоолоход ямар аргыг ашигладаг вэ, ижил гэрлийн зураглалыг бүтээхэд ямар зарчим байдаг вэ? Энэ чиглэлээр туяа хянах арга, түүний өөрчлөлтүүд өргөн тархсан.

Процессорын тоймуудад 3DMax, LightWave болон бусад 3D график багцуудын туршилтын үр дүнг ихэвчлэн дурддаг. Бодит гэрэлтүүлэг, гэрлийн тусгал, хугарал бүхий цогц дүр зургийг гаргахад шаардагдах хугацааг хэмждэг. Энэ бол яг л туяа хянах аргыг ашиглан зурсан дүр зураг юм.

Z-буфер аргаас ялгаатай нь туяа хянах арга нь гэрэлтүүлгийн нарийн төвөгтэй загвар бүхий бодит дүр төрхийг бий болгох зорилготой юм. Урвуу туяаг хянах зарчим нь дэлгэцийн цэг бүрээр арагшаа гэрлийн цацрагийг тухайн үзэгдлийн хамгийн ойрын объекттой огтлолцох хүртэл татан авч, дараа нь энэ цэгээс гэрлийн эх үүсвэрийн чиглэлд туяа татдаг. гэрлийн тархалт. Хэрэв гэрлийн эх үүсвэр рүү галласан цацраг нь түүний зам дээр юу ч огтлолцохгүй бол энэ цэг нь гэрэлтдэг, эс тэгвээс сүүдэрт байрладаг. Хэрэв туяа толины гадаргуу дээр тусвал оптикийн хуулиудын дагуу ойсон туяа ялгардаг бөгөөд энэ нь тусгал үүсгэх боломжтой болгодог. Цацрагаар дамжих орчны шинж чанараас хамааран хугарч болох бөгөөд энэ нь нарийн төвөгтэй, бодит гэрэлтүүлгийн эффектийг дуурайлган хийх боломжтой болгодог. Энэ арга нь объектуудаас сүүдэр авахаас гадна туссан бүдэг гэрэл шууд сүүдэрт тусч, сүүдрийг бүдгэрүүлэх үед хоёрдогч гэрэлтүүлгийг тооцоолох боломжийг олгодог.

Гэсэн хэдий ч энэ арга нь тооцоолоход маш төвөгтэй гэдгийг ойлгоход хялбар байдаг. Та 3D загварчлалын программ дахь процессорын туршилтанд 1 фрейм хэр удаан тооцогдохыг анхаарч үзэх боломжтой. Энд бодит цагийн үнэр алга. Түүнээс гадна өмнө нь энэ нь хувийн компьютер дээр илүү удаан ажилладаг байсан бөгөөд энэ нь компьютерийн тоглоомд ашиглах зайгүй байв.
Гэвч сүүлийн хэдэн жилийн хугацаанд персонал компьютерийн хүчин чадал мэдэгдэхүйц нэмэгдэж, зургийн чанар, нягтралд маш их хязгаарлалттай байсан ч бараг бодит цаг хугацаанд туяа хянах боломжтой болсон.

Дэлгэц дээрх цэг бүрийн хувьд маш нарийн төвөгтэй туяа мөрдөх процедурыг хийх шаардлагатай байдаг тул мөрдөх хурд нь дэлгэцийн нягтрал болон түүний талбайгаас ихээхэн хамаардаг. Өөрөөр хэлбэл, 1024x768 хэмжээтэй зураг гаргахад 320x240 хэмжээтэй зураг гаргахаас 10 дахин урт хугацаа шаардагдана. Цацрагийн аргыг бодит цаг хугацаанд хэрэгжүүлэх боломжтой бөгөөд цорын ганц асуулт бол ямар нарийвчлалтай, ямар зургийн чанартай байх явдал юм.


Саяхныг хүртэл компьютер дээрх бодит цагийн туяаг хянах нь үзэсгэлэнтэй зураг зурдаг, гэхдээ бага хурдтай, нягтрал багатай ажилладаг жижиг демо программууд байсан. www.scene.org сайт дээр ийм олон нэвтрүүлэг байдаг. Гэсэн хэдий ч би туяа хянах аргын олон давуу талыг түр зуур золиосолж, бүрэн хэмжээний 3D хөдөлгүүрийг бүтээж, түүн дээр үндэслэн бодит цагийн туяаг хянах анхны компьютер тоглоомыг бүтээж чадсан.

Урвуу туяанд суурилсан 3D хөдөлгүүртэй концепцийн тоглоом

Төрөл бүрийн автомашины үзэсгэлэнд ирээдүйн автомашины бодит загвар болох концепц машинуудыг үзүүлж байна. Эдгээр нь маш үнэтэй, хэрэглэгчийн үүднээс дибаг хийгдээгүй боловч шинэ санааг илэрхийлдэг. Би концепц-тоглоом бүтээсэн. Орчин үеийн персонал компьютер дээр бодит цаг хугацаанд ажиллах боломжтой юуг та хэрэгжүүлж чадсан бэ?
Цацраг хянах хөдөлгүүрийн хувьд анхлан хоёр үндсэн шаардлагыг тавьсан: үзэгдлийн гэрэлтүүлгийг бүхэлд нь бодит цаг хугацаанд тооцоолох, урьдчилан тооцоолсон түвшний мэдээллийг ашиглахгүй байх. Энэ бүхэн нь түвшинг дур мэдэн динамикаар өөрчлөх боломжийг танд олгоно. Орчин үеийн хөдөлгүүрүүд хангаж чадахгүй байгаа зүйл.
Гэрэлтүүлгийн динамик тооцоололтой хослуулан урьдчилсан мэдээлэл дутмаг байгаа нь хязгааргүй ертөнцийг зурахад хялбар болгодог, учир нь та зөвхөн түвшний геометрийн талаар тийм ч том биш мэдээллийг хадгалах хэрэгтэй.

Орчин үеийн процессоруудад тавигдах эдгээр хатуу шаардлагыг хангахын тулд аз болоход үндсэн бус бусад ноцтой хязгаарлалтуудыг нэвтрүүлэх шаардлагатай байв. Гэсэн хэдий ч боломжтой тооцоолох хүчин чадал нэмэгдэхийн хэрээр эдгээр хязгаарлалтууд арилах боловч мөн чанар нь хэвээр үлдэх болно.
Юуны өмнө би дэлхийн бодит байдлын загварчлалаас татгалзаж, харь гаригийн ертөнцийг илүүд үздэг. Энэ нь дүрсийг бүтээх гол команд болох цацрагийг хянахад тийм ч тохиромжтой биш гурвалжинг ашиглахаас татгалзах боломжтой болсон. Харь гаригийн ертөнц өнцөг хэлбэртэй байх албагүй, дугуй хэлбэртэй байг. Тайзыг бүтээхэд бөмбөрцөгийг анхдагч байдлаар сонгосон. Орчин үеийн тоглоомууд 1024x768 гэх мэт өндөр нарийвчлалтай ажиллах ёстой тул бид тусгал, хугарлын тооцоог орхих шаардлагатай болсон, учир нь энэ нь дэлгэцийн цэгт тохирох туяаг боловсруулахад маш хэцүү болсон. Гэхдээ тооцоолох хүчин чадал нэмэгдэхийн хэрээр командын багц болон туяа судлах гүнийг хоёуланг нь өргөжүүлэх, өөрөөр хэлбэл тусгал, хугарал гэх мэтийг нэмэх боломжтой болно.

Тэгэхээр VirtualRay-ийн гол шинж чанарууд нь юу вэ - туяа хянах арга дээр суурилсан 3D хөдөлгүүр? Хувийн компьютерт зориулсан хамгийн орчин үеийн процессорууд дээр энэ нь 1024x768x32 нягтралтай бага эсвэл бага хурдтайгаар ажилладаг. Хэрэв та бага нарийвчлалтай ашиглах юм бол гүйцэтгэлийн параметрүүд өөр байж болох тул бид үүнийг ашигласан нарийвчлал гэж таамаглах болно.

Магадгүй мянга мянган огтлолцсон бөмбөрцөгөөс бүрдэх үзэгдлүүд. Бодит байдал дээр үзэгдэл хязгааргүй байж болох бөгөөд энэ нь зөвхөн харагдах хэсгийг илэрхийлдэг.

Бүх гэрэлтүүлэг, сүүдэрлэхийг жааз тус бүрээр нь тооцоолох. Бүх гэрлийн эх үүсвэрүүд динамик (бүр статик) байдаг, учир нь тэдгээр нь динамик бөгөөд зөвхөн хүрээнээс хүрээ рүү байрлалаа өөрчилдөггүй.

Гэрэлтүүлгийн нэг пикселийн тооцоолол ба сүүдэрийн нэг пикселийн давхардал, байгалийн динамик.

Эзлэхүүний гэрлийн эх үүсвэрийг физикийн ойролцоолсон дээр үндэслэн зөөлөн сүүдэр гаргах. Өөрөөр хэлбэл, сүүдрийн хил нь хурц биш, гэхдээ маш бүдэг, бүдэгрэх зэргийг тохируулах боломжтой. Үнэн бол эдгээр нь бүхэлдээ бодит, бие махбодийн хувьд найдвартай зөөлөн сүүдэр биш, харин ойролцоо байдаг.

8 хүртэлх гэрлийн эх үүсвэр нь нэг бөмбөрцгийг гэрэлтүүлж, нэг бөмбөрцөг нь 8 хүртэлх сүүдэр тусгах боломжтой. Энэ бол үндсэн хязгаарлалт биш, зөвхөн нэг хэсэгт олон гэрлийн эх үүсвэр байх үед бүх зүйл мэдээж удааширдаг.

Цэгэн гэрлийн эх үүсвэрүүд болон нар гэх мэт хязгааргүй алслагдсан гэрлийн эх үүсвэрүүдийг дэмждэг. Дүрмээр бол дүр зургийг нэг "нарны" гэрлийн эх үүсвэр, хэд хэдэн орон нутгийн гэрлийн эх үүсвэрээр гэрэлтүүлдэг.

Бүрэн динамик дүр зураг, өөрөөр хэлбэл объектуудын байрлал ямар ч байдлаар өөрчлөгдөж болно.

Бүтцийн зураглал ба хоёр шугаман шүүлтүүр.

Динамик тунгалаг байдал бүхий тунгалаг бөмбөрцөгийг хязгаарлагдмал ашиглах.

Гаригийн гадаргууг нэг том бөмбөрцөг хэлбэрээр дүрсэлсэн нь тэнгэрийн хаяаны шугамын ард алс холын объектууд нуугдаж байх үед тэнгэрийн хаяа эффект үүсгэдэг.

Хөдөлгүүрийн орон нутгийн сул талууд нь юуны түрүүнд орчин үеийн видео хурдасгууруудын сайн хийдэг спрайт флэш гэх мэт "хямд" эффектүүдтэй харамч байдаг.
VirtualRay хөдөлгүүрийг ашиглан ямар төрлийн тоглоом бүтээх боломжтой байсан бэ? Ерөнхийдөө та үүн дээр сансрын симулятороос эхлээд олон тоглогчийн онлайн ертөнц хүртэл маш олон төрлийн тоглоом хийх боломжтой. Дашрамд хэлэхэд, сүүлийн төрөлд динамик үзэгдлийн өөрчлөлтийг хэрэгжүүлэхэд хөдөлгүүрийн давуу тал ялангуяа тод харагдаж байна. "Үзэл баримтлалын тоглоом"-ын хувьд би AntiPlanet нэртэй төслийг бүтээсэн - Doom шиг зан авиртай, энгийн мангасуудтай энгийн 3D мэргэн буудагч. Тоглоомын түвшин нь орон нутгийн нарны гэрлээр гэрэлтдэг өөр өөр хэмжээтэй харь гаригийн газрын хэсгүүд юм. Дашрамд дурдахад, нар тэнгэрт хөдөлдөг бөгөөд үүний дагуу үзэгдлийн гэрэлтүүлэг, сүүдэр өөрчлөгддөг. Тоглоомын одоогийн хувилбарт нийтдээ 5 түвшин байгаа бөгөөд тэдгээрийн нэг нь доторх, агуйн төөрдөг байшин юм. Үлдсэн хэсэг нь ихэвчлэн нээлттэй байдаг. Хөдөлгүүр нь тусгай оновчлолгүйгээр нээлттэй болон хаалттай үзэгдлүүдийг зурахад хангалттай олон талт юм.

Тоглогчийн төлөө 5 төрлийн мангас агнадаг бөгөөд мангасууд ашигласан зэвсгийн төрөл, хурд, хүч чадлаараа ялгаатай. Дашрамд дурдахад, тоглогч өөрийн мэдэлд олон төрлийн сум, пуужин, бөмбөгөөр галладаг арван төрлийн зэвсэгтэй. Зэвсгийн бөмбөрцөг шинж чанар нь түүнийг зарим талаараа нэгэн хэвийн болгодог боловч дэлбэрэх үед бүрхүүлүүд нь овоолсон хэлтэрхий болон дэлбэрдэг. Тоглоомын 3 үндсэн төрөл байдаг - зүгээр л мангас агнах, тоглогч тодорхой хугацаанд тодорхой тооны мангасуудыг устгах шаардлагатай болдог. Хоёрдахь төрлийн тоглоом нь түвшинд нуугдсан тусгай олдворуудыг олох явдал юм. Гурав дахь тохиолдолд тоглогч үл мэдэгдэх гариг ​​дээр тодорхой хугацаанд амьд үлдэх ёстой. Тоглоомыг сонгохдоо та анхны тусламжийн хэрэгсэл, зэвсэг, мангасуудын тоог санамсаргүй газарт байрлуулах боломжтой. Мэдээжийн хэрэг, хэрэв та маш олон тооны мангасуудыг суулгасан бол тоглоом удаан үргэлжлэх болно.

Харамсалтай нь загвар зохион бүтээгч бид хоёр үүнийг хийх цаг зав гараагүй тул тоглоом нь хөдөлгүүрийн бүрэн чадавхийг илчлэхгүй байна. Жишээлбэл, түвшний сүйрэл байхгүй, зөвхөн бие даасан динамик хэсгүүд байдаг, тэр үед тэнэг мангасууд замаа олохгүй, харин энэ нь тоглоомын санаагаар хангагдаагүй болно. Загварын хөдөлгөөнт дүрсийн хувьд хөдөлгүүрийн боломжууд бүрэн хэрэгждэггүй. Хөдөлгүүр нь хүрээ тус бүрийн загварт дур зоргоороо бие даасан өөрчлөлт хийх боломжийг олгодог бөгөөд энэ нь хамгийн боловсронгуй хөдөлгөөнт дүрсийг хэрэгжүүлэх боломжийг олгодог.
Динамик гэрэлтүүлэг, зөөлөн сүүдэр гэх мэт хөдөлгүүрийн давуу талыг огт илэрхийлэхгүй тул би тоглоомын дэлгэцийн агшинг өгөхгүй байхаар шийдсэн. Демо хувилбарыг татаж аваарай, үүнд хэдхэн мегабайт зарцуулагдана. Маш олон тооны бөмбөлгүүд, жижиг бөмбөрцөгт мангасуудаас бүрдсэн сюрреал харь гаригийн газар нутгийг төсөөлөөд үз дээ, тэд тэсрэх үед жижиг хэсгүүдэд хуваагдана. Та энэ линкээс одоогийн демо хувилбарыг татаж авах боломжтой.

Тоглоом нь Windows95 ба түүнээс дээш, 128 мегабайтаас илүү санах ойтой байх шаардлагатай, үгүй ​​бол хөгжим, DirectX, 32 битийн өнгөний дэмжлэгтэй видео карт, хамгийн чухал нь илүү хүчирхэг процессорыг идэвхгүй болгох шаардлагатай. Жишээлбэл, Hyper-Threading технологийг дэмждэг Intel Pentium 4 процессор эсвэл шинэ AthlonXP. Тоглоом нь MMX технологи бүхий ямар ч процессор дээр ажиллах ёстой, гэхдээ бүрэн ажиллагаатай байхын тулд танд SSE дэмжлэг хэрэгтэй, өөрөөр хэлбэл Pentium-III-аас эхэлсэн процессор. Видео хурдасгагч шаардлагагүй. Дашрамд хэлэхэд хөдөлгүүр нь Hyper-Threading технологийг багтаасан олон процессыг дэмждэг. Бүх программууд Hyper-Threading-ийг амжилттай ашиглахын тулд олон урсгалыг ашигладаггүй ч гол туяа хянах гогцоо параллель байдлаар хийгдсэн бөгөөд хэдэн арван хувийн ашиг олдог. Мөн олон процессортой систем дээр ашиг нь процессорын тоотой пропорциональ байна.

VirtualRay хөдөлгүүрийг хөгжүүлэх

Одоогийн байдлаар хөдөлгүүр нь гайхалтай үзэгдлүүдийг харуулах боломжийг олгодог. Гэхдээ бөмбөрцөгийг команд болгон ашиглах нь одоогоор үндсэн хязгаарлалт биш, илүү төвөгтэй командыг ашиглах нь хурдны үүднээс асуудалтай байна. Гүйцэтгэл нэмэгдэхийн хэрээр та бөмбөрцгийн оронд эллипс боловсруулах боломжтой бөгөөд энэ нь таны үзэгдлийг баяжуулах болно.

Одоо бид гурвалжинг бөмбөрцөгтэй хамт боловсруулах боломжтой боллоо. Гэхдээ гурвалжин ашиглан утга учиртай зүйлийг харуулахын тулд танд маш олон зүйл хэрэгтэй бөгөөд тэдгээрийг бөмбөрцгийн хурдаар боловсруулдаг. Ховилтой бөмбөрцөг, бөмбөрцөг сегмент, бөмбөрцөг гурвалжин зэргийг оруулснаар төрөл бүрийн командуудыг өргөжүүлэхэд хялбар байдаг. Гэхдээ энэ нь хурдад сөргөөр нөлөөлнө.
Зургийн чанарыг алдагдуулахын тулд туяа хянах гүйцэтгэлийг сайжруулах янз бүрийн аргууд байдаг. Бүх туяаг мөрддөггүй, зөвхөн хамгийн чухал нь л байдаг бөгөөд зургийн дутуу хэсгийг бүтээхэд интерполяци ашигладаг. Гэсэн хэдий ч, энэ арга нь бүх үзэгдэлд хамаарахгүй, заримдаа энэ нь илүү их эсвэл бага чанартай үр дүнг өгдөг, заримдаа энэ нь дүр төрхийг ноцтойгоор сүйтгэдэг.

Дашрамд хэлэхэд чанарын тухай. Энд сайжруулах зүйл их байна. Баримтжуулалтын процедурыг нэг цэгт зөвхөн нэг удаа хийдэг бөгөөд их цаг хугацаа шаарддаггүй. Одоогоор рэндэрлэх цагийн 10 орчим хувийг текстур хийхэд зарцуулж байна. Тиймээс, текстурын чанарыг сайжруулахын тулд пикселийн гурвалсан шүүлтүүрийг хэрэгжүүлэхээр төлөвлөж байна, энэ нь хурдыг мэдэгдэхүйц бууруулахгүй байх ёстой.

Цацрагийн мөр ба орчин үеийн 3D хурдасгуур

Сүүлийн үед 3D хурдасгуурын салбар нь пиксел болон оройн шэйдер гэж нэрлэгддэг өргөн хэрэглээнд шилжиж байна. Гурвалжныг растержуулахдаа зургийн фрагмент бүрийн хувьд хурдасгуур нь фрагментийн өнгийг цогц байдлаар өөрчилдөг урьдчилан тодорхойлсон программыг гүйцэтгэдэг. Энэ нь илүү их зүйлийг хийж чадна, жишээлбэл, зарим завсрын тооцооллыг бүтэц болгон бичиж, дараа нь уншиж, өөр зүйлийг зурахад ашиглах болно. Орчин үеийн пиксел шэйдер буюу фрагмент шэйдерийн ердийн жишээ бол гурвалжны өгөгдсөн цэгийн гэрэлтүүлгийг тооцдог шэйдер юм. Үүнийг дараах байдлаар зохион байгуулна: векторыг авна - эх үүсвэрийн глобал байрлал, гурвалжинг растержуулах үед хурдасгуурын чип дээр тооцоолсон гурван хэмжээст орон зай дахь гурвалжингийн цэгийн одоогийн координатыг авна, мөн гадаргын нормыг авна. энэ цэг дээр гурвалжин. Дараа нь энэ цэгээс гэрлийн эх үүсвэрийн чиглэлийн векторыг тооцоолж, ердийн перпендикуляр вектортой үүсэх өнцгөөс хамааран гэрэлтүүлгийг тооцоолно. Гэрэл унах өнцөг их байх тусам түүний хүч багасна.
Бидний харж байгаагаар орчин үеийн шэйдер нь утга учиртай геометрийн програм байж болно. Одоо ийм болон илүү төвөгтэй шэйдерүүдийн гүйцэтгэлийн хурдыг хэмжих замаар шинэ хурдасгууруудыг турших нь заншил болжээ. Бүтээмж маш өндөр. Пиксел тутамд гэрэлтүүлгийг гүйцэтгэдэг шэйдер нь Radeon9700 эсвэл GeForceFX зэрэг хамгийн сүүлийн үеийн хурдасгуурууд дээр секундэд 100-200 фрэймийн давтамжтайгаар 1024x768 нягтралтайгаар ажилладаг. Энэ нь зөвхөн шэйдерийн ажиллах хугацааг л хэлнэ. Үүнтэй холбогдуулан 3D графикаас хол байсан ч гэсэн ийм их хэмжээний тооцоолох хүчийг олон янзын зорилгоор ашиглах санаа эртнээс ирсэн. Мөн бусад зүйлсийн дунд үүнийг хэрэгжүүлэхийн тулд туяа хянах аргыг ашиглахыг хичээ.

Гэсэн хэдий ч, хэрэв бид энэ хүчийг нэгж хугацаанд скаляр болон векторын хөвөгч цэгийн тооцооллын тоогоор авч үзвэл орчин үеийн процессоруудын тооцоолох хүчин чадалтай харьцуулж болно. Өнөөдрийн хамгийн сүүлийн үеийн хурдасгуур болох GeForceFX5900Ultra-г авч үзье, энэ нь 450 МГц давтамжтай, 4 пикселийн процессортой бөгөөд тус бүр нь нэг цагийн мөчлөгт 1 вектор үйлдэл хийх боломжтой. Үнэн хэрэгтээ нэг цагийн мөчлөгт илүү олон үйлдлүүд байж болох ч бид зөвхөн бүрэн float32 нарийвчлалтай тооцооллыг сонирхож байна, учир нь бага нарийвчлалтай тооцоолол нь голчлон өнгө тооцоход утга учиртай бөгөөд тэдгээрийн хүрээ нь тийм ч том биш өнгөний нягтралаар хязгаарлагддаг. мониторын. Мөн геометрийн тооцооллын хувьд сайн нарийвчлал шаардлагатай. Энэ нь ойролцоогоор гүйцэтгэлийн тооцоогоор секундэд 450Mx4=1800 сая вектор үйлдэл болно. Хэрэв бид Pentium 4-ийг авбал SSE-ийн тусламжтайгаар бид нэг цаг хагасын мөчлөгт нэг векторын үйлдлийг хийж чадна, өөрөөр хэлбэл 2700 МГц давтамжтайгаар секундэд ижил 1800 сая векторын үйлдлийг авах боломжтой. Аль ч тохиолдолд тэрээр бүх код нь тооцооллоос бүрдэх үед хамгийн дээд гүйцэтгэлийг илэрхийлдэг.
VPU нь тооцоолох чадвараараа давуу талгүй нь тодорхой байна. График дахь түүний давуу тал нь гурвалжныг растержуулахад шаардлагатай дагалдах тооцооллыг шэйдерийн тооцоололтой зэрэгцүүлэн хийх чадварт оршдог. Гүн буферын утгыг ямар нэгэн байдлаар тооцоолж, гурвалжны гадаргуугийн дагуух орой дээр тогтоосон утгуудыг интерполяци хийж, нэг цагийн мөчлөгт бүтэц, дээж, шүүнэ. Энэ бүгдийг янз бүрийн зэрэгцээ ажиллаж байгаа видео хурдасгуурын блокууд гүйцэтгэдэг.

Мэдээжийн хэрэг, хурдасгуур нь гурвалжингийн зургийг оновчтой болгох үүднээс бүрэн оновчтой, бүтээгдсэн тул видео хурдасгуур ашиглан туяа хянах аргыг хэрэгжүүлэхэд онцгой давуу тал олж авахгүй.
Видео хурдасгуур ашиглан туяа мөрийг оновчтой болгох тухайд өөр нэг санаа бий: бүх геометрийг VPU дээр зурж, CPU ашиглан туяа мөрийг ашиглан гэрэлтүүлгийн тооцоог хийж, үр дүнг нэгтгэнэ. Гэхдээ энэ нь тийм ч их ашиггүй байх болно, учир нь тооцооллын гол бэрхшээл нь гэрэлтүүлгийг тооцоолоход гардаг. Үүнээс гадна дүр зураг илүү төвөгтэй байх тусам VPU ашиглах нь илүү их ашиг тустай байх тусам нарийн төвөгтэй үзэгдлийн гэрэлтүүлгийг тооцоолоход илүү их нөөц шаардагдах бөгөөд дүр зургийг зурах нь гэрэлтүүлгийн хугацаатай харьцуулахад хамаагүй бага хугацаа шаардагдах болно. тооцоо.

Орчин үеийн хурдасгуур ашиглан гэрэлтүүлгийн тооцоо

За, Doom III гэх мэт динамик гэрлийн эх үүсвэр бүхий шинэ тоглоомуудад үзэгдэлийн сүүдэрлэхийг хэрхэн тооцоолохыг санал болгож байна вэ? Одоо бид компьютер тоглоомон дээр урьдчилан тооцоолсон статик гэрэлтүүлгийг харахаар үүрд мөнхөд байх ёстой юу? Үгүй ээ, z-буфер ашиглан бүтэцтэй гурвалжин зурах стандарт аргыг ашиглан сүүдрийг тооцоолох сонирхолтой аргууд эрт дээр үеэс мэдэгдэж байсан. Тэд удаан хугацааны туршид мэдэгдэж байсан боловч тооцоолох нөөцийг маш их шаарддаг тул компьютер тоглоомд ашиглах нь хязгаарлагдмал байсан ч саяхан шинэ үеийн видео хурдасгуур гарч ирснээр боломжтой болсон.

Эхлээд дээр дурдсан Doom III тоглоомд динамик сүүдэр зурах аргыг харцгаая. Олон тоглогчдын хүсэн хүлээдэг тоглоом. Энэ аргыг Shadow Volume арга буюу stencil buffer ашиглан сүүдэр зурах арга гэж нэрлэдэг. Энэ нь хэрхэн ажилладаг тухай үндсэн диаграммыг энд харуулав: эхлээд гэрэлтүүлэггүй дүр зургийг зурж, дараа нь сүүдэрлэж буй үзэгдэл дэх объект бүрийн сүүдрийн эзэлхүүнийг бүтээдэг. Сүүдрийн эзэлхүүн нь тухайн объектын сүүдэрт сүүдэрлэдэг сүүдрийн бүс, гэрэл тусдаггүй орон зайн хэсгийг хязгаарладаг тоо юм. Бид тухайн объектын ард сунаж тогтсон хар барааныг бие хэлбэрээр төсөөлдөг бололтой. Хэрэв та тоосны тоосонцор нисч буй өрөөнд хурц гэрэл тусгавал сүүдрийн хэмжээг бодитоор харж болно. Сүүдэргүй тоосонцор гэрэлтэх бөгөөд сүүдэртэй хэсгүүд нь гэрлийг хааж буй объектын ард хар хэсэг үүсгэнэ. Дараагийн алхам бол энэ сүүдрийн эзэлхүүний хилийг бүрдүүлдэг гурвалжнуудыг зурах явдал юм. Гүн буферийн утгыг сүүдрийн эзэлхүүний урд болон арын хананы гүнтэй харьцуулж, тухайн цэг нь сүүдрийн эзэлхүүнд оршиж, сүүдэрлэсэн эсэхийг тодорхойлно. Сүүдрийн эзэлхүүний хананы гүн ба зургийн гүнийг харьцуулахдаа дэлгэцийн пикселтэй харгалзах утгын массив - стенс буферийг ашигладаг. Энэ нь сүүдрийн эзэлхүүний хананы гүнийг зургийн гүнтэй харьцуулах завсрын үр дүнг хадгалдаг. Энэ арга нь "сайн" бөгөөд энэ нь хурдасгуурын дүүргэлтийн хэмжээг бүрэн ашигладаг, учир нь сүүдрийн эзэлхүүн нь дүрмээр бол сүүдэрт байгаа объектоос илүү том талбайтай байдаг. Энэ аргыг Riva TNT2 хурдасгуур дээр хэрэгжүүлэх боломжтой байсан боловч маш их шаарддаг тул саяхан ашиглах боломжтой болсон.

Нөгөөтэйгүүр, нарийн төвөгтэй гүдгэр бус объектуудын сүүдрийн оновчтой хэмжээг бий болгох нь тооцооллын хувьд төвөгтэй ажил юм. Шууд шийдэл нь сүүдрийн эзэлхүүний олон тооны нэмэлт хана гарч ирэхэд хүргэдэг бөгөөд тэдгээрийг буулгахад нэмэлт нөөц шаардлагатай болно. Загварын нарийвчлалын зэрэгтэй холбоотойгоор үр дүнтэй эзлэхүүнийг олох хугацаа маш хурдан нэмэгддэг. Магадгүй ийм учраас NewDoom дахь мангасын загварууд төсөөлж байснаас бага нарийвчлалтай байдаг.
Гэхдээ эдгээр нь бүх дутагдал биш юм. Олон жижиг объектуудын хувьд сүүдрийн эзэлхүүний хананы талбай нь асар том хэмжээтэй байж болно. Жишээлбэл, сам дээр. Түүний сүүдрийн талбай нь том биш, гэхдээ маш их ороомог юм. Цаашилбал, энэ арга нь тунгалаг гадаргуутай тохиромжгүй байдаг. Жишээлбэл, ил тод гадаргуу сүүдрийн эзэлхүүн рүү унавал түүний ард байгаа объект нь гүний буферт мэдээллээ үлдээдэггүй, учир нь энэ мэдээлэл нь тунгалаг гадаргуугийн гүнд алдагддаг. Мөн сүүдэрт объект байгаа эсэхийг тодорхойлох боломжгүй юм. Энэ төрлийн бүх хэргийг тусад нь боловсруулах шаардлагатай бөгөөд энэ нь дамжуулалтын тоо нэмэгдэхэд хүргэнэ.

Бүдгэрсэн сүүдэр үүсгэхийн тулд энэ аргыг төгс төгөлдөр болгоход хэцүү байдаг. Doom III-ийн урьдчилсан хувилбарыг үзсэн хүмүүс сүүдрийн хурц тод байдлыг анзаарсан байх. Үнэн хэрэгтээ энэ арга нь зөвхөн сүүдэр зурахад тохиромжтой бөгөөд түүний тусламжтайгаар хоёрдогч гэрэлтүүлгийг тооцоолох боломжгүй бөгөөд гэрлийн хугарал, тусгалыг тооцох боломжгүй юм. Объектын сүүдрийн конусыг зүгээр л духан дээр зурсан, тэгээд л болоо.

Орчин үеийн тоглоомуудын динамик сүүдрийг дүрслэх өөр нэг түгээмэл арга бол проекцийн бүтэцтэй зураглалыг ашиглах явдал юм. Орчин үеийн хурдасгуурууд нь фенүүд нь слайдыг дэлгэцэн дээр буулгадагтай адил объект руу бүтэцийг тусгаж сурсан. Энгийнээр бол объектыг зурахдаа тухайн объектын өгөгдсөн цэг рүү ямар бүтэцтэй цэгийг төсөөлж байгааг тооцоолдог. Одоо та гэрлийн эх үүсвэрийг хараад хар өнгийн объектыг бүтэц рүү зурж болно, та сүүдрийн дүрсийг авах болно. Энэ нь босоо цагаан ханан дээрх объектын сүүдэртэй адил юм. Мөн энэ сүүдэртэй бүтэцийг сүүдрийн маск гэж нэрлэдэг бөгөөд үүнийг сүүдэртэй объектууд дээр гаргаж болно.

Энэ аргыг шинэ тоглоомуудад динамик объект, мангас, машинаас сүүдэрт дүрслэх аргыг ашигладаг. Үүний тулд та бүдгэрсэн сүүдэр зурж болно, сүүдэртэй анхны бүтэц нь бүдгэрч, хар, цагаанаас цагаан, саарал болж хувирдаг.

Дээр дурдсан аргуудын аль нь хурдасгуурын дүүргэлтийг илүү шаарддагийг би мэдэхгүй. Үнэн хэрэгтээ сүүдрийн сайн чанарыг олж авахын тулд сүүдрийн бүтэц нь маш өндөр нарийвчлалтай байх ёстой. Splinter Cell гэх мэт шинэ тоглоомууд нь хэдэн мянган пиксел хэмжээтэй бүтэцтэй байдаг. Учир нь төсөөлөхөд хамгийн жижиг нарийн ширийн зүйлс хэд дахин томордог. Зургийг бүрдүүлдэг пикселүүд харагдах болно. Тиймээс энэ аргыг зөвхөн ойр орчмын объектуудад сүүдэр тусгахад ашиглаж болно. Энэ аргын хоёр дахь сул тал нь объектыг өөрөө сүүдэрлэх боломжгүй юм, энэ нь сүүдэрлэх объектыг зөв сонгох шаардлагатай бөгөөд түүний хэсгүүд нь бие биендээ сүүдэрлэхгүй байх болно. Үүнээс гадна, мэдээжийн хэрэг, энэ арга нь хоёрдогч гэрэлтүүлэг, тусгал, гэрлийн хугарлыг тооцоолох ерөнхий ойлголт биш юм.

Эцэст нь, миний бодлоор орчин үеийн тоглоомуудад сүүдэр бий болгох хамгийн ирээдүйтэй арга юу болохыг харцгаая. Энэ нь өмнөх проекцийн аргын хөгжил юм. Зөвхөн объектын дүрсийн оронд объектын цэгээс гэрлийн эх үүсвэр хүртэлх зайг сүүдэрт тэмдэглэнэ. Дараа нь, сүүдрийн бүтцийг проекцлохдоо энэ мэдээллийг сүүдэрлэж болзошгүй объектын цэг нь сүүдрээс илүү хол эсвэл гэрлийн эх үүсвэрээс ойрхон байгаа эсэхийг тодорхойлоход ашигладаг. Энэ аргын давуу тал нь объектыг зөв сүүдэрлэх явдал юм. Мөн түүний сул талууд нь өмнөх аргатай төстэй юм. Динамик сүүдэр үүсгэх энэ арга нь тоглоом хөгжүүлэгчдийн дунд түгээмэл биш юм. Аргын "гэм буруу" нь GeForce3 - GeForce4 дээр анх гарч ирсэн, гэхдээ GeForce4-ийн богиносгосон хувилбар болох Geforce4MX-ээс хасагдсан видео картын тусгай чадварыг шаарддаг явдал юм. Техник хангамжийн дэмжлэггүйгээр энэ аргыг хэрэгжүүлэх боломжгүй тул та бүх алдартай видео картууд дээр боломжтой аргыг ашиглах хэрэгтэй.

Дээрх бүх аргын давуу тал нь одоо байгаа техник хангамжтай сайн нийцтэй байх явдал юм. Тэдний хувьд үнэн хэрэгтээ дүүргэлтийн хэмжээ, энгийн үйлдлээс өөр юу ч хэрэггүй. Үүний үр дүнд видео хурдасгуурууд нь бодит цаг хугацаанд дүр зураглалын гэрэлтүүлгийг тооцоолохоос хол хэвээр байна гэж бид дүгнэж болно. Мөн хувьсгалт зүйл хүлээхгүй. Зарим динамик объектуудын сүүдэр гарч ирэв, шинэ Doom III-д динамик гэрэл хязгаарлагдмал, эдгээр технологийг удаан хугацаанд эзэмшинэ.

Цацрагийн ажиглалтын үүднээс хурдасгуурыг хөгжүүлэх

Өмнө дурьдсанчлан, орчин үеийн хурдасгуурууд улам бүр програмчлагдах боломжтой болж, хүч чадал нь тогтмол нэмэгдэж байна. График карт үйлдвэрлэгчид шинэ бүтээгдэхүүнд хандахдаа "Visual Processor" гэсэн нэр томъёог хүртэл ашигладаг. Үнэн хэрэгтээ, чадавхийн хувьд хурдасгуурууд нь хувийн компьютерт зориулсан ердийн процессоруудыг санагдуулдаг. VPU програмчлах чадвар нэмэгдэхийн хэрээр туяа хянах арга гэх мэт ухаалаг дүрслэлийн аргуудыг хэрэгжүүлэх найдвар улам бүр нэмэгдсээр байна. Ингэснээр хурдасгуурыг тохирох аргаар дахин програмчилж болно.

Энэ чиглэлд хурдасгагчийг хөгжүүлэх хэтийн төлөвийг үнэлж үзье. Одоо хамгийн сүүлийн үеийн хурдасгуурууд нь таван жилийн өмнөх процессорууд шиг 500 МГц орчим давтамжтайгаар ажилладаг бөгөөд 4-8 зэрэгцээ ажлын шугам хоолойтой. Одоо ихэнх шэйдер векторын үйлдлүүд болох нэмэх, скаляр үржвэрийг цагийн циклээр гүйцэтгэдэг. Гурвалжны гадаргуугийн дагуух утгуудыг интерполяци хийх гэх мэт олон туслах үйлдлүүд мөн цагийн мөчлөгт хийгддэг. Sin, cos гэх мэт тригонометрийн функцүүдийн тооцоо хэдийгээр ойролцоо боловч цагийн мөчлөгөөр хийгддэг. Энэ нь урьдчилан тооцоолсон утгууд бүхий хүснэгтүүдийн сонголтыг ашигладаг боловч гүйцэтгэл нь гайхалтай хэвээр байна. Түүгээр ч барахгүй хувийн компьютерт зориулсан орчин үеийн CPU-үүд ийм зүйлийг хийж чадахгүй байгаа нь хачирхалтай юм. Харин ч ээдрээтэй командуудаас салж, цөөн хэдэн энгийн командуудаар солих хандлагатай байна. Эдгээр арга хэмжээ нь давтамжийг нэмэгдүүлэх чадвартай байх шаардлагатай. Техникийн нарийн ширийн зүйлийг ярихгүйгээр бид давтамж нэмэгдэх тусам буурч байгаа процессорын мөчлөг нь богино заавар шаарддаг гэж хэлж болно. Нарийн төвөгтэй заавар нь орчин үеийн процессоруудын доторх бичил үйлдлүүдэд хуваагдсан хэвээр байна. Энэ хуваагдал нь тусдаа асуудал юм.

Видео хурдасгуурын талаар юу хэлэх вэ? Давтамжийг нэмэгдүүлэхийн тулд орчин үеийн VPU-ийн архитектурыг нухацтай өөрчлөх шаардлагатай болж магадгүй юм. Гэхдээ энэ нь тийм ч муу биш юм. Жинхэнэ програмчлах чадвар нь процессороос салбаруудыг, өөрөөр хэлбэл програмын гүйцэтгэлийг хянах командуудыг гүйцэтгэхийг шаарддаг. Мөн энэ нь үргэлж хамгийн том асуудал юм. Орчин үеийн процессорууд программ дахь урьдчилан таамаглах боломжгүй нөхцөлт салбаруудаас хэрхэн зовдог вэ? Энд GeForceFX-ийн оройн шэйдерүүд нөхцөлт салбар командуудыг хүлээн авсан бөгөөд та гүйцэтгэл хэр буурсаныг хамгийн сүүлийн үеийн тестүүдээс харж болно. Энэ нь 500 МГц-ээс доош харьцангуй бага давтамжтай байдаг. Давтамж нэмэгдэхийн хэрээр нөхцөлт шилжилтийн алдагдал нэмэгдэж, хэрэгжилт нь өөрөө улам хэцүү болно. Дашрамд хэлэхэд, хурдасгуурын гайхалтай гүйцэтгэл нь урсгалын үйлдлүүд гэж нэрлэгддэг, өгөгдөл нь тасралтгүй туузаар урсаж, нарийн тодорхойлсон схемийн дагуу боловсруулагдсан, санамсаргүй нөхцөлт шилжилт гэх мэт үед хүрдэг. Эдгээр бүх баримтууд нь ойрын ирээдүйд видео хурдасгуурын давтамж нэмэгдэхийг хүлээх боломжгүй гэдгийг харуулж байна.

Видео картын чухал параметр бол пикселийн процессорын тоо юм. Тэд пикселүүдийг зэрэгцээ зурдаг тул илүү их байх тусмаа сайн. Хамгийн сүүлийн үеийн Radeons дээр аль хэдийн найм нь байгаа. Шинэ хурдасгууруудаас илүү олон фрагмент процессорууд гарах төлөвтэй байна. Гэхдээ энэ нь тийм ч энгийн зүйл биш юм. Гурвалжны хэмжээ нь пиксел дамжуулах хоолойн тоотой харьцуулах боломжтой бол тэд бүгд хамтдаа ажиллах боломжгүй юм. Жижиг гурвалжинд тэдэнд хангалттай зай байхгүй. Тийм ч учраас видео хурдасгагч үйлдвэрлэгчид дэлгэцийг бүхэлд нь давхар нягтаршилтай болгодог antialiasing горимд маш их дуртай байдаг. Дараа нь жижиг гурвалжингууд илүү том болно. Үнэн хэрэгтээ, хэрэв том гурвалжнуудын дүр зургийг хэлбэрээ өөрчлөхгүйгээр жижиг хэсгүүдэд хуваавал гурвалжны нийт талбай ижил хэвээр байх боловч пикселийн шэйдерүүдийн гүйцэтгэл мэдэгдэхүйц буурах болно.

Орчин үеийн тоглоомын график хурдасгуурыг хөгжүүлэх нь аль хэдийн маш их бэрхшээлтэй тулгарсан бөгөөд бараг зөвхөн видео чип үйлдвэрлэх технологийн процессыг сайжруулах замаар хийгддэг. Бүх NVIDIA болон ATI энгийн динамик сүүдрийг хэрхэн үр дүнтэй болгох талаар бодож байна. Сайн шийдэл байхгүй - тэдэнд туяа судлах цаг байхгүй.

Цацрагийн ажиглалт хийх тусгай хурдасгуур

Хэрэв орчин үеийн тоглоомын VPU-ууд нь гурвалжин зурах стандарт алгоритмыг хурдасгах зорилготой байсан бөгөөд туяа мөрийг хэрэгжүүлэхэд тийм ч тохиромжгүй байсан бол туяа мөрийг хэрэгжүүлэхийн тулд эхлээд хурдасгуур барих нь зүйтэй болов уу? Харамсалтай нь туяаг хурдасгах нь талархалгүй ажил юм.


Цацрагийн алгоритм нь маш нарийн төвөгтэй тул цацрагийг хянах хурдасгуур нь бараг бүх нийтийн процессор юм. Санамсаргүй салбаргүй урсгалын алгоритмууд нь техник хангамжийн хурдатгалд сайнаар нөлөөлдөг боловч туяа хянах нь огт өөр юм. Өөрөөр хэлбэл, туяа хянах хурдасгуур хийх нь жинхэнэ CPU үүсгэхтэй адил юм.


Гэхдээ туяа хянах нь өөр нэг давуу талтай - энэ нь маш сайн параллель байна. Цацраг бүрийг бие даан тооцоолох боломжтой бөгөөд энэ нь алгоритмыг олон процессорын систем дээр үр дүнтэй хэрэгжүүлэх боломжийг олгодог. Та хямд туяаг хянах хурдасгуур гэж юуг бодож болох вэ? 3 гигагерц ба түүнээс дээш давтамжтай дөрвөн Celerons эсвэл багасгасан кэштэй дөрвөн AthlonXP бүхий систем. Хэрэв зөв оновчтой бол туяа мөрдөх алгоритм нь их хэмжээний кэш шаарддаггүй тул хямд, олон үйлдэлт байх болно. Тооцооллын нэгдсэн хүч нь одоогийн ширээний компьютеруудаас хамаагүй илүү байх болно. Гэхдээ олон процессорын системүүд нь гэрийн системд бус өөр зах зээлд зориулагдсан тул ийм зүйл болохгүй.

Дүгнэлт

Дээр дурдсан бүх зүйл дээр үндэслэн бид хувийн компьютер дээр үзэгдлүүдийг бодитоор харуулах нь маш хэцүү бөгөөд олон асуудал нь үндсэн шинж чанартай гэж дүгнэж болно. Тоглоомын компьютерын графикийг чанарын хувьд шинэ түвшинд хүргэхийн тулд хангалттай хугацаа өнгөрөх ёстой. Ирээдүйн график програмуудад дүрслэхэд ямар аргыг ашиглахыг хэлэхэд одоо маш хэцүү байна.

Холбоосууд


http://www.art-render.com/

3DMax болон бусад график засварлагчийн дүрслэлийг оновчтой болгох "туяаг хянах хурдасгуур" үйлдвэрлэгчдэд зориулсан вэбсайт. Хурдасгуур гэдэг нь туяа хянахад зориулагдсан 8-аас хэд хэдэн процессоруудын багц юм. Тэд гурвалжинтай цацрагийн огтлолцлыг олох - нэг цагийн мөчлөгт ердийн мөрдөх үйлдлийг хийж чадна. Гэхдээ тэд тийм ч өндөр давтамжтай ажилладаггүй бололтой. Зэрэгцээ үйл ажиллагааны тусламжтайгаар хурдатгалд хүрдэг. Одоо вэбсайтаас үнийг олоход хэцүү байдаг, гэхдээ би үүнийг өмнө нь харж байсан бөгөөд тэдгээр нь тийм ч бага биш юм.


http://www.acm.org/tog/resources/RTNews/html

Цацрагийн талаархи янз бүрийн нөөцийн өргөн жагсаалт.


http://www.realstorm.com/

Цацрагийн судалгаанд суурилсан хөдөлгүүр. Жишээлбэл, гэрлийн ул мөр, тусгал, хугарлын талаархи олон тооны ердийн эффектүүдийг бодит цаг хугацаанд зурах боломжийг танд олгоно. Гэхдээ энэ нь жижиг нарийвчлалтайгаар ажилладаг бөгөөд ойролцооллыг ашигладаг. Боулингийн симулятор тоглоомыг хөдөлгүүр дээр суурилуулсан.


http://www.kge.msu.ru/workgroups/compcenter/dmitri/projects/sphericworld/index.htm

http://www.kge.msu.ru/workgroups/compcenter/dmitri/projects/polyworld/index.htm

Цацраг илрүүлэх аргад зориулагдсан өөр нэг төсөл. Бөмбөрцөг ба олон өнцөгт цацраг туяа ажиглагчийг хэрэгжүүлсэн бөгөөд энэ нь маш өндөр чанартай бодит зургуудыг бүтээдэг боловч өндөр нарийвчлалтайгаар удаанаар бүтээгдсэн.


http://www.virtualray.ru/

Үнэн хэрэгтээ энэ бол нийтлэлийн сэдэв болох VirtualRay хөдөлгүүр ба AntiPlanet тоглоом - туяа мөрний хөдөлгүүр дээр суурилсан анхны 3D мэргэн бууч юм.

Орчин үеийн бодит дүрсийг бүтээх хамгийн хүчирхэг арга бол туяа хянах арга техник гэж тооцогддог. Мөшгих аргуудын түгээмэл байдал нь бидний эргэн тойрон дахь ертөнцийг мэдрэх бидний туршлагыг тусгасан энгийн бөгөөд тодорхой ойлголтууд дээр суурилдагтай холбоотой юм.

Зураг хэрхэн үүсдэгийг харцгаая. Гэрэл зургийн аппаратанд орж ирснээр дүрс үүсдэг. Гэрлийн эх үүсвэрээс олон туяа гаргацгаая. Тэднийг анхдагч цацраг гэж нэрлэе. Эдгээр цацрагуудын зарим нь чөлөөт орон зайд нисч, зарим нь биетийг цохих болно. Цацраг нь хугарч, тэдгээрт тусах боломжтой. Энэ тохиолдолд цацрагийн энергийн нэг хэсэг нь шингээгдэх болно. Хугарсан болон ойсон туяа нь олон хоёрдогч цацраг үүсгэдэг. Дараа нь эдгээр цацрагууд дахин хугарч, ойж, шинэ үеийн туяа үүсгэнэ. Эцсийн эцэст зарим цацраг нь камерт тусч, дүрс үүсгэх болно.

Энэ алгоритмын дагуу ажилладаг алгоритмууд байдаг. Гэхдээ эх үүсвэрээс гарч буй ихэнх туяа камерт хүрдэггүй тул тэдгээр нь туйлын үр дүнгүй юм. Гэхдээ хэрэв та маш их цаг хугацаа шаардагдах олон тооны туяаг дагаж мөрдвөл хүлээн зөвшөөрөгдсөн зургийг авах болно. Энэ алгоритмыг шууд туяа хянах гэж нэрлэдэг.

Урвуу туяаг хянах арга нь гэрлийн туяа хайх ажиллагааг эрс багасгадаг. Энэ аргыг 1980-аад онд Уиттэд, Кайе нар боловсруулсан. Энэ аргын хувьд туяаг эх сурвалжаас биш камераас хянадаг. Тиймээс зургийн нягтралтай тэнцэх тодорхой тооны туяаг зурдаг.

Бид түүнээс h зайд байрлах камер, дэлгэцтэй гэж бодъё. Дэлгэцийг дөрвөлжин болгон хуваацгаая. Дараа нь бид камераас дөрвөлжин бүрийн төв рүү (анхдагч туяа) туяаг ээлжлэн зурах болно. Ийм туяа тус бүрийн үзэгдлийн объекттой огтлолцох хэсгийг олж, бүх уулзваруудын дундаас камерт хамгийн ойрыг сонгоцгооё. Дараа нь, хүссэн гэрэлтүүлгийн загварыг ашигласнаар та дүр зургийг авах боломжтой. Энэ бол туяа хянах хамгийн энгийн арга юм. Энэ нь зөвхөн үл үзэгдэх ирмэгийг таслах боломжийг танд олгоно.

Гэхдээ бид цаашаа явж чадна. Хэрэв бид тусгал, хугарал зэрэг үзэгдлүүдийг дуурайхыг хүсвэл хамгийн ойрын уулзвараас хоёрдогч цацрагийг эхлүүлэх хэрэгтэй. Жишээлбэл, гадаргуу нь гэрлийг тусгаж, төгс тэгш байвал гадаргуугаас анхдагч цацрагийг тусгаж, энэ чиглэлд хоёрдогч туяа илгээх шаардлагатай. Хэрэв гадаргуу тэгш бус байвал олон тооны хоёрдогч цацрагийг эхлүүлэх шаардлагатай болно. Хөтөлбөрт энэ нь хийгдээгүй, учир нь энэ нь мөрдөх ажиллагааг ихээхэн удаашруулна.

Хэрэв объект нь тунгалаг бол хугарсан үед анхны туяа үүсгэдэг хоёрдогч цацрагийг бий болгох шаардлагатай. Зарим бие нь сарнисан хугарлын шинж чанартай байж болно. Энэ тохиолдолд нэг биш, харин олон хугарсан туяа үүсдэг. Бодлогын нэгэн адил би үүнийг үл тоомсорлодог.

Тиймээс объекттой огтлолцсон анхдагч туяа нь ерөнхийдөө хоёр цацрагт хуваагддаг (туссан ба хугарсан). Дараа нь энэ хоёр туяа дахин хоёр хуваагдана гэх мэт.

Миний программ дахь урвуу туяаг хянах гол процедур бол Ray процедур юм. Энэ нь дараахь бүтэцтэй.

Хэрэв цацраг үүсгэх хамгийн их рекурсын гүнтэй тэнцүү бол бид бүх бүрэлдэхүүн хэсгүүдийн дундаж гэрэлтүүлгийг буцаана. Үгүй бол цаашаа яв

Бид цацраг огтлолцох хамгийн ойрын гурвалжинг тодорхойлно.

Хэрэв ийм гурвалжин байхгүй бол арын өнгийг буцаана уу.

Хэрэв огтлолцсон гадаргуу нь тусгалтай бол бид ойсон туяа үүсгэж, туяа үүсгэх 1-ээр нэмэгдсэн Ray процедурыг рекурсив гэж нэрлэнэ.

Хэрэв огтлолцсон гадаргуу хугарч байвал хугарсан туяа үүсгэж, туяа үүсгэх 1-ээр нэмэгдсэн цацрагийн процедурыг рекурсив гэж нэрлэнэ.

Бид эх үүсвэрийн байршил, материалын шинж чанар, мөн туссан болон хугарсан цацрагийн эрчмийг харгалзан пикселийн эцсийн гэрэлтүүлгийг тодорхойлно.

Сарнисан хугарал, тэгш бус тольны тухай ярихдаа мөрдөх аргын хэд хэдэн хязгаарлалтыг би аль хэдийн хэлэлцсэн. Бусдыг нь харцгаая.

Зөвхөн тусгай объектууд - гэрлийн эх үүсвэрүүд нь дүр зургийг гэрэлтүүлж чадна. Тэдгээр нь цэгтэй төстэй бөгөөд гэрлийг шингээх, хугалах, тусгах чадваргүй.

Цацруулагч гадаргуугийн шинж чанарууд нь сарнисан ба спекуляр гэсэн хоёр бүрэлдэхүүн хэсгээс бүрдэнэ.

Сарнисан тусгалын хувьд зөвхөн гэрлийн эх үүсвэрийн цацрагийг харгалзан үздэг. Хэрэв эх үүсвэр нь толин тусгалаар (бөжинтэй) цэгийг гэрэлтүүлж байвал тухайн цэгийг гэрэлтүүлээгүй гэж үзнэ.

Specularity нь мөн хоёр бүрэлдэхүүн хэсэгт хуваагддаг.

тусгал - бусад объектуудын тусгалыг харгалзан үздэг (гэрлийн эх үүсвэр биш)

specular - гэрлийн эх үүсвэрийн хурц гэрлийг харгалзан үздэг

Мөшгих нь гэрлийн долгионы уртаас хамаарах хамаарлыг тооцохгүй.

Хугарлын индекс

шингээлтийн коэффициент

тусгалын коэффициент

Би сарнисан тусгал, хугарлыг загварчлаагүй тул арын гэрэлтүүлэг авч чадахгүй. Тиймээс бид хамгийн бага арын гэрэлтүүлгийг нэвтрүүлж байна. Ихэнхдээ энэ нь зургийн чанарыг мэдэгдэхүйц сайжруулах боломжийг олгодог.

Мөшгих алгоритм нь маш өндөр чанартай сүүдэр зурах боломжийг олгодог. Энэ нь алгоритмыг дахин боловсруулах шаардлагагүй болно. Та үүн дээр ямар нэг зүйл нэмэх хэрэгтэй болно. Цэгүүдийн гэрэлтүүлгийг тооцоолохдоо гэрлийн эх үүсвэр бүрт "Сүүдрийн фронт" байрлуулах шаардлагатай. "Сүүдрийн фронт" нь цэг ба эх үүсвэрийн хооронд ямар нэгэн зүйл байгаа эсэхийг шалгадаг туяа юм. Хэрэв тэдгээрийн хооронд тунгалаг объект байгаа бол цэг нь сүүдэрт байна. Энэ нь энэ эх сурвалж нь цэгийн эцсийн гэрэлтүүлэгт нэмэр болохгүй гэсэн үг юм. Хэрэв ил тод объект хэвтэж байвал эх үүсвэрийн эрч хүч буурна. Сүүдэр зурах нь маш их цаг хугацаа шаарддаг. Тиймээс зарим тохиолдолд тэд хөгжлийн бэрхшээлтэй байдаг.

Миний программ нь дүрсийг жигд болгох чадвартай. Antialiasing нь пикселийн өнгийг тодорхойлохын тулд хийдэг зүйл юм. Нэг туяа биш, харин дөрвөн туяа хөөргөж, эдгээр цацрагуудын дундаж өнгөний утгыг тодорхойлно. Хэрэв пикселийн өнгийг (i,j) олох шаардлагатай бол дэлгэцийн хавтгай дээрх цэгүүдэд координат (i-0.25,j-0.25), (i-0.25,j+0.25), 4 туяа илгээгдэнэ. (i+0.25,j-0.25) , (i+0.25,j+0.25).



Танд нийтлэл таалагдсан уу? Найзуудтайгаа хуваалцаарай!