2 डी गेम और आधुनिक ओपनजीएल


10

Preconcepts

ठीक है, तो जो मैंने अभी तक इकट्ठा किया है वह यह है:

  • तय पाइपलाइन का उपयोग न करें (पदावनत या पदावनत होने वाला)
  • vbos स्टोर "ऑब्जेक्ट मॉडल" (एन वर्टेक्स डेटा, ज्यादातर)
  • vaos वर्णन करता है कि डेटा कैसे निर्धारित किया जाता है ताकि कॉल कॉल पता चले कि प्रत्येक vbo का कौन सा भाग किस तरह की शीर्ष जानकारी के लिए है (एक वाओ कई vbos को संदर्भित कर सकता है, विपरीत थोड़े मुश्किल है)
  • प्रत्येक ड्रॉ कॉल भी शाफ़्ट डेटा को shaders को भेजता है

मैं 3D (वैकल्पिक) कैसे देखूं

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

समस्या / प्रश्न

2 डी समस्याओं और प्राथमिकताओं में पूरी तरह से अलग हैं, हालांकि। आप बहुत जटिल वस्तुओं को आकर्षित नहीं करते हैं, आपको जटिल प्रोजेक्शन मैट्रिक्स की आवश्यकता नहीं है और व्हाट्सएप और शेड्स बहुत सरल हैं।

आधुनिक ओपनजीएल के साथ ज्यामिति को बार-बार (वास्तव में अक्सर, मूल रूप से हर फ्रेम) खींचने का सबसे अच्छा तरीका क्या होगा?

निम्नलिखित पैराग्राफ में आप समस्याओं (सर्कल और आयत समस्या) के कुछ विचारों को देख सकते हैं, यह बेहतर है कि मैं किस तरह के बदलावों में दिलचस्पी रखता हूं।

मेरे प्रयास (वैकल्पिक)

इसलिए, मैंने यह सोचना शुरू किया कि मैं स्क्रीन पर बुनियादी 2D ज्यामिति खींचने से कैसे निपटूंगा:

  • एक वर्ग: [(1, 0), (1, 1), (0, 1), (0, 0)]स्थानीय स्थान में एक वर्ग की ज्यामिति के लिए एक VBO लोड करें , फिर वर्ग की वास्तविक चौड़ाई और विश्व निर्देशांक और रंग सूचना के साथ शेड प्रदान करें

शांत, आसान लग रहा है। चलो एक सर्कल में चलते हैं:

  • एक वृत्त: त्रिकोण पंखा के साथ ... एह। कितना सटीक (वर्टेक्स की संख्या)? छोटे हलकों के लिए सटीक छोटा होना चाहिए और बग सर्कल के लिए सटीक उच्च होना चाहिए। स्पष्ट रूप से लोड हो रहा है 1 VBO संभवतः सभी मामलों में फिट नहीं हो सकता है। क्या होगा अगर मुझे सटीक जोड़ने की आवश्यकता है क्योंकि एक सर्कल का आकार बड़ा होने के लिए है?

कम ठंडा। चलो थोड़ा आसान करने के लिए कदम, एक आयत:

  • एक आयत: एह। कोई "सामान्य आयत ज्यामिति" नहीं है। आपके पास बस एक चौड़ाई / ऊँचाई का अनुपात है और यही है, लेकिन आकार में परिवर्तन होने पर प्रत्येक आयत शायद अलग होती है।

जैसा कि आप देख सकते हैं, चीजें वहां से ढलान पर जाती हैं। विशेष रूप से जटिल बहुभुज और whatnot के साथ।

कोई कोड नीति: P

मुझे सिर्फ विचार का अवलोकन चाहिए, कोई कोड आवश्यक नहीं है, विशेष रूप से C या C ++ कोड। जैसे सामान कहें: "इस शीर्ष डेटा के साथ एक वीबीओ बनाएं, और फिर इसे बांधें, ..."।


मुझे लगता है कि मैं समझता हूं कि आप क्या पूछ रहे हैं, लेकिन आप इस सवाल को थोड़ा और दिशा देना चाह सकते हैं। यह थोड़ा अस्पष्ट है कि क्या पूछा जा रहा है - जो वास्तव में एक करीबी कारण है।
लाइसोल

@AidanMueller मुझे यकीन नहीं है कि आपका क्या मतलब है, लेकिन ज़रूरत महसूस होने पर अधिक दिशा देने के लिए स्वतंत्र महसूस करें।
जूता

वर्तमान में शीर्ष उत्तर यह कहकर शुरू होता है कि "आप मुख्य प्रश्न लगते हैं"। यह इंगित करता है कि यह स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। हो सकता है कि आपको अपने प्रश्न के अंत में जो कुछ भी जानने की आवश्यकता हो उसका सारांश देना चाहिए। यह एक प्रश्नोत्तर है, चर्चा नहीं।
लाइसोल

