कंप्यूटर ग्राफिक्स को प्रदर्शित करने में सीपीयू और जीपीयू कैसे बातचीत करता है?


58

यहाँ आप एक छोटा C ++ प्रोग्राम का स्क्रीनशॉट देख सकते हैं, जिसे OpenGL API पर आधारित घूर्णन त्रिकोण के साथ Triangle.exe कहा जाता है।

यहाँ छवि विवरण दर्ज करें

बेशक एक बहुत ही बुनियादी उदाहरण है, लेकिन मुझे लगता है कि यह अन्य ग्राफिक कार्ड के संचालन के लिए लागू है।

मैं अभी उत्सुक था और विंडोज एक्सपी के तहत ट्राइंगल.नेट पर डबल क्लिक करने से पूरी प्रक्रिया जानना चाहता था, जब तक कि मैं मॉनिटर पर त्रिकोण को घूमता हुआ नहीं देख सकता। क्या होता है, कैसे CPU (जो पहली बार .exe) को हैंडल करता है और GPU (जो आखिरकार स्क्रीन पर त्रिकोण को आउटपुट करता है) इंटरैक्ट करता है?

मुझे लगता है कि इस घूर्णन त्रिकोण को प्रदर्शित करने में मुख्य रूप से निम्नलिखित हार्डवेयर / सॉफ्टवेयर दूसरों के बीच शामिल हैं:

हार्डवेयर

  • HDD
  • सिस्टम मेमोरी (RAM)
  • सी पी यू
  • वीडियो स्मृति
  • GPU
  • एलसीडी प्रदर्शन

सॉफ्टवेयर

  • ऑपरेटिंग सिस्टम
  • DirectX / OpenGL API
  • एनवीडिया चालक

क्या कोई इस प्रक्रिया की व्याख्या कर सकता है, शायद चित्रण के लिए किसी प्रकार के प्रवाह चार्ट के साथ?

यह एक जटिल स्पष्टीकरण नहीं होना चाहिए जो हर एक कदम को कवर करता है (अनुमान है कि गुंजाइश से परे होगा), लेकिन एक स्पष्टीकरण एक मध्यवर्ती आईटी आदमी का पालन कर सकता है।

मुझे पूरा यकीन है कि बहुत से ऐसे लोग हैं जो खुद को आईटी पेशेवर भी कहेंगे, इस प्रक्रिया का सही वर्णन नहीं कर सकते हैं।


यदि आप जीपीयू को सीपीयू का विस्तार मान सकते हैं तो आपकी दुविधा खत्म हो जाएगी!
कावईएक्स मार्क्स

जवाबों:


55

मैंने प्रोग्रामिंग पहलू के बारे में थोड़ा लिखने का फैसला किया और कैसे घटक एक दूसरे से बात करते हैं। शायद यह कुछ क्षेत्रों पर कुछ प्रकाश डाला जाएगा।

प्रदर्शन

स्क्रीन पर खींची गई उस एकल छवि में भी क्या होता है, जिसे आपने अपने प्रश्न में पोस्ट किया है?

स्क्रीन पर एक त्रिकोण खींचने के कई तरीके हैं। सरलता के लिए, मान लें कि कोई शीर्ष बफ़र उपयोग नहीं किया गया था। (एक शीर्ष बफ़र मेमोरी का एक क्षेत्र है जहां आप निर्देशांक संग्रहीत करते हैं।) मान लें कि प्रोग्राम ने ग्राफिक्स प्रोसेसिंग पाइपलाइन को हर एक शीर्ष के बारे में बताया (एक शीर्ष केवल एक अंतरिक्ष में एक समन्वय है)।

लेकिन , इससे पहले कि हम कुछ भी आकर्षित कर सकें, हमें पहले कुछ मचान चलाना होगा। हम देखेंगे क्यों बाद में:

// Clear The Screen And The Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// Reset The Current Modelview Matrix
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();

