Кіріспе

Компьютерлік графикалық кескіндерде көлеңкелерді салу әдісі Көлеңкелік карталау немесе көлеңкелік проекция - бұл 3D компьютерлік графикаға көлеңкелер қосылатын процесс. Бұл ұғымды Лэнс Уильямс 1978 жылы "Күгілген беттерде қисық көлеңкелер салу" атты мақаласында ұсынды. Содан бері ол көптеген консольдық және компьютерлік ойындарда алдын ала берілген және нақты уақыт көріністерінде қолданылды. Көлеңкелер пикселдің жарық көзінен көрінетінін тексеру арқылы, пикселді жарық көзінің көзқарасының z буферімен немесе текстура түрінде сақталған тереңдік бейнесімен салыстыру арқылы жасалады.

Көлеңке мен көлеңкелік картаның принципі

Егер сіз жарық көзінен сыртқа қарасаңыз, сіз көре алатын барлық заттар жарықта көрінеді. Алайда, сол нысандардың артында не бар, ол көлеңкеде болады. Бұл көлеңкелік картаны құрудың негізгі принципі. Жарықтың көрінісі әр беттің тереңдігін сақтай отырып, бейнеленеді (көлеңке картасы). Содан кейін, әдеттегі көрініс осы тереңдік картасына сәйкес әрбір нүктелердің тереңдігін салыстыра отырып (көзбен емес, жарықпен көрінетіндей). Бұл әдіс көлеңке көлемдеріне қарағанда аз дәл, бірақ көлеңке картасы нақты бір қолданбада кез-келген әдіс үшін қанша уақыт қажет екеніне байланысты жылдам балама болуы мүмкін және сондықтан нақты уақыт қолданбаларына қолайлы болуы мүмкін. Сонымен қатар, көлеңкелік карталар қосымша штемпель буферін пайдалануды қажет етпейді және жұмсақ жиекті көлеңкелерді шығару үшін өзгертілуі мүмкін. Ал көлеңке көлемдерінен айырмашылығы - көлеңке картасының дәлдігі оның ажыратылуымен шектеледі.

Алгоритмнің жалпы көрінісі

Көлеңкелі көріністі түсіру екі негізгі сурет салу қадамдарын қамтиды. Біріншісі көлеңкелік картаны шығарады, ал екіншісі оны сахнаға қолданады. Қолданған әдісіне (және жарық саны) байланысты екі немесе одан да көп сызуды қажет етуі мүмкін.

Көлеңкелік картаны құру

Бірінші қадам - көріністі жарықтың көзқарасынан көрсету. Нысанды жарық көзі үшін көрініс оның қалаған әсер бұрышындай кең перспективалық проекция болуы керек (бұл төрт бұрышты жарық көзі болады). Бағытты жарық үшін (мысалы, Күннен келетін жарық) орфографиялық проекцияны қолдану керек. Бұл реендерингтен тереңдік буфері алынады және сақталады. Тек тереңдік туралы ақпарат маңызды болғандықтан, сурет салу уақытын үнемдеу үшін түстер буферлерін жаңартудан аулақ болу және осы рендеринг үшін барлық жарық пен текстура есептеулерін өшіру кең таралған. Бұл тереңдік картасы көбінесе графикалық жадында текстура ретінде сақталады. Бұл тереңдік картасы жарық немесе сахнадағы объектілер өзгерген сайын жаңартылуы керек, бірақ басқа жағдайларда, мысалы, тек көру камерасы қозғалатын жағдайларда қайта қолданылуы мүмкін. (Егер бірнеше жарық болса, әр жарық үшін жеке тереңдік картасын пайдалану керек.) Көптеген іске асыруларда картаны қайта салуға кететін уақытты үнемдеу үшін көлеңке картасына сахнадағы объектілердің тек кіші жиынтығын көрсету практикалық. Сондай-ақ, объектіні жарықтан алыстататын тереңдік ауытқуы көлеңке картасын көрсету кезінде, тереңдік картасының мәні суреттелетін беттің тереңдігіне жақын болған кезде (яғни көлеңке түсіру беті) тігу мәселелерін шешу үшін қолданылуы мүмкін. Кейде осындай нәтижеге жету үшін алдыңғы беттерді кесу және тек көлеңке картасына нысандардың артқы жағын көрсету қолданылады.