@AidanMueller उस संदर्भ में नहीं, मेरा मानना ​​है। यह कहता है "आपका मुख्य प्रश्न लगता है ..." और फिर वह मेरे द्वारा पोस्ट किए गए प्रश्न को उद्धृत करता है। जो वास्तव में इंगित करता है कि उद्धृत किया जाना पर्याप्त है। साथ ही वाक्यांश यह इंगित करता है कि मेरा प्रश्न अस्पष्ट है, बल्कि यह कि एक मुख्य प्रश्न और दूसरा माध्यमिक प्रश्न है (जो है: मेरे द्वारा प्रस्तुत विशिष्ट मामलों का समाधान क्या है)। मैं वास्तव में अपने वर्तमान प्रश्न के साथ समस्या नहीं देखता हूं, और जाहिर है कि उत्तरदाताओं ने भी ऐसा नहीं किया है क्योंकि मैंने दोनों उत्तर बहुत उपयोगी और बिंदु पर पाए हैं।
जूता

आप एक टुकड़ा के साथ एक सटीक सर्कल आकर्षित कर सकते हैं।
user253751

जवाबों:


5

आपका मुख्य प्रश्न लगता है:

आधुनिक ओपनजीएल के साथ ज्यामिति को बार-बार (वास्तव में अक्सर, मूल रूप से हर फ्रेम) खींचने का सबसे अच्छा तरीका क्या होगा?

ज्यादातर तरीकों से, 2 डी और 3 डी ओपनजीएल के बीच कोई बड़ा अंतर नहीं है। ग्राफिक्स पाइपलाइन में एक अतिरिक्त समन्वय Z है, जिसका उपयोग 2d में उतना नहीं किया जाएगा, लेकिन यह इसके बारे में है।

प्रत्येक ड्रॉ पर ज्यामिति को बदलने के कुछ तरीके हैं।

  • आप प्रत्येक फ्रेम में नए सीपीयू-प्रदान किए गए वर्टेक्स को धक्का दे सकते हैं। (देखें /programming/14155615/opengl-updating-vertex-buffer-with-glbufferdata कुछ नोटों को पुन: उपयोग करने के लिए।)

  • आप एक मौजूदा बफर के विभिन्न भागों को आकर्षित कर सकते हैं glDrawArrays(mode, first, count)। यदि एनीमेशन लूप करता है, तो हो सकता है कि आप एक बड़े बफर में अलग-अलग वर्टेक्स लिस्ट के साथ प्रीकम्प्यूटेड फ्रेम रख सकते हैं, और बफर के उपयुक्त हिस्से को प्रत्येक फ्रेम ड्रा करें।

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

  • यदि आपके पास एक ही ज्यामिति के कई उदाहरण हैं (संभवतः विशेषताओं से प्रभावित), तो glDrawElementsInstanced()उपयोगी हो सकता है

  • आप शीर्ष सूची को मौखिक रूप से, ज्यामिति, या टेसलेशन शेड्स में एल्गोरिदम को प्रभावित कर सकते हैं। यदि एनीमेशन को गणितीय रूप से वर्णित किया जा सकता है, तो आप एक ही शीर्ष सूची को रखने में सक्षम हो सकते हैं, और प्रत्येक फ्रेम में बस कुछ shader वर्दी बदल सकते हैं।

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

कुल मिलाकर, मैं कहूंगा, "कंप्यूटर तेज़ हैं, इसे आप सबसे आसान तरीका बना सकते हैं, जो संभवत: हर फ्रेम में ताज़ा सीपीयू-निर्मित वर्टेक्स सेट करके है। फिर, देखें कि क्या यह काफी अच्छा है। बैटरी / सीपीयू का उपयोग करें। पहला, स्मृति पदचिह्न दूसरा। "

आपके अन्य प्रश्न , ने पूछा , "मंडलियों और आयतों को खींचने का एक अच्छा तरीका क्या है?"

मंडलियां।

  • Tessellation shaders (या geometry shaders) के साथ आप अपने ज्यामिति को गतिशील बना सकते हैं।

  • आप वर्गों को आकर्षित कर सकते हैं, और आपके टुकड़े में केवल त्रिज्या के भीतर अपारदर्शी (अल्फा = 1.0) और त्रिज्या के बाहर पारदर्शी (अल्फा = 0.0) हो सकता है। फिर यह हर बार पिक्सेल परफेक्ट होता है। (अपने वर्गाकार शीर्षों को -1 से +1 करें, और टुकड़े टुकड़े में कुछ इस तरह से; outColor.a = dot(coord.xy, coord.xy) < 1.0 ? 1.0 : 0.0;और किनारे को थोड़ा चिकना भी कर सकता है, वहां अच्छा लगेगा ...)

  • आप हमेशा एक 120-त्रिकोण प्रशंसक का उपयोग कर सकते हैं। शायद काफी अच्छा।