// Drawing Using Triangles
glBegin(GL_TRIANGLES);

  // Red
  glColor3f(1.0f,0.0f,0.0f);
  // Top Of Triangle (Front)
  glVertex3f( 0.0f, 1.0f, 0.0f);

  // Green
  glColor3f(0.0f,1.0f,0.0f);
  // Left Of Triangle (Front)
  glVertex3f(-1.0f,-1.0f, 1.0f);

  // Blue
  glColor3f(0.0f,0.0f,1.0f);
  // Right Of Triangle (Front)
  glVertex3f( 1.0f,-1.0f, 1.0f);

// Done Drawing
glEnd();

तो उसने क्या किया?

जब आप एक प्रोग्राम लिखते हैं जो ग्राफिक्स कार्ड का उपयोग करना चाहते हैं, तो आप आमतौर पर ड्राइवर को किसी प्रकार का इंटरफ़ेस चुनेंगे। ड्राइवर के लिए कुछ प्रसिद्ध इंटरफेस हैं:

  • ओपन
  • Direct3D
  • CUDA

इस उदाहरण के लिए हम OpenGL से चिपके रहेंगे। अब, अपने ड्राइवर के लिए इंटरफ़ेस क्या आप सभी उपकरण आप अपने कार्यक्रम बनाने की जरूरत है देता है बात ग्राफिक्स कार्ड के लिए (या ड्राइवर है, जो तब वार्ता कार्ड के लिए)।

यह इंटरफ़ेस आपको कुछ उपकरण देने के लिए बाध्य है । ये उपकरण एक एपीआई का आकार लेते हैं जिसे आप अपने प्रोग्राम से कॉल कर सकते हैं।

वह एपीआई जो हम ऊपर उदाहरण में उपयोग किया जा रहा है देखते हैं। आओ हम इसे नज़दीक से देखें।

मचान

इससे पहले कि आप वास्तव में कोई वास्तविक ड्राइंग कर सकें, आपको एक सेटअप करना होगा । आपको अपना व्यूपोर्ट (वह क्षेत्र जो वास्तव में प्रदान किया जाएगा), आपके दृष्टिकोण ( आपकी दुनिया में कैमरा ) को परिभाषित करना होगा , आप किस विरोधी-विचलन का उपयोग कर रहे हैं (अपने त्रिकोण के किनारे को सुचारू करने के लिए) ...

लेकिन हम उसमें से किसी पर भी गौर नहीं करेंगे। हम आपके द्वारा हर फ्रेम में किए गए सामान पर एक नज़र डालेंगे । पसंद:

स्क्रीन को साफ करना

ग्राफिक्स पाइपलाइन आपके लिए हर फ्रेम में स्क्रीन को साफ करने वाला नहीं है। आपको बताना पड़ेगा। क्यों? इसलिए:

यहाँ छवि विवरण दर्ज करें

यदि आप स्क्रीन को साफ नहीं करते हैं, तो आप बस इसे हर फ्रेम पर खींच लेंगे । यही कारण है कि हम फोन है glClearके साथ GL_COLOR_BUFFER_BITसेट। अन्य बिट ( GL_DEPTH_BUFFER_BIT) ओपन बफर को गहराई बफर को साफ करने के लिए कहता है । इस बफ़र का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन से पिक्सेल अन्य पिक्सेल के सामने (या पीछे) हैं।

परिवर्तन

यहाँ छवि विवरण दर्ज करें
छवि स्रोत

परिवर्तन वह हिस्सा है जहां हम सभी इनपुट निर्देशांक (हमारे त्रिकोण के कोने) लेते हैं और हमारे मॉडल व्यू मैट्रिक्स को लागू करते हैं। यह वह मैट्रिक्स है जो बताता है कि हमारे मॉडल (कोने) को कैसे घुमाया, बढ़ाया और अनुवादित किया गया (स्थानांतरित)।

अगला, हम अपने प्रोजेक्शन मैट्रिक्स को लागू करते हैं। यह सभी निर्देशांक को स्थानांतरित करता है ताकि वे हमारे कैमरे का सही ढंग से सामना करें।