Мүсінді көлеңкелеу

Екінші қадам - көлеңкелік картаны қолдану арқылы әдеттегі камераның көзқарасынан көріністі салу. Бұл процестің үш негізгі компоненті бар. Бірінші қадам - объектінің жарықтан көрінетін координаттарын табу, өйткені 3D объект экраннан геометриялық пішінін бейнелеу үшін тек X және Y осьтері бар 2D координаттарын қолданады, бұл ұңғы координаттары көлеңке картасының (тәрізді картаның) ішіндегі көлеңке бөліктерінің сәйкес келетін жиектерімен сәйкес келеді. Екінші қадам - тереңдікті тексеру, ол объектінің z мәндерін тереңдік картасындағы z мәндерімен салыстырады, содан кейін объектіні көлеңкеде немесе жарықта суретке түсіру керек.

Жарық кеңістігінің координаттары

Тереңдік картасына сәйкес нүктелерді сынау үшін оның орнын көрініс координаттары бойынша теңдестірілген орнына айналдыру керек. Бұл матрицалық көбейту арқылы жүзеге асырылады. Экрандағы объектінің орналасуы әдеттегі координаттар түрлендіруі арқылы анықталады, бірақ объектіні жарық кеңістікте орналастыру үшін координаттардың екінші жиынтығы жасалуы керек. Әлем координаттарын жарықтың көру координаттарына түрлендіру үшін қолданылатын матрица бірінші қадамда көлеңкелік картаны көрсету үшін пайдаланылғанмен бірдей (OpenGL-де бұл modelview және проекция матрицаларының көбейтіндісі). Бұл біртекті координаттар жиынтығын шығарады, олар перспективті бөлуді қажет етеді (3D проекцияны қараңыз) қалыпты құрылғы координаттарына айналады, онда әрбір компонент (x, y немесе z) -1 мен 1 аралығына түседі (егер ол жарық көріністен көрінсе). Көптеген іске асырулар (мысалы, OpenGL және Direct3D) тереңдік картасын (текстуралық картаны) іздеу үшін әдеттегі координаттар болып табылатын -1-ден 1-ге дейінгі мәндерді 0-ден 1-ге дейін карталау үшін қосымша масштабты және бейастық матрицасын көбейтуді қажет етеді. Бұл масштабтау перспективалық бөлінуден бұрын орындалуы мүмкін және алдыңғы трансформация есептеуіне сол матрицаны келесімен көбейту арқылы оңай бүктеледі: Егер шатырмен немесе басқа графикалық жабдықтармен жасалса, бұл трансформация әдетте түбір деңгейінде қолданылады, ал пайда болған мән басқа түбірлер арасында интерполяцияланады және фрагмент деңгейіне беріледі.

Тереңдік картасының сынағы

Жарық кеңістігінің координаттары табылғаннан кейін, x және y мәндері әдетте тереңдік картасының текстурасындағы орынға сәйкес келеді, ал z мәні оның байланысты тереңдігіне сәйкес келеді, оны енді тереңдік картасына қарсы сынауға болады. Егер z мәні тереңдік картасында тиісті (x,y) орналасуында сақталған мәннен үлкен болса, объект тосқауылданған объектінің артында деп есептеледі және ол ақау ретінде белгіленуі керек, оны сурет салу процесінде көлеңкеде суретке салу керек. Әйтпесе, оны жандырып алу керек. Егер (x,y) орналасу тереңдік картасынан тыс болса, бағдарламалаушы бетіні әдетте жарық немесе көлеңкелі (әдетте жарық) болуға тиіс деп шешуі керек. Шадерлік іске асыруда бұл тест фрагмент деңгейінде орындалады. Сонымен қатар, аппараттық жабдықтың пайдаланатын текстуралық картаны сақтау түрін таңдағанда мұқият болу керек: егер интерполяция жасалмаса, көлеңкеде өткір, тік бұрышты шет болады (көлеңке картасының үлкен ажыратылуымен азайтылатын әсер). Тек қана өту немесе өтпеудің орнына мәндер ауқымын (көлеңке жиегіне жақындыққа негізделген) пайдалану арқылы жұмсақ жиекті көлеңкелер шығару үшін тереңдік картасының сынағын өзгерту мүмкін. Көлеңке картасын жасау әдісін проектордың әсерін секілді жарық аймақтарға текстура салу үшін де өзгертуге болады. Жоғарыдағы суреттегі "қашықтықты картаға бейнелеу" деген тақырып осындай процестің үлгісі болып табылады.

