Кіріспе

Компьютерлік графика техникасы

Көлеңке көлемі — 3D компьютерлік графикада рендерленген көрініске көлеңкелер қосу үшін қолданылатын техника. Оны алғаш 1977 жылы Фрэнк Кроу жарық көзінен жасырылған аймақтың 3D пішінін сипаттайтын геометрия ретінде ұсынды. Көлеңке көлемі виртуалды әлемді екіге бөледі: көлеңкедегі және көлеңкеден тыс аймақтарға. Көлеңке көлемдерін штамп буфері арқылы іске асыру, қазіргі заманғы 3D графикалық жабдықтарда қолдануға болатын ең тиімді және жалпы мақсаттағы нақты уақыт көлеңкелеу техникасы саналады. Бұл техника Doom 3 видео ойыны арқылы танымал болды, ал осы ойында қолданылған техниканың ерекше түрі «Кармак керісі» деп аталды. Көлеңке көлемі, көлеңке карталаумен қатар, нақты уақыт көлеңкелеу үшін кең таралған құралға айналды. Көлеңке көлемдерінің басты артықшылығы — олар пикселдерге дейін дәлдікпен көлеңке береді (бірақ көптеген іске асыруларда силуэт жиегі бойымен шағын өз-көлеңкелеу мәселесі болуы мүмкін, төмендегі құрылымын қараңыз), ал көлеңке картасының дәлдігі оған бөлінген текстуралық жадқа және көлеңкелердің түсу бұрышына байланысты (кейбір бұрыштарда көлеңке картасының дәлдігі төмендеуі мүмкін). Дегенмен, бұл техника көлеңке геометриясын жасауды қажет етеді, бұл процессорды көп жүктейді (іске асыруға байланысты). Көлеңке картасының артықшылығы — оның көбінесе жылдам жұмыс істеуі, себебі көлеңке көлемінің көпбұрыштары экран кеңістігінде өте үлкен болып келеді және оларды рендерлеуге көп уақыт қажет (әсіресе дөңгелек нысандар үшін), ал көлеңке карталарында мұндай шектеулер жоқ.

Тереңдік өтуі

Хайдманның ұсынысы бойынша, егер көлеңкелердің алдыңғы және артқы беттері жеке өтулерде көрсетілсе, нысанның алдындағы алдыңғы және артқы беттердің санын штемпель буферін пайдалану арқылы санауға болады. Егер нысанның беті көлеңкеде болса, оның және көзге арасындағы алдыңғы көлеңке беттерінің саны артқы көлеңке беттерінен көп болады. Егер олардың саны тең болса, онда нысанның беті көлеңкеде емес. Штемпель маскасын жасау процесі келесідей: Тереңдік және түс буферлеріне жазуды тоқтату. Артқы беттерді іріктеуді қосу. Штемпель операциясын тереңдік бойынша өсуге орнату (нысанның алдындағы көлеңкелерді ғана санау). Көлеңке көлемдерін көрсету (іріктеудің арқасында тек олардың алдыңғы беттері көрсетіледі). Алдыңғы беттерді іріктеуді қосу. Штемпель операциясын тереңдік бойынша азайтуға орнату. Көлеңке көлемдерін көрсету (тек олардың артқы беттері көрсетіледі). Бұл орындалғаннан кейін, барлық жарықтандырылған беттер штемпель буферінде 0 мәніне сәйкес келеді, мұнда көз бен сол бет арасындағы барлық көлеңке көлемдерінің алдыңғы және артқы беттерінің саны тең болады. Бұл тәсіл көздің өзі көлеңке көлемінің ішінде болғанда (мысалы, жарық көзі нысанның артына өткенде) қиындықтар тудырады. Осы тұрғыдан алғанда, көз бұл көлеңке көлемінің артқы бетін басқа нәрселерге қарағанда бұрын көреді, бұл бүкіл штемпель буферіне -1 смещениесін қосады, нәтижесінде көлеңкелер кері айналады. Бұл мәселені көзге қараған көлеңке көлемінің алдыңғы жағына, мысалы, алдыңғы қиылыс жазықтығында «қақпақ» бетін қосу арқылы шешуге болады. Тағы бір жағдай бар, онда көз камераның артындағы нысанның көлеңкесінде болуы мүмкін, оны да ұқсас мәселені болдырмау үшін бір жолмен жабу қажет. Көптеген стандартты іске асыруларда тереңдік бойынша дұрыс шектеуді орнату қиын болуы мүмкін, сондықтан тереңдік сәтсіздігі әдісі (төменде қараңыз) осы ерекше жағдайларда қолданылуы мүмкін. Балама ретінде, камера көлеңке көлемінің ішінде болса, штемпель буферіне әр көлеңке көлемі үшін +1 смещениесін беруге болады, бірақ оны анықтау баяу болуы мүмкін. Тағы бір әлеуетті мәселе – штемпель буферінде көз бен нысанның беті арасында көрінетін көлеңкелердің санын сақтауға жеткілікті биттер болмауы, себебі ол қанығу арифметикасын қолданады. (Егер олар арифметикалық ағынды пайдаланғанда, бұл мәселе маңызды болмас еді.) Тереңдік бойынша тестілеуді z-тестілеу деп те атайды, өйткені тереңдік буфері көбінесе z-буфер деп аталады.

Тереңдік қатесі