अब हम अपने व्यूपोर्ट मैट्रिक्स के साथ एक बार फिर रूपांतरण करते हैं। हम अपने मॉडल को अपने मॉनिटर के आकार के पैमाने पर करने के लिए ऐसा करते हैं । अब हमारे पास वर्टिकल का एक सेट है जो रेंडर करने के लिए तैयार है!

हम थोड़ी देर बाद परिवर्तन पर लौट आएंगे।

चित्रकारी

एक त्रिकोण आकर्षित करने के लिए, हम बस एक नया शुरू करने के लिए ओपन बता सकते हैं त्रिकोण की सूची को फोन करके glBeginसाथ GL_TRIANGLESनिरंतर।
ऐसे अन्य रूप भी हैं जिन्हें आप आकर्षित कर सकते हैं। एक त्रिकोण पट्टी या एक त्रिकोण प्रशंसक की तरह । ये मुख्य रूप से अनुकूलन हैं, क्योंकि उन्हें एक ही राशि के त्रिभुजों को खींचने के लिए सीपीयू और जीपीयू के बीच कम संचार की आवश्यकता होती है।

उसके बाद, हम 3 कोने के सेट की एक सूची प्रदान कर सकते हैं जो प्रत्येक त्रिकोण को बनाना चाहिए। प्रत्येक त्रिभुज 3 निर्देशांक का उपयोग करता है (जैसा कि हम 3 डी-स्पेस में हैं)। इसके अतिरिक्त, मैं कॉल करने से पहले कॉल करके प्रत्येक शीर्ष के लिए एक रंग भी प्रदान करता हूं ।glColor3f glVertex3f

3 कोने (त्रिकोण के 3 कोनों) के बीच की छाया की गणना ओपनजीएल द्वारा स्वचालित रूप से की जाती है । यह बहुभुज के पूरे चेहरे पर रंग को प्रक्षेपित करेगा।

इंटरेक्शन

अब, जब आप विंडो पर क्लिक करते हैं। एप्लिकेशन को केवल उस विंडो संदेश को कैप्चर करना होगा जो क्लिक को इंगित करता है। तब आप अपने कार्यक्रम में कोई भी कार्रवाई कर सकते हैं जिसे आप चाहते हैं।

यह एक बहुत अधिक कठिन हो जाता है एक बार जब आप अपने 3 डी दृश्य के साथ बातचीत शुरू करना चाहते हैं।

आपको पहले यह स्पष्ट रूप से जानना होगा कि उपयोगकर्ता ने किस पिक्सेल पर विंडो क्लिक की है। फिर, अपने दृष्टिकोण को ध्यान में रखते हुए, आप किरण की दिशा की गणना कर सकते हैं, माउस के बिंदु से अपने दृश्य में क्लिक करें। फिर आप गणना कर सकते हैं यदि आपके दृश्य में किसी भी वस्तु काटती है कि किरण के साथ । अब आप जानते हैं कि क्या उपयोगकर्ता ने किसी ऑब्जेक्ट पर क्लिक किया है।

तो, आप इसे कैसे घुमाते हैं?

परिवर्तन

मुझे दो प्रकार के परिवर्तनों के बारे में पता है जो आमतौर पर लागू होते हैं:

  • मैट्रिक्स-आधारित परिवर्तन
  • अस्थि-आधारित परिवर्तन

अंतर यह है कि हड्डियां एकल कोने को प्रभावित करती हैं । मैट्रिसेस हमेशा एक ही तरह से सभी खींचे गए को प्रभावित करते हैं। आइए एक उदाहरण देखें।

उदाहरण

इससे पहले, हमने अपने त्रिकोण को खींचने से पहले अपनी पहचान मैट्रिक्स को लोड किया था । पहचान मैट्रिक्स वह है जो बस कोई परिवर्तन नहीं प्रदान करता है । इसलिए, जो भी मैं आकर्षित करता हूं, वह केवल मेरे दृष्टिकोण से प्रभावित होता है। तो, त्रिकोण को बिल्कुल भी घुमाया नहीं जाएगा।