Шын уақыттағы көлеңкелік картаның іске асырылуы

Шын уақытты көлеңке картасының негізгі кемшіліктерінің бірі - көлеңке картасының көлемі мен тереңдігі соңғы көлеңкелердің сапасын анықтайды. Бұл әдетте атау немесе көлеңкелік сабақтастық ақаулары ретінде көрінеді. Бұл шектеуді жеңудің қарапайым жолы - көлеңке картасының өлшемін ұлғайту, бірақ жады, есептеу немесе аппараттық шектеулер салдарынан бұл әрқашан мүмкін емес. Бұл шектеуді болдырмау үшін шынайы уақыт көлеңкелік картаға түсірудің кең таралған әдістері әзірленді. Бұларға Каскадты көлеңке карталары, Трапецидті көлеңке карталары, Жарық кеңістіктегі перспективалы көлеңке карталары немесе Параллельді бөлінген көлеңке карталары жатады. Сондай-ақ, пайда болған көлеңкелердің, тіпті тегін болса да, қатты жиектері бар екені байқалады, бұл әрқашан да дұрыс емес. Нақты әлемдегі жұмсақ көлеңкелерді эмуляциялау үшін көлеңке картасында бірнеше іздеулер жасап, жұмсақ жиекті эмуляциялау үшін геометрияны немесе стандартты емес тереңдікті көлеңке карталарын жасау арқылы бірнеше шешімдер әзірленді. Бұлардың көрнекті мысалдары - пайыздық жақын сүзгілеу, Smoothies және Variance Shadow карталары.

Бөліну

PSSM "Параллельді бөлу" https://developer. Nvidia. com/gpugems/GPUGems3/gpugems3 ch10 деген сайтта бар. html CSM "Каскадталған" http://developer. жүктеу. Nvidia. com/SDK/10.5/opengl/src/cascaded shadow maps/doc/cascaded shadow maps. pdf

Бұрау

LiSPSM "Жаратылыс кеңістігі" https://www. Cг. тыу. ауа-райы. "Trapezoid" TSM http://www.research/vr/lispsm/ Компенсация. - Жоқ. білім беру. sg/~tants/tsm. - Қалай ойлайсыз? html PSM "Перспектива" http://www sop. инрия. fr/reves/Marc. Stamminger/psm/ CSSM "Кемер кеңістігі" http://bib. IRB. hr/datoteka/570987.12 CSSM. pdf

Тегістеу

PCF "Өлшемдік жақын сүзгілеу" https://developer. Nvidia. com/gpugems/GPUGems/gpugems ch11 дегенге сілтеме жасаңыз. html- ті

Сүзгілеу

"Экспоненциалдық" ЭСМ https://discovery. ККК. ауа-райы. uk/id/eprint/10001/1/10001. pdf CSM "Конволюция" https://doclib. пайдаланған. be/dspace/bitstream/1942/8040/1/3227. pdf VSM "Variance" http://citeseerx. - Бұл - шындық. псу. edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf SAVSM "Суммаланған аумақ ауытқушылығы" https://developer. Nvidia. com/gpugems/gpugems3/part ii light and shadows/chapter 8 summed area variance shadow maps SMSR "Shadow Map Silhouette Revectorization" http://bondarev.com/gpugems/part-ii-light-and-shadows/ бөлім 8 жиынтық аумақ ауытқулылық көлеңке карталары SMSR "Көлеңке картасы силуэті ревекторлық" http://bondarev.com/ nl/?p=326

Жұмсақ көлеңкелер

PCSS "Percentage Closer" http://developer. жүктеу. Nvidia. com/shaderlibrary/docs/shadow PCSS. Бұл файлдар файлдарды өңдеуге арналған. pdf VSSM "Variance Soft Shadow Mapping" https://jankautz. com/publications/VSSM PG2010. pdf SSSS "Экран кеңістігіндегі жұмсақ көлеңкелер" http://www. crcnet базасы. com/doi/abs/10.1201/b10648 36 FIV "Толық сфералық сәулелену векторы" http://getlab. org/publications/FIV/