2000 жылға қарай бірнеше адам Хайдман әдісін тереңдікті кері аудару арқылы кез келген камера позициясында жұмыс істеуге болатынын анықтады. Объекті бетінің алдындағы көлеңке беттерін санаудың орнына, оның артындағы беттерді де оңай санауға болады, нәтижесі бірдей болады. Бұл көздің көлеңкеде қалу мәселесін шешеді, себебі көз бен объекті арасындағы көлеңке көлемдері есепке алынбайды, бірақ көлеңке көлемінің артқы жағын жабу қажет, әйтпесе көлеңкелер жоғалып кетеді. Тереңдік және түс буферлеріне жазуды тоқтатыңыз. Алдыңғы бетті іріктеуді қосыңыз. Тереңдік сәтсіздігі кезінде штампты арттыру операциясын орнатыңыз (объектінің артындағы көлеңкелерді ғана санаңыз). Көлеңке көлемдерін көрсетіңіз. Арқа бетті іріктеуді қосыңыз. Тереңдік сәтсіздігі кезінде штампты азайту операциясын орнатыңыз. Көлеңке көлемдерін көрсетіңіз. Тереңдік сәтсіздігі әдісі штамп буферінің дәлдігіне қатысты тереңдік өту әдісімен бірдей мәселелерді қарастырады. Сондай-ақ, тереңдік өту әдісі сияқты, бұл әдіс кейде z сәтсіздігі әдісі деп те аталады. Уильям Билодоу және Майкл Сонги осы техниканы 1998 жылдың қазанында ашты және 1999 жылы Creative Labs әзірлеушілерінің конференциясы Creativity-де таныстырды. Сим Дитрих осы техниканы 1999 жылдың наурыз айында GDC-де және 1999 жылдың соңында Creativity-де көрсетті. Бірнеше айдан кейін Уильям Билодоу және Майкл Сонги сол жылы «Көлеңке көлемін және штамп буферін пайдалана отырып көлеңкелерді көрсету әдісі» деген атаумен АҚШ патентіне өтініш берді. id Software компаниясының Джон Кармак 2000 жылы Doom 3 ойынын жасау кезінде осы алгоритмді тәуелсіз түрде ашты.

Ерекшелік-немесе

Жоғарыда аталған типтердің кез келгенін эксклюзивті немесе оның түрімен шамалап бағалауға болады, бұл көлбеу көлемдердің қиылысын дұрыс өңдемейді, бірақ бір рендеринг қадамын үнемдейді (толтыру уақытын ескермесе) және тек 1 биттік stencil буферін қажет етеді. Келесі қадамдар тереңдік қадамы үшін:

Тереңдік және түс буферлеріне жазуды өшіріңіз. Тереңдік қадамында stencil операциясын XOR-ға орнатыңыз (көлеңке бетінің кез келген жерінде аударыңыз). Көлеңке көлемдерін көрсетіңіз.

Оңтайландыру

Көлеңке көлемінің геометриялық есептеулерін жылдамдатудың бір әдісі – есептеулерді жүргізу үшін рендерлеу құбыржолдарының қолданыстағы бөліктерін пайдалану. Мысалы, гомогенді координаттарды пайдалану арқылы w координатын нөлге теңеп, нүктені шексіздікке дейін созуға болады. Бұл, нүктелерді орналастыру үшін шексіздікке дейін созылатын алыс қиылыс жазықтығына ие көру фрустумымен бірге болуы керек, бұл арнайы проекциялық матрицаны пайдалану арқылы жүзеге асырылады. Бұл әдіс тереңдік буферінің дәлдігін сәл төмендетеді, бірақ айырмашылық көбінесе сезілмейді. Толыққанды іске асыру үшін 2002 жылғы «Практикалық және берік стенсилдi көлеңке көлемдері аппараттық үдетілген рендеринг үшін», C. Everitt және M. Kilgard мақаласын қараңыз. Көлеңке көлемдерін растрлеу уақытын аппараттық қайшы тестісін қолдану арқылы қысқартуға болады, бұл көлеңкелерді экрандағы белгілі бір тіктөртбұрышпен шектейді. NVIDIA көрінетін сахнаға әсер етпейтін көлеңке көлемдерінің бөліктерін жоюға арналған тереңдік шектері тестісі деп аталатын аппараттық мүмкіндікті енгізді. (Бұл мүмкіндік GeForce FX 5900 моделінен бастап қолжетімді.) Бұл мүмкіндік және оның көлеңке көлемдерімен қолданылуы туралы талқылау 2005 жылғы Game Developers Conference-те ұсынылды. Тереңдік сәтсіздік әдісі көз көлеңке көлемінің ішінде болған ерекше жағдайда ғана тереңдікке өтуден артықшылықты ұсынады, сондықтан бұл жағдайды тексеру және мүмкіндігінше тереңдікке өтуді пайдалану дұрыс. Бұл тереңдік қажетсіз болған жағдайларда қажетсіз артқы жабылуды (және оған байланысты растрлеуді) болдырмайды, сондай-ақ тереңдіктің ерекше жағдайлары үшін дұрыс алдыңғы жабылу мәселесін де болдырмайды. Жаңа GPU құбырларында көлеңке көлемдерін жасау үшін геометриялық шейдерлерді пайдалануға болады. Геометриялық шейдерлерді қолдамайтын жүйелерде, вертикальді шейдерлер GPU жадында бар вертикальдарды таңдамалы түрде сығу арқылы көлеңке көлемдерін құру үшін де пайдаланылуы мүмкін.