अगर मैं इसे अब घुमाना चाहता हूं, तो मैं या तो स्वयं गणित (सीपीयू पर) कर सकता हूं और बस अन्य निर्देशांक (जो सड़ रहे हैं) के glVertex3fसाथ कॉल कर सकते हैं। या मैं glRotatefड्राइंग से पहले कॉल करके GPU को सभी काम करने दे सकता हूं :

// Rotate The Triangle On The Y axis
glRotatef(amount,0.0f,1.0f,0.0f);               

amountबेशक, सिर्फ एक निश्चित मूल्य है। यदि आप चेतन करना चाहते हैं , तो आपको amountहर फ्रेम पर नज़र रखनी होगी और उसे बढ़ाना होगा।

तो, रुकिए, पहले हुई सभी मैट्रिक्स की बातों का क्या हुआ?

इस सरल उदाहरण में, हमें मैट्रीस की परवाह नहीं करनी है। हम बस फोन करते हैं glRotatefऔर यह हमारे लिए सभी का ख्याल रखता है।

glRotateangleवेक्टर xyz के आसपास डिग्री का एक रोटेशन पैदा करता है । वर्तमान मैट्रिक्स ( glMatrixMode देखें ) को वर्तमान मैट्रिक्स की जगह उत्पाद के साथ एक रोटेशन मैट्रिक्स द्वारा गुणा किया जाता है, जैसे कि glMultMatrix को निम्न मैट्रिक्स के साथ इसके तर्क के रूप में कहा जाता है:

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

खैर, इसके लिए धन्यवाद!

निष्कर्ष

क्या स्पष्ट हो जाता है, ओपेनग्ल के लिए बहुत सारी बात है । लेकिन यह हमें कुछ नहीं बता रहा है । संचार कहाँ है?

केवल एक चीज जो ओपनजीएल हमें इस उदाहरण में बता रही है वह है जब यह किया जाता है । हर ऑपरेशन में एक निश्चित समय लगेगा। कुछ ऑपरेशन अविश्वसनीय रूप से लंबे होते हैं, अन्य अविश्वसनीय रूप से जल्दी होते हैं।

GPU के लिए एक शीर्ष भेजना इतना तेज़ होगा, मुझे यह भी नहीं पता होगा कि इसे कैसे व्यक्त किया जाए। सीपीयू से GPU तक हर एक फ्रेम में हजारों वर्टिकल भेजना, सबसे अधिक संभावना है, कोई समस्या नहीं है।

स्क्रीन साफ़ करना एक मिलीसेकंड या इससे भी बदतर हो सकता है (ध्यान रखें, आपके पास आमतौर पर प्रत्येक फ्रेम को खींचने के लिए लगभग 16 मिलीसेकंड का समय होता है), यह इस बात पर निर्भर करता है कि आपका व्यूपोर्ट कितना बड़ा है। इसे साफ़ करने के लिए, OpenGL को हर एक पिक्सेल को उस रंग में खींचना होगा जिसे आप साफ़ करना चाहते हैं, जो लाखों पिक्सेल हो सकते हैं।

इसके अलावा, हम अपने ग्राफिक्स एडॉप्टर की क्षमताओं (अधिकतम रिज़ॉल्यूशन, अधिकतम एंटी-अलियासिंग, अधिकतम रंग गहराई, ...) के बारे में बहुत कुछ ओपनग्लाल से पूछ सकते हैं।

लेकिन हम पिक्सेल के साथ एक बनावट भी भर सकते हैं जिसमें प्रत्येक का एक विशिष्ट रंग होता है। प्रत्येक पिक्सेल इस प्रकार एक मान रखता है और बनावट डेटा से भरी एक विशाल "फ़ाइल" है। हम उस ग्राफिक्स कार्ड में लोड कर सकते हैं (एक बनावट बफर बनाकर), फिर एक shader लोड करें , उस shader को हमारी बनावट को इनपुट के रूप में उपयोग करने के लिए और हमारी "फाइल" पर कुछ बेहद भारी गणनाओं को चलाने के लिए कहें।

