Како ЦПУ и ГПУ ступају у интеракцију са Рендер компјутерском графиком?
Централна процесорска јединица вашег рачунара (ЦПУ) и графичка процесорска јединица (ГПУ) интерагују сваког тренутка када користите рачунар да бисте добили јасан и одговарајући визуелни интерфејс. Читајте даље да бисте боље разумели како они раде заједно.
Пхото би сскеннел.
Данашња сесија питања и одговора долази нам захваљујући СуперУсер-у - подели Стацк Екцханге-а, групне групације К&А веб сајтова у заједници.
Питање
Читач СуперУсер Сатхиа је поставио питање:
Овде можете видети сцреенсхот малог Ц ++ програма названог Триангле.еке са ротирајућим троуглом на основу ОпенГЛ АПИ-ја.
Додуше, то је веома једноставан пример, али мислим да је применљив на друге операције графичких картица.
Био сам само знатижељан и желио сам знати цијели процес од двоструког клика на Триангле.еке под Виндовсом КСП док не видим трокут који се окреће на монитору. Шта се дешава, како ЦПУ (који прво рукује .еке) и ГПУ-ом (који коначно исписује троугао на екрану) интерагују?
Претпостављам да је укључивање у приказивање овог ротирајућег троугла првенствено следећи хардвер / софтвер између осталог:
Хардвер
- ХДД
- Системска меморија (РАМ)
- Процесори
- Видео меморија
- ГПУ
- ЛЦД дисплеј
Софтвер
- Оперативни систем
- ДирецтКс / ОпенГЛ АПИ
- Нвидиа Дривер
Може ли итко објаснити процес, можда са неком врстом дијаграма протока за илустрацију?
То не би требало да буде сложено објашњење које покрива сваки корак (претпоставите да би то било изван оквира), али објашњење које средњи ИТ тип може да прати.
Прилично сам сигуран да многи људи који би чак и сами себе назвали ИТ професионалцима нису могли правилно описати овај процес.
Одговор
Иако је више чланова заједнице одговорило на питање, Оливер Салзбург је отишао на додатну миљу и одговорио не само детаљним одговором, већ и одличном пратећом графиком..
Имаге би ЈасонЦ, доступан као позадина.
Пише:
Одлучио сам да напишем нешто о аспекту програмирања и како компоненте разговарају једна с другом. Можда ће бацити мало светла на одређене области.
Презентација
Шта је потребно да се чак и та појединачна слика, коју сте објавили у свом питању, нацрта на екрану?
Постоји много начина да нацртате троугао на екрану. Ради једноставности, претпоставимо да нису коришћени вертек бафери. (А вертек буфферје подручје меморије гдје похрањујете координате.) Претпоставимо да је програм једноставно рекао графичкој обради цјевовода о сваком појединачном врху (врх је само координата у простору) у низу.
Али, пре него што можемо да нацртамо нешто, прво морамо да покренемо скеле. Видећемо зашто касније:
// Обришите екран и дубину Буффер глЦлеар (ГЛ_ЦОЛОР_БУФФЕР_БИТ | ГЛ_ДЕПТХ_БУФФЕР_БИТ); // Ресет тхе Цуррент Моделвиев Матрик глМатрикМоде (ГЛ_МОДЕЛВИЕВ); глЛоадИдентити (); // Цртање помоћу троуглова глБегин (ГЛ_ТРИАНГЛЕС); // Ред глЦолор3ф (1.0ф, 0.0ф, 0.0ф); // Топ Оф Триангле (Предњи) глВертек3ф (0.0ф, 1.0ф, 0.0ф); // Зелени глЦолор3ф (0.0ф, 1.0ф, 0.0ф); // Лево од троугла (Фронт) глВертек3ф (-1.0ф, -1.0ф, 1.0ф); // Блуе глЦолор3ф (0.0ф, 0.0ф, 1.0ф); // Ригхт Оф Триангле (Фронт) глВертек3ф (1.0ф, -1.0ф, 1.0ф); // Завршено цртање глЕнд ();
Шта је то урадило??
Када напишете програм који жели да користи графичку картицу, обично ћете изабрати неку врсту интерфејса за управљачки програм. Неки добро познати интерфејси за управљачки програм су:
- ОпенГЛ
- Дирецт3Д
- ЦУДА
За овај пример ћемо се држати ОпенГЛ-а. Сада, ваш интерфејс за возача је оно што вам даје све алате који су вам потребни да направите свој програм талк на графичку картицу (или управљачки програм, који онда разговора на картицу).
Овај интерфејс ће вас сигурно поуздати алата. Ови алати имају облик АПИ-ја који можете позвати из свог програма.
Тај АПИ је оно што видимо да се користи у горњем примјеру. Погледајмо изблиза.
Тхе Сцаффолдинг
Пре него што стварно урадите било који цртеж, морате да извршите а поставити. Морате да дефинишете свој приказ (област која ће се стварно приказати), вашу перспективу ( Камера у свој свет), које анти-алиасинг ћеш користити (да изгладиш ивице свог троугла) ...
Али нећемо гледати ништа од тога. Само ћемо завирити у ствари које ћете морати да урадите сваки оквир. Као:
Брисање екрана
Графички цевовод неће очистити екран за сваки кадар. Мораћеш то да кажеш. Зашто? Зато:
Ако не очистите екран, једноставно ћете драв овер сваки оквир. Зато зовемо глЦлеар
саГЛ_ЦОЛОР_БУФФЕР_БИТ
комплет. Други бит (ГЛ_ДЕПТХ_БУФФЕР_БИТ
) каже ОпенГЛ да обрише дубинабуффер. Овај бафер се користи да одреди који пиксели су испред (или иза) других пиксела.
Трансформација
Извор слике
Трансформација је део где узимамо све улазне координате (врхове нашег троугла) и примењујемо нашу МоделВиев матрицу. То је матрица објашњава како је наш модел (врхови) су ротирани, скалирани и преведени (премјештени).
Затим примењујемо нашу Пројекциону матрицу. Ово помера све координате тако да се правилно окрену ка нашој камери.
Сада се још једном трансформишемо са нашом Виевпорт матрицом. Ми то радимо да би смањили наше модел величине нашег монитора. Сада имамо скуп врхова који су спремни за рендеровање!
Вратићемо се на трансформацију мало касније.
Цртање
Да би нацртали троугао, можемо једноставно рећи ОпенГЛ-у да започне ново списак троуглова позивом глБегин
са ГЛ_ТРИАНГЛЕС
константа.
Постоје и други облици које можете нацртати. Као троугао или троугао. То су пре свега оптимизације, јер захтевају мање комуникације између ЦПУ-а и ГПУ-а за цртање исте количине троуглова.
Након тога, можемо дати листу скупа од 3 врха која би требало да чине сваки троугао. Сваки троугао користи 3 координате (као што смо у 3Д-простору). Поред тога, такође пружам а цолор за сваки врх, позивомглЦолор3ф
пре него што зове глВертек3ф
.
Нијансу између 3 врха (3 угла троугла) израчунава ОпенГЛаутоматски. Интерполира боју преко целог лица полигона.
Интеракција
Сада, када кликнете на прозор. Апликација мора само да ухвати поруку прозора која сигнализира клик. Тада можете да покренете било коју радњу у свом програму коју желите.
Ово добија лот теже када желите да започнете интеракцију са вашом 3Д сценом.
Прво морате јасно знати на којем пикселу је корисник кликнуо прозор. Онда, узми своје перспективеу обзир, можете израчунати смер зрака, од тачке клика миша на вашу сцену. Затим можете израчунати да ли је било који објект у вашој сцени интерсецтс са тим зраком. Сада знате да ли је корисник кликнуо на објекат.
Дакле, како да га ротирате?
Трансформација
Свесна сам две врсте трансформација које се генерално примењују:
- Матрична трансформација
- Трансформација базирана на костима
Разлика је у томе кости импацт сингле вертицес. Матрице увек утичу на све извучене тачке на исти начин. Погледајмо примјер.
Пример
Раније смо напунили наше идентитет матрица пре цртања нашег троугла. Матрица идентитета је она која једноставно пружа без трансформације уопште. Дакле, шта год да цртам, на мене утиче само моја перспектива. Дакле, троугао уопште неће бити ротиран.
Ако сада желим да га ротирам, могао бих или да урадим математику (на ЦПУ-у) и једноставно позовем глВертек3ф
саотхер координате (које се ротирају). Или бих могао да дозволим да ГПУ уради сав посао, тако што ће позвати глРотатеф
пре цртања:
// Ротирај троугао на И оси глРотатеф (износ, 0.0ф, 1.0ф, 0.0ф);
износ
наравно, то је само фиксна вредност. Ако желиш да анимате, Морате да пратите износ
и повећати сваки кадар.
Дакле, сачекајте, шта се догодило са свим матричним причама раније?
У овом једноставном примеру, не морамо да бринемо о матрицама. Једноставно зовемо глРотатеф
и све то брине за нас.
глРотате
производи ротацијуугао
степени око вектора к и з. Тренутна матрица (сееглМатрикМоде) се множи са ротационом матрицом са производом који замењује тренутну матрицу, као што је ифглМултМатрик позван са следећом матрицом као својим аргументом:к 2 - 1 - ц + цк и - 1 - ц - з ск з 1 - ц + и 0 с 0 и к - 1 - ц + з си 2 - 1 - ц + ци з 1 - ц - к 0 с 0 к з 1 - ц - и си з 1 - ц + к з сз 2 - 1 - ц + ц 0 0 0 0 1
Па, хвала на томе!
Закључак
Оно што постаје очигледно је да се много говори до ОпенГЛ. Али то не говори нас било шта. Где је комуникација?
Једина ствар коју нам ОпенГЛ каже у овом примеру је када се заврши. Свака операција траје одређено време. Нека операција траје невероватно дуго, други су невероватно брзи.
Слање темена на ГПУ ће бити тако брзо, не бих ни знао како да га изразим. Слање хиљада тачака из ЦПУ-а ГПУ-у, сваком појединачном оквиру, највероватније није проблем.
Брисање екрана може да траје милисекунде или још горе (имајте на уму, обично имате само око 16 милисекунди времена да нацртате сваки кадар), у зависности од тога колико је ваш видокруг велик. Да би га очистио, ОпенГЛ мора да исцрта сваки појединачни пиксел у боји коју желите да обришете, што може бити милион пиксела.
Осим тога, можемо само питати ОпенГЛ о могућностима нашег графичког адаптера (максимална резолуција, максимално анти-алиасинг, максимална дубина боје,…).
Али можемо такође попунити текстуру пикселима који имају специфичну боју. Сваки пиксел тако има вредност, а текстура је гигантски „фајл“ испуњен подацима. Можемо то учитати у графичку картицу (стварањем буффер-а текстуре), а затим учитати схадер, рећи том схадеру да користи нашу текстуру као улаз и покренути неке екстремно тешке израчуне на нашем "фајлу".
Тада можемо резултат "израчунати" (у облику нових боја) претворити у нову текстуру.
Тако можете да ГПУ ради за вас на друге начине. Претпостављам да ЦУДА ради слично том аспекту, али никада нисам имао прилику да радим са њим.
Стварно смо само мало дотакли целу тему. Програмирање 3Д графике је паклена звер.
Извор слике
Имате ли нешто да додате објашњењу? Звучи у коментарима. Желите ли прочитати више одговора од других технолошки паметних Стацк Екцханге корисника? Погледајте цео дискусију овде.