CPU और GPU रेंडर कंप्यूटर ग्राफिक्स के लिए कैसे इंटरैक्ट करते हैं?
आपके कंप्यूटर की सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) और ग्राफिक्स प्रोसेसिंग यूनिट (जीपीयू) हर पल आपके कंप्यूटर का उपयोग करते हुए आपको एक कुरकुरा और उत्तरदायी सॉफ्टवेयर इंटरफेस देने के लिए बातचीत करते हैं। बेहतर ढंग से समझने के लिए पढ़ें कि वे एक साथ कैसे काम करते हैं.
के द्वारा तस्वीर sskennel.
आज का प्रश्न और उत्तर सत्र सुपरयूज़र के सौजन्य से आता है-स्टैक एक्सचेंज का एक उपखंड, क्यू एंड ए वेब साइटों की एक सामुदायिक-ड्राइव ग्रुपिंग।.
प्रश्न
सुपरयूजर पाठक सत्या ने सवाल उठाया:
यहां आप एक छोटा C ++ प्रोग्राम का स्क्रीनशॉट देख सकते हैं, जिसका नाम OpenGL API पर आधारित एक ट्राइएंगल त्रिभुज है.
बेशक एक बहुत ही बुनियादी उदाहरण है, लेकिन मुझे लगता है कि यह अन्य ग्राफिक कार्ड के संचालन के लिए लागू है.
मैं अभी उत्सुक था और पूरी प्रक्रिया जानना चाहता था जब तक मैं त्रिभुज। क्या होता है, कैसे CPU (जो पहली बार .exe) को हैंडल करता है और GPU (जो आखिरकार स्क्रीन पर त्रिकोण को आउटपुट करता है) इंटरैक्ट करता है?
मुझे लगता है कि इस घूर्णन त्रिकोण को प्रदर्शित करने में मुख्य रूप से निम्नलिखित हार्डवेयर / सॉफ्टवेयर शामिल हैं:
हार्डवेयर
- HDD
- सिस्टम मेमोरी (RAM)
- सी पी यू
- वीडियो स्मृति
- GPU
- आयसीडी प्रदर्शन
सॉफ्टवेयर
- ऑपरेटिंग सिस्टम
- DirectX / OpenGL API
- एनवीडिया चालक
क्या कोई इस प्रक्रिया की व्याख्या कर सकता है, शायद चित्रण के लिए किसी प्रकार के प्रवाह चार्ट के साथ?
यह एक जटिल स्पष्टीकरण नहीं होना चाहिए जो हर एक कदम को कवर करता है (अनुमान है कि गुंजाइश से परे होगा), लेकिन एक व्याख्या एक मध्यवर्ती आईटी व्यक्ति का पालन कर सकता है.
मुझे पूरा यकीन है कि बहुत से लोग खुद को आईटी पेशेवर भी कहेंगे, जो इस प्रक्रिया का सही वर्णन नहीं कर सकते.
उत्तर
हालांकि कई समुदाय के सदस्यों ने इस सवाल का जवाब दिया, ओलिवर साल्ज़बर्ग ने अतिरिक्त मील चला गया और न केवल विस्तृत प्रतिक्रिया के साथ बल्कि उत्कृष्ट ग्राफिक्स के साथ इसका जवाब दिया.
जेसन द्वारा छवि, यहां वॉलपेपर के रूप में उपलब्ध है.
वह लिखता है:
मैंने प्रोग्रामिंग पहलू के बारे में थोड़ा लिखने का फैसला किया और कैसे घटक एक दूसरे से बात करते हैं। शायद यह कुछ क्षेत्रों पर कुछ प्रकाश डालेंगे.
प्रदर्शन
उस एकल छवि के लिए भी क्या होता है, जिसे आपने अपने प्रश्न में पोस्ट किया है, स्क्रीन पर खींची गई है?
स्क्रीन पर एक त्रिकोण खींचने के कई तरीके हैं। सरलता के लिए, मान लें कि कोई शीर्ष बफ़र उपयोग नहीं किया गया था। (ए वर्टेक्स बफरस्मृति का एक क्षेत्र है जहाँ आप निर्देशांक संग्रहित करते हैं।) मान लें कि प्रोग्राम ने ग्राफिक्स प्रोसेसिंग पाइपलाइन को हर एक शीर्ष के बारे में बताया (पंक्ति में एक शीर्ष स्थान में केवल एक समन्वय है).
परंतु, इससे पहले कि हम कुछ भी आकर्षित कर सकें, हमें पहले कुछ मचान चलाना होगा। हम देखेंगे क्यूं कर बाद में:
// स्क्रीन साफ़ करें और गहराई बफ़र glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // वर्तमान मॉडलव्यू मैट्रिक्स glMatrixMode (GL_MODELVIEW) को रीसेट करें; glLoadIdentity (); // त्रिभुज glBegin (GL_TRIANGLES) का उपयोग करके ड्राइंग; // लाल glColor3f (1.0f, 0.0f, 0.0f); // टॉप ऑफ़ ट्राइएंगल (फ्रंट) glVertex3f (0.0f, 1.0f, 0.0f); // हरा glColor3f (0.0f, 1.0f, 0.0f); // त्रिभुज (फ्रंट) के बाईं ओर glVertex3f (-1.0f, -1.0f, 1.0f); // ब्लू ग्लॉसर 3 एफ (0.0f, 0.0f, 1.0f); // त्रिभुज (फ्रंट) का अधिकार glVertex3f (1.0f, -1.0f, 1.0f); // हो गया ड्राइंग glEnd ();
तो उसने क्या किया?
जब आप एक प्रोग्राम लिखते हैं जो ग्राफिक्स कार्ड का उपयोग करना चाहते हैं, तो आप आमतौर पर ड्राइवर को किसी प्रकार का इंटरफ़ेस चुनेंगे। ड्राइवर के लिए कुछ प्रसिद्ध इंटरफेस हैं:
- ओपन
- Direct3D
- CUDA
इस उदाहरण के लिए हम OpenGL से चिपके रहेंगे। अब आपका ड्राइवर को इंटरफ़ेस वह है जो आपको अपने कार्यक्रम बनाने के लिए आवश्यक सभी उपकरण प्रदान करता है बातचीत ग्राफिक्स कार्ड (या ड्राइवर, जो तब बाते कार्ड के लिए).
यह इंटरफ़ेस आपको कुछ देने के लिए बाध्य है उपकरण. ये उपकरण एक एपीआई का आकार लेते हैं जिसे आप अपने प्रोग्राम से कॉल कर सकते हैं.
वह एपीआई जो हम देखते हैं, जिसका उपयोग ऊपर दिए गए उदाहरण में किया जा रहा है। आओ हम इसे नज़दीक से देखें.
मचान
इससे पहले कि आप वास्तव में कोई वास्तविक ड्राइंग कर सकें, आपको एक प्रदर्शन करना होगा सेट अप. आपको अपना व्यूपोर्ट (वह क्षेत्र जो वास्तव में प्रदान किया जाएगा), आपके दृष्टिकोण (ए) को परिभाषित करना होगा कैमरा आपकी दुनिया में), आपके द्वारा उपयोग किए जा रहे एंटी-एलियासिंग (आपके त्रिकोण के किनारे को सुचारू करने के लिए) ...
लेकिन हम उसमें से किसी पर भी गौर नहीं करेंगे। हम आपके द्वारा किए जाने वाले सामान पर एक नज़र डालेंगे हर फ्रेम. पसंद:
स्क्रीन को साफ करना
ग्राफिक्स पाइपलाइन आपके लिए हर फ्रेम के लिए स्क्रीन को साफ करने वाला नहीं है। आपको बताना पड़ेगा। क्यूं कर? इसलिए:
यदि आप स्क्रीन को साफ़ नहीं करते हैं, तो आप बस करेंगे खत्म हो जाना यह हर फ्रेम। इसलिए हम बुलाते हैं glClear
उसके साथGL_COLOR_BUFFER_BIT
सेट। दूसरा बिट (GL_DEPTH_BUFFER_BIT
) OpenGL को स्पष्ट करने के लिए कहता है गहराईबफर। इस बफ़र का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन से पिक्सेल अन्य पिक्सेल के सामने (या पीछे) हैं.
परिवर्तन
छवि स्रोत
परिवर्तन वह हिस्सा है जहां हम सभी इनपुट निर्देशांक (हमारे त्रिकोण के कोने) लेते हैं और हमारे ModelView मैट्रिक्स को लागू करते हैं। यह वह मैट्रिक्स है जो बताते हैं कैसे हमारे आदर्श (कोने) घुमाए गए, स्केल किए गए और अनुवादित (स्थानांतरित) हैं.
अगला, हम अपने प्रोजेक्शन मैट्रिक्स को लागू करते हैं। यह सभी निर्देशांक को स्थानांतरित करता है ताकि वे हमारे कैमरे का सही ढंग से सामना करें.
अब हम अपने व्यूपोर्ट मैट्रिक्स के साथ एक बार फिर रूपांतरण करते हैं। हम इसे अपने पैमाने के लिए करते हैं आदर्श हमारे मॉनिटर का आकार। अब हमारे पास वर्टिकल का एक सेट है जो रेंडर करने के लिए तैयार है!
हम थोड़े समय बाद परिवर्तन पर लौट आएंगे.
चि त्र का री
एक त्रिकोण बनाने के लिए, हम बस OpenGL को एक नया शुरू करने के लिए कह सकते हैं त्रिकोण की सूची फोन करके glBegin
उसके साथ GL_TRIANGLES
स्थिर.
ऐसे अन्य रूप भी हैं जिन्हें आप आकर्षित कर सकते हैं। एक त्रिकोण पट्टी या एक त्रिकोण प्रशंसक की तरह। ये मुख्य रूप से अनुकूलन हैं, क्योंकि उन्हें सीपीयू और जीपीयू के बीच कम संचार की आवश्यकता होती है ताकि समान मात्रा में त्रिकोण बना सकें.
उसके बाद, हम 3 कोने के सेट की एक सूची प्रदान कर सकते हैं जो प्रत्येक त्रिकोण को बनाना चाहिए। हर त्रिभुज 3 निर्देशांक का उपयोग करता है (जैसा कि हम 3 डी-स्पेस में हैं)। इसके अतिरिक्त, मैं भी एक प्रदान करते हैं रंग प्रत्येक शीर्ष के लिए, कॉल करकेglColor3f
से पहले बुला glVertex3f
.
3 कोने (त्रिकोण के 3 कोनों) के बीच की छाया की गणना ओपनजीएल द्वारा की जाती हैखुद ब खुद. यह बहुभुज के पूरे चेहरे पर रंग को प्रक्षेपित करेगा.
इंटरेक्शन
अब, जब आप विंडो पर क्लिक करते हैं। एप्लिकेशन को केवल उस विंडो संदेश को कैप्चर करना होगा जो क्लिक को इंगित करता है। फिर आप अपने कार्यक्रम में कोई भी कार्रवाई कर सकते हैं जिसे आप चाहते हैं.
यह ए बहुत एक बार जब आप अपने 3 डी दृश्य के साथ बातचीत शुरू करना चाहते हैं तो अधिक मुश्किल है.
आपको पहले यह स्पष्ट रूप से जानना होगा कि उपयोगकर्ता ने किस पिक्सेल पर विंडो क्लिक की है। फिर, अपने ले रहा है परिप्रेक्ष्यखाते में, आप किरण की दिशा की गणना कर सकते हैं, माउस के बिंदु से अपने दृश्य में क्लिक करें। आप तब गणना कर सकते हैं यदि आपके दृश्य में कोई वस्तु intersects उस किरण के साथ। अब आप जानते हैं कि क्या उपयोगकर्ता ने किसी ऑब्जेक्ट पर क्लिक किया है.
तो, आप इसे कैसे घुमाते हैं?
परिवर्तन
मुझे दो प्रकार के परिवर्तनों के बारे में पता है जो आमतौर पर लागू होते हैं:
- मैट्रिक्स-आधारित परिवर्तन
- अस्थि-आधारित परिवर्तन
अंतर यह है कि हड्डियों एकल को प्रभावित करें कोने. मैट्रिसेस हमेशा एक ही तरह से सभी खींचे हुए सिरों को प्रभावित करते हैं। आइए एक उदाहरण देखें.
उदाहरण
इससे पहले, हमने अपना लोड किया पहचान मैट्रिक्स हमारे त्रिकोण ड्राइंग से पहले। पहचान मैट्रिक्स वह है जो बस प्रदान करता है कोई परिवर्तन नहीं बिल्कुल भी। इसलिए, जो भी मैं आकर्षित करता हूं, वह केवल मेरे दृष्टिकोण से प्रभावित होता है। तो, त्रिकोण को बिल्कुल भी घुमाया नहीं जाएगा.
यदि मैं इसे अब घुमाना चाहता हूं, तो मैं या तो स्वयं गणित (सीपीयू पर) कर सकता हूं और बस कॉल कर सकता हूं glVertex3f
साथ मेंअन्य निर्देशांक (जो घुमाए जाते हैं)। या मैं GPU को कॉल करके, सभी काम करने दे सकता था glRotatef
ड्राइंग से पहले:
// Y अक्ष glRotatef (राशि, 0.0f, 1.0f, 0.0f) पर त्रिभुज को घुमाएं;
रकम
बेशक, सिर्फ एक निश्चित मूल्य है। यदि आप चाहते हैं चेतन, आपको नज़र रखनी होगी रकम
और इसे हर फ्रेम में बढ़ाएँ.
तो, रुको, पहले सभी मैट्रिक्स की बात का क्या हुआ?
इस सरल उदाहरण में, हमें मैट्रीस की परवाह नहीं करनी है। हम बस फोन करते हैं glRotatef
और यह सब हमारे लिए ध्यान रखता है.
glRotate
का एक रोटेशन पैदा करता हैकोण
वेक्टर x y z के चारों ओर डिग्री। वर्तमान मैट्रिक्स (viewglMatrixMode) को वर्तमान मैट्रिक्स की जगह उत्पाद के साथ एक रोटेशन मैट्रिक्स द्वारा गुणा किया जाता है, क्योंकि ifglMultMatrix को निम्न मैट्रिक्स के साथ इसके तर्क के रूप में कहा जाता है:x 2 1 - c + cx y c 1 - c - z sx z y 1 - c + y 0 s 0 y x - 1 - c + z 2 sy 2 1 - c + cy z - 1 - c - x 0 s 0 x z c 1 - c - y - sy z x 1 - c + x z sz 2 - 1 - c + c 0 0 0 0 0 1
खैर, इसके लिए धन्यवाद!
निष्कर्ष
जो स्पष्ट हो जाता है, बहुत बात है सेवा मेरे ओपन। लेकिन यह नहीं बता रहा है हमें कुछ भी। संचार कहां है?
इस उदाहरण में OpenGL हमें बता रही है कि केवल एक चीज है जब ये पूर्ण हो जाए. हर ऑपरेशन में एक निश्चित समय लगेगा। कुछ ऑपरेशन अविश्वसनीय रूप से लंबे होते हैं, अन्य अविश्वसनीय रूप से जल्दी होते हैं.
एक शीर्ष भेजना GPU इतना तेज़ होगा, मुझे यह भी नहीं पता होगा कि इसे कैसे व्यक्त किया जाए। सीपीयू से GPU तक हर एक फ्रेम में हजारों वर्टिकल भेजना, सबसे अधिक संभावना है, कोई समस्या नहीं है.
स्क्रीन को साफ करना एक मिलीसेकंड या उससे भी बुरा समय ले सकते हैं (ध्यान रखें, आपके पास आमतौर पर प्रत्येक फ्रेम को खींचने के लिए लगभग 16 मिलीसेकंड का समय होता है), यह इस बात पर निर्भर करता है कि आपका व्यूपोर्ट कितना बड़ा है। इसे साफ़ करने के लिए, OpenGL को हर एक पिक्सेल को उस रंग में खींचना होगा जिसे आप साफ़ करना चाहते हैं, जो लाखों पिक्सेल हो सकते हैं.
इसके अलावा, हम अपने ग्राफिक्स एडॉप्टर की क्षमताओं (अधिकतम रिज़ॉल्यूशन, अधिकतम एंटी-अलियासिंग, अधिकतम रंग गहराई, ...) के बारे में बहुत कुछ पूछ सकते हैं।.
लेकिन हम पिक्सेल के साथ एक बनावट भी भर सकते हैं जिसमें प्रत्येक का एक विशिष्ट रंग होता है। प्रत्येक पिक्सेल इस प्रकार एक मूल्य रखता है और बनावट डेटा से भरा एक विशाल "फ़ाइल" है। हम उस ग्राफिक्स कार्ड में लोड कर सकते हैं (एक बनावट बफर बनाकर), फिर एक shader को लोड करें, उस shader को हमारी बनावट को इनपुट के रूप में उपयोग करने के लिए और हमारी "फाइल" पर कुछ बेहद भारी गणनाएँ चलाने के लिए कहें।.
फिर हम अपनी गणना (नए रंगों के रूप में) को एक नई बनावट में "प्रस्तुत" कर सकते हैं.
इसी तरह आप दूसरे तरीकों से अपने लिए जीपीयू काम कर सकते हैं। मुझे लगता है कि CUDA उस पहलू के समान प्रदर्शन करता है, लेकिन मुझे इसके साथ काम करने का अवसर कभी नहीं मिला.
हमने वास्तव में पूरे विषय को केवल थोड़ा सा छुआ है। 3 डी ग्राफिक्स प्रोग्रामिंग एक जानवर का एक नरक है.
छवि स्रोत
स्पष्टीकरण में कुछ जोड़ना है? टिप्पणियों में ध्वनि बंद। अन्य टेक-सेवी स्टैक एक्सचेंज उपयोगकर्ताओं से अधिक उत्तर पढ़ना चाहते हैं? पूरी चर्चा धागा यहाँ देखें.