फिर हम अपनी गणना (नए रंगों के रूप में) को एक नई बनावट में "प्रस्तुत" कर सकते हैं।

इसी तरह आप दूसरे तरीकों से अपने लिए जीपीयू काम कर सकते हैं। मुझे लगता है कि CUDA उस पहलू के समान प्रदर्शन करता है, लेकिन मुझे इसके साथ काम करने का अवसर कभी नहीं मिला।

हमने वास्तव में केवल पूरे विषय को थोड़ा छुआ था। 3 डी ग्राफिक्स प्रोग्रामिंग एक जानवर का एक नरक है।

यहाँ छवि विवरण दर्ज करें
छवि स्रोत


38

यह वास्तव में समझना मुश्किल है कि यह क्या है आप नहीं समझते।

जीपीयू में रजिस्टरों की एक श्रृंखला होती है जो BIOS मैप्स। ये CPU को GPU की मेमोरी तक पहुंचने की अनुमति देते हैं और GPU को ऑपरेशन करने का निर्देश देते हैं। CPU उन रजिस्टरों में वैल्यू करता है जो GPU की मेमोरी में से कुछ को मैप करता है ताकि CPU इसे एक्सेस कर सके। फिर यह उस मेमोरी में निर्देशों को लोड करता है। यह तब एक रजिस्टर में एक मूल्य लिखता है जो GPU को निर्देश देता है कि वह सीपीयू को उसकी मेमोरी में लोड किए गए निर्देशों को निष्पादित करे।

जानकारी में वह सॉफ़्टवेयर होता है जिसे GPU चलाने की आवश्यकता होती है। इस सॉफ्टवेयर को ड्राइवर के साथ बांधा जाता है और फिर चालक सीपीयू और जीपीयू के बीच विभाजन की जिम्मेदारी को संभालता है (अपने डिवाइस पर इसके कोड के कुछ भाग चलाकर)।

चालक तब GPU मेमोरी में "विंडोज़" की एक श्रृंखला का प्रबंधन करता है जिसे सीपीयू पढ़ और लिख सकता है। आम तौर पर, एक्सेस पैटर्न में सीपीयू लेखन निर्देश या जानकारी को मैप किए गए जीपीयू मेमोरी में शामिल किया जाता है और फिर उन निर्देशों या प्रक्रिया को निष्पादित करने के लिए एक रजिस्टर के माध्यम से जीपीयू को निर्देश दिया जाता है। जानकारी में shader लॉजिक, टेक्सचर इत्यादि शामिल हैं।


1
आपके व्याख्या के लिये धन्यवाद। मूल रूप से जो मुझे समझ नहीं आया कि सीपीयू अनुदेश सेट जीपीयू अनुदेश सेट के साथ कैसे संवाद करता है, लेकिन जाहिर है कि यह चालक है जो उस हिस्से को करता है। यही मैं अमूर्त परतों के साथ था।
JohnnyFromBF

2
कोई सीपीयू अनुदेश सेट शामिल नहीं है। ड्राइवर और रनटाइम आपके CUDA, OpenGL, Direct3D, आदि को मूल GPU प्रोग्राम / कर्नेल पर संकलित करते हैं, जो तब डिवाइस मेमोरी में भी अपलोड किए जाते हैं। कमांड बफर तब किसी अन्य संसाधन की तरह उन लोगों को संदर्भित करता है।
एक्सल गेनिटिंग