आयत।

  • मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया, उस पर। आप जो सुझाव देंगे वह ठीक चलेगा!

टुकड़ा-shader / त्रिज्या बहुत साफ है, धन्यवाद। मेरे अपने प्रश्न का उत्तर देने के संबंध में, मुझे नहीं लगता कि मुझे समझ में आया कि आपका क्या मतलब है।
जूता 15

ओह, जैसे एक वर्ग के साथ, आप चौड़ाई को नियंत्रित करने का उल्लेख करते हैं (वर्दी के साथ, मुझे लगता है), और आपने लिखा था, "आपके पास केवल चौड़ाई / ऊंचाई का अनुपात है और यह है, लेकिन आकार में परिवर्तन होने पर प्रत्येक आयत शायद अलग है" । तो, एक आयत के लिए, एक वर्ग के समान करें, लेकिन आपको 3 (x, y, w) के बजाय 4 मान (x, y, w, h) की आवश्यकता होगी। या (xlow, xhigh, ylow, yhigh) चार वर्दी के रूप में पास करें। आपके (0,0) से (1,1) इनपुट के साथ, यह वर्टेक्स शेडर के लिए पर्याप्त है कि इसे क्या करना है।
david van brink

ओह, मैं देख रहा हूँ, यह समझ में आता है।
जूता

क्या निश्चित फ़ंक्शन पाइपलाइन से GL_TRIANGLE_FAN जैसे आधुनिक GL में स्वचालित प्रशंसक है?
जॉन पी

5

मैं इस विषय के विशेषज्ञ होने के लिए नहीं कह सकता हूं, और अपने गेम प्रोजेक्ट (एस) में मैंने 3 डी की तरफ अधिक ध्यान केंद्रित किया है, इसलिए मेरा 2 डी पक्ष सामान्य रूप से 3 डी साइड के लिए बनाई गई चीजों का उपयोग करके बहुत सरल है; और जाहिर है, मेरा दृष्टिकोण गेमिंग की ओर है, इसलिए मेरे 2 डी ग्राफिक्स ज्यामिति की तुलना में स्प्राइट को ब्लिट करने के बारे में अधिक है। उस दृष्टिकोण से,

1) चौकों और आयतों में बहुत आसान है। मेरे पास एक वीबीओ में सिर्फ 1x1 बॉक्स है, जिसका उपयोग मैं सब कुछ धुंधला करने के लिए करता हूं। मैं इस "यूनिट बॉक्स" के साथ shader करने के लिए MVP मैट्रिक पास करता हूं, और मैंने इसे अतिरिक्त स्केलिंग के साथ जोड़कर बॉक्स को सही आयामों में स्केल किया है - जैसा कि आप जानते हैं, आपके पास अलग-अलग x और y स्केल हो सकते हैं।

अपने उद्देश्यों के लिए, मैं 2 डी स्प्राइट्स को ब्लिट करने के लिए "यूनिट बॉक्स" का उपयोग करके किसी प्रकार के कण इंजन से हटने की सोच रहा हूं, लेकिन एक और कहानी है।

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

VBO डेटा को shader विशेषताओं से कनेक्ट करते समय, मैं glVertexAttribPointer का उपयोग करता हूं। इसमें स्ट्राइड पैरामीटर का उपयोग इंटरलेव्ड डेटा (जो मैं उपयोग करता हूं) के लिए किया जाना है। लेकिन इसे इस तरह इस्तेमाल करना संभव हो सकता है:

glVertexAttribPointer(..., n * sizeof(VERTEX_DATA), ...);

... बफ़र से हर nth वर्टेक्स को लेने के लिए, इस प्रकार सर्कल के लिए तैयार किए गए वर्टिकल की संख्या को प्रभावित करता है। मैं कई वीएओ बना सकता हूं जिनके पास एक ही वीबीओ है, जो सर्कल के लिए खींचे गए शीर्ष की संख्या को प्रभावित करता है। मैंने ऐसा नहीं सोचा है।

सामान्य तौर पर, हाँ, वीबीओ के साथ काम करना और इस तरह से सीपीयू-साइड ट्विकिंग को और अधिक जटिल बना देता है, क्यों मैं जीपीयू साइड (शेड्स) पर ट्विकिंग बनाने के लिए विभिन्न चीजों का अध्ययन कर रहा हूं। फिर भी, इस लेख के अनुसार, VBO का उपयोग करना आधुनिक हार्डवेयर पर अधिक कुशल है, भले ही आपको CPU पक्ष "हस्तक्षेप" की बहुत आवश्यकता हो।

http://www.quelsolaar.com/opengl_performance.txt

आशा है कि यह आपकी दिशाओं को डिजाइन और तय करने में थोड़ी मदद करेगा।


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