2
मुझे यकीन नहीं है कि आप किन कार्यक्रमों का उल्लेख कर रहे हैं (जो कि जीपीयू पर चलते हैं और ड्राइवरों के साथ शामिल हैं)। जीपीयू काफी हद तक फिक्स्ड फंक्शन हार्डवेयर है, और इसके द्वारा चलाए जाने वाले एकमात्र प्रोग्राम शेड हैं, जो एप्लिकेशन द्वारा प्रदान किए जाते हैं, ड्राइवर नहीं। ड्राइवर केवल इन कार्यक्रमों को संकलित करता है, और फिर उन्हें gpu की मेमोरी में लोड करता है।
बेन रिचर्ड्स

1
@ साइड्रन 32: उदाहरण के लिए, एनवीडिया के केपलर आर्किटेक्चर में, गुठली, स्ट्रीम और इवेंट्स को सॉफ्टवेयर द्वारा बनाया जाता है जो जीपीयू पर चलता है, न कि (आमतौर पर) सीपीयू पर। GPU- साइड सॉफ्टवेयर RDMA को भी प्रबंधित करता है। उस सॉफ्टवेयर के सभी चालक द्वारा जीपीयू मेमोरी में लोड किया जाता है और जीपीयू पर "मिनी-ओएस" के रूप में चलता है जो सीपीयू / जीपीयू कोऑपरेटिंग जोड़ी के जीपीयू-साइड को संभालता है।
डेविड श्वार्ट्ज

@DavidSchwartz मैं GPU कम्प्यूट कार्यों के बारे में भूल गया। हालांकि, वे अभी भी shaders के समान व्यवहार करते हैं, कार्यान्वयन में, वैसे भी। मैं इसे "मिनी-ओएस" नहीं कहूंगा, हालांकि, इसमें समान कार्यक्षमता नहीं है जो आमतौर पर ओएस के साथ जुड़ी होती है। यह अभी भी बहुत विशिष्ट सॉफ्टवेयर है, क्योंकि GPU को सीपीयू (अच्छे कारण के लिए) की तरह डिज़ाइन नहीं किया गया है।
बेन रिचर्ड्स

13

मैं अभी उत्सुक था और विंडोज एक्सपी के तहत ट्राइंगल.नेट पर डबल क्लिक करने से पूरी प्रक्रिया जानना चाहता था, जब तक कि मैं मॉनिटर पर त्रिकोण को घूमता हुआ नहीं देख सकता। क्या होता है, कैसे CPU (जो पहली बार .exe) को हैंडल करता है और GPU (जो आखिरकार स्क्रीन पर त्रिकोण को आउटपुट करता है) इंटरैक्ट करता है?

आइए आप यह मान लें कि आप वास्तव में जानते हैं कि एक निष्पादन प्रणाली ऑपरेटिंग सिस्टम पर कैसे चलती है और यह कैसे निष्पादन योग्य आपके GPU से मॉनिटर पर भेजा जाता है, लेकिन बीच में क्या हो रहा है, इसके बारे में नहीं जानते। तो, चलो एक हार्डवेयर पहलू से नज़र डालें और प्रोग्रामर पहलू उत्तर पर और विस्तार करें ...

CPU और GPU के बीच इंटरफ़ेस क्या है?

ड्राइवर का उपयोग करते हुए , CPU ग्राफिक्स कार्ड के लिए PCI जैसी मदरबोर्ड सुविधाओं के माध्यम से बात कर सकता है और इसे कुछ GPU निर्देशों को निष्पादित करने, GPU मेमोरी को एक्सेस / अपडेट करने, GPU पर निष्पादित करने के लिए एक कोड में लोड और अधिक ...

लेकिन, आप वास्तव में कोड से हार्डवेयर या ड्राइवर से सीधे बात नहीं कर सकते हैं; इसलिए, यह OpenGL, Direct3D, CUDA, HLSL, Cg जैसे API के माध्यम से होगा। जबकि पूर्व में संचालित GPU निर्देश और / या GPU मेमोरी को अपडेट करते हैं, बाद वाला वास्तव में GPU पर कोड निष्पादित करेगा क्योंकि वे भौतिकी / shader भाषाएँ हैं।

GPU पर कोड क्यों चलाते हैं और CPU पर नहीं?

जबकि सीपीयू हमारे दैनिक कार्य केंद्र और सर्वर कार्यक्रमों को चलाने में अच्छा है, इन दिनों के खेल में उन सभी चमकदार ग्राफिक्स के बारे में बहुत कुछ नहीं सोचा गया था। उन दिनों में सॉफ्टवेयर रेंडर थे, जिन्होंने कुछ 2D और 3D चीजों से चाल चली थी, लेकिन वे बहुत सीमित थे। तो, यहाँ वह जगह है जहाँ GPU खेल में आया था।

जीपीयू को ग्राफिक्स, मैट्रिक्स मैनिपुलेशन में सबसे महत्वपूर्ण गणना में से एक के लिए अनुकूलित किया गया है । जबकि CPU को एक-एक-एक (बाद में, 3DNow जैसी चीजों ! और SSE ने गति पकड़ी) में प्रत्येक गुणन की गणना करना है, GPU उन सभी गुणाओं को एक ही बार में कर सकता है! समानांतरवाद।

लेकिन समानांतर गणना एकमात्र कारण नहीं है, दूसरा कारण यह है कि GPU वीडियो मेमोरी के बहुत करीब है जो सीपीयू, आदि के माध्यम से गोल यात्राएं करने की तुलना में बहुत तेज करता है ...

ये GPU निर्देश / मेमोरी / कोड ग्राफिक्स कैसे दिखाते हैं?

यह सब काम करने के लिए एक लापता टुकड़ा है, हमें कुछ चाहिए जो हम लिख सकते हैं जिसे हम फिर से पढ़ सकते हैं और स्क्रीन पर भेज सकते हैं। हम एक फ्रेमबफ़र बनाकर ऐसा कर सकते हैं । आप जो भी ऑपरेशन करते हैं, आप अंततः फ़्रेमबफ़र में पिक्सेल को अपडेट करेंगे; जो स्थान के अलावा रंग और गहराई के बारे में भी जानकारी रखता है।

आइए आपको एक उदाहरण देते हैं जहां आप कहीं एक रक्त स्प्राइट (एक छवि) खींचना चाहते थे; सबसे पहले, पेड़ की बनावट को स्वयं GPU मेमोरी में लोड किया जाता है जो इसे इच्छानुसार फिर से बनाना आसान बनाता है। इसके बाद, वास्तव में स्प्राइट को आकर्षित करने के लिए हम वर्टेक्स का उपयोग करके स्प्राइट का अनुवाद कर सकते हैं (इसे सही स्थिति में लाते हुए), इसे रस्टराइज़ करते हुए (इसे 3 डी ऑब्जेक्ट से पिक्सेल में बदलकर) और फ्रेमबफ़र को अपडेट करें। एक बेहतर विचार प्राप्त करने के लिए, यहाँ विकिपीडिया से एक OpenGL पाइपलाइन प्रवाह चार्ट दिया गया है:

यह पूरे ग्राफिक्स विचार का मुख्य सार है, अधिक शोध पाठक के लिए होमवर्क है।


7

चीजों को सरल रखने के लिए हम इसका वर्णन इस प्रकार कर सकते हैं। कुछ मेमोरी पते आरक्षित हैं (BIOS और / या ऑपरेटिंग सिस्टम) रैम के लिए नहीं बल्कि वीडियो कार्ड के लिए। उन मूल्यों (पॉइंटर्स) पर लिखा गया कोई भी डेटा कार्ड में जाता है। इसलिए सिद्धांत रूप में कोई भी कार्यक्रम केवल पता सीमा को जानकर सीधे वीडियोकार्ड में लिख सकता है और यह ठीक उसी तरह है जैसे पुराने दिनों में वापस किया जाता था। आधुनिक ओएस के साथ अभ्यास में यह वीडियो ड्राइवर और / या शीर्ष पर ग्राफिक्स लाइब्रेरी (डायरेक्टएक्स, ओपनजीएल आदि) द्वारा प्रबंधित किया जाता है।


1
-1 वह पूछता है कि सीपीयू से एक डायरेक्टएक्स एपीआई कॉल कैसे जीपीयू के साथ संवाद कर सकता है, और आपका जवाब "यह ड्राइवर और / या डायरेक्टएक्स द्वारा प्रबंधित है" ? यह भी नहीं बताता है कि कस्टम कोड (ala CUDA) कैसे चलाया जा सकता है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

3
कृपया पढ़ना सीखें। मैंने विशिष्ट मेमोरी पतों को लिखकर कहा है जो रैम के बजाय GPU के लिए आरक्षित हैं। और यह बताता है कि आप सब कुछ कैसे चला सकते हैं। एक मेमोरी रेंज एक कार्ड के लिए पंजीकृत है। उस श्रेणी में आप जो कुछ भी लिखते हैं वह GPU पर चल रहा है, जो कि वर्सेटेक्स प्रोसेसिंग, CUDA, जो भी हो।
अज।

5

GPU आमतौर पर DMA बफ़र्स द्वारा संचालित होते हैं। यही है, चालक इसे उपयोगकर्ता के अंतरिक्ष कार्यक्रम से प्राप्त होने वाले आदेशों को निर्देश की एक धारा में बदल देता है (स्विच राज्य, इसे इस तरह से ड्रा करें, संदर्भों को स्विच करें, आदि), जो तब डिवाइस मेमोरी में कॉपी किए जाते हैं। यह तब GPU को निर्देश देता है कि इस कमांड बफर को PCI रजिस्टर या इसी तरह के तरीकों से निष्पादित करें।

तो हर ड्रा कॉल आदि पर क्या होता है कि यूजर स्पेस ड्राइवर कमांड को संकलित करेगा, जो तब कर्नेल स्पेस ड्राइवर को एक बाधा के माध्यम से कॉल करता है और अंत में डिवाइस मेमोरी में कमांड बफर को सबमिट करता है और GPU को रेंडर करना शुरू करने का निर्देश देता है।

शान्ति पर आप भी अपने आप को यह सब करने के लिए मज़ा कर सकते हैं, विशेष रूप से PS3 पर।


0

मुझे लगता है कि CPU बस के माध्यम से GPU के लिए वीडियो डेटा भेजता है और फिर GPU इसे प्रदर्शित करता है। इतनी तेजी से GPU CPU से अधिक डेटा को संभाल सकता है। इस तरह से CPU को cpuoffload की कुछ प्रोसेसिंग। इसलिए आपको खेलों में तेज गति मिलती है।

यह RAM की तरह है जहाँ CPU स्टोर करता है ताकि यह जल्दी से लोड और प्रोसेस हो सके। दोनों खेल को तेज करते हैं।

या साउंड कार्ड या नेट कार्ड उसी सिद्धांत पर काम करते हैं, जो डेटा प्राप्त करता है और सीपीयू के कुछ काम को लोड करता है।


यह एक और उत्तर को दोहराता है और कोई नई सामग्री नहीं जोड़ता है। कृपया जवाब न दें जब तक कि आपके पास योगदान देने के लिए वास्तव में कुछ नया न हो।
DavidPostill

0

मुझे लगता है कि ऑप को यकीन नहीं है कि वास्तव में सीपीयू ग्राफिक्स कार्ड को क्या करने के लिए कह रहा है और क्यों ग्राफिक्स से संबंधित कमांड (जैसे ओपेंगल या डायरेक्ट 3 डी कमांड) को सीधे जीपीयू में नहीं भेजा जाता है।

CPU सिर्फ GPU को बताता है कि रेंडर क्या करना है। सभी निर्देश पहले सीपीयू के माध्यम से जाते हैं जहां वे सेटअप करते हैं / जीपीयू के लिए प्रारंभिक रूप से वास्तव में प्रतिपादन करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.