ओपन: बैच रेंडरर: चाहिए परिवर्तनों पर जगह ले CPU या GPU?

0

सवाल

मैं विकसित कर रहा हूँ एक 2 डी खेल इंजन का समर्थन करेंगे कि 3 डी में भविष्य. यह वर्तमान विकास के चरण में, मैं काम कर रहा हूँ पर बैच रेंडरर. के रूप में आप में से कुछ पता हो सकता है, जब batching ग्राफिक्स के साथ, के लिए वर्दी का समर्थन रंग (आरजीबीए), बनावट निर्देशांक, बनावट आईडी (बनावट) सूचकांक, और मॉडल परिवर्तन मैट्रिक्स खिड़की से बाहर जाना है, लेकिन इसके बजाय पारित कर रहे हैं के माध्यम से शीर्ष बफर. ठीक है अब, मैं लागू किया है गुजर रहा है, मॉडल के पदों, रंग, बनावट निर्देशांक, और बनावट आईडी शीर्ष करने के लिए बफर. मेरे शीर्ष बफर प्रारूप इस तरह दिखता है ठीक है अब:

float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};

मैं हूँ के बारे में एकीकृत करने के लिए गणना की है, जहां वस्तु होना चाहिए दुनिया में अंतरिक्ष का उपयोग कर एक परिवर्तन मैट्रिक्स. यह मुझे करने के लिए सवाल पूछना:

चाहिए परिवर्तन मैट्रिक्स से गुणा किया जा मॉडल शीर्ष पदों पर CPU या GPU?

कुछ मन में रखने के लिए है कि अगर मैं इसे पारित शीर्ष करने के लिए बफर, मैं अपलोड करने के लिए होगा परिवर्तन मैट्रिक्स के प्रति एक बार शीर्ष (4 बार प्रति स्प्राइट) जो करने के लिए मुझे लगता है की बर्बादी की तरह स्मृति. दूसरे हाथ पर, गुणा मॉडल शीर्ष पदों से परिवर्तन मैट्रिक्स पर सीपीयू की तरह लगता है, यह धीमी होगी के साथ तुलना में, GPU के संगामिति क्षमताओं.

यह कैसे मेरे शीर्ष बफर प्रारूप की तरह लग रही होगी अगर मैं गणना रूपांतरण पर GPU:

float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};

सवाल यह है कि ज्यादातर सैद्धांतिक रूप से संचालित । तो, एक सैद्धांतिक और तकनीकी जवाब बहुत सराहना की जाएगी. लेकिन संदर्भ के लिए, यहाँ कोड है.

c++ glm-math glsl opengl
2021-11-24 03:43:20
2

सबसे अच्छा जवाब

1

चाहिए परिवर्तनों पर जगह ले CPU या GPU?

यह वास्तव में स्थिति पर निर्भर करता है । यदि आप पुनः अपने कोने में हर फ्रेम में, यह करने के लिए सबसे अच्छा बेंचमार्क क्या सबसे अच्छा आपके मामले के लिए. यदि आप चाहते हैं चेतन करने के लिए पुनः सबमिट किए बिना अपने सभी कोने में, आप एक विकल्प नहीं है लेकिन इसे लागू करने के लिए GPU पर.

जो भी कारण, यदि आप तय करने के लिए लागू परिवर्तनों पर GPU है, वहाँ बेहतर तरीके से कर रही है कि अन्य की तुलना में duplicating मैट्रिक्स के लिए प्रत्येक शीर्ष है. मैं बजाय डाल परिवर्तन matrices में एक SSBO:

layout(std430, binding=0) buffer Models {
    mat4 MV[]; // model-view matrices
};

और दुकान के लिए एक एकल सूचकांक में प्रत्येक शीर्ष में VAO:

struct Vert {
    float x, y, r, g, b, a, u, v;
    int textureID, model;
};

शिखर shader कर सकते हैं जाने के लिए और लाने के पूर्ण मैट्रिक्स पर आधारित सूचकांक विशेषता:

layout(location = 0) in vec4 in_pos;
layout(location = 1) in int in_model;
void main() {
    gl_Position = MV[in_model] * in_pos;
}

आप भी कर सकते हैं गठबंधन के साथ प्रति-वस्तु के गुण की तरह, textureID.

संपादित करें: आप प्राप्त कर सकते हैं के साथ कुछ इसी तरह instancing और बहु ड्रा. हालांकि यह संभावना करने के लिए धीमी हो.

2021-11-24 17:20:51

आप विस्तृत कर सकते हैं और अधिक पर क्या वास्तव में मॉडल होगा? मैं कोशिश कर रहा हूँ इसे लागू करने के लिए कर रहा हूँ और केवल एक प्रेत स्क्रीन पर और लगता है कि यह है हूँ क्योंकि मैं नहीं भेजने का अधिकार के बारे में जानकारी ।
Christopher Barrios Agosto

@ChristopherBarriosAgosto के एक सूचकांक के साथ मॉडल मैट्रिक्स में एमवी सरणी: 0, 1, 2 आदि...
Yakov Galka

के बाद से प्रतिपादन कर रहे हैं व्यक्तिगत रूप से तब्दील quads, कि हो जाएगा 0,0,0,0,1,1,1,1,2,2,2,2,... यदि आप के साथ प्रस्तुत करना glDrawElements.
Yakov Galka

मैं यह समझ से बाहर! सब कुछ अब काम करता है! पता चला मैं गुजर रहा था और व्याख्या के सूचकांकों सही है, लेकिन मैं गुजर रहा था सूचकांक के रूप में एक फ्लोट करने के लिए GLSL जब यह उम्मीद कर रहा था एक पूर्णांक है. मैं यह एक नाव में और GLSL यह कास्ट करने के लिए एक int और यह नहीं है की व्याख्या सभी सूचकांकों सही है । मैं यह करने के लिए है, क्योंकि इस तरह के शीर्ष बफर के फ्लोट प्रकार है । सब कुछ के लिए धन्यवाद!
Christopher Barrios Agosto

@ChristopherBarriosAgosto: बधाई हो कि आप यह समझ से बाहर. 'शीर्ष बफर के फ्लोट प्रकार' -- शीर्ष बफ़र्स कर रहे हैं दृश्यों के बाइट्स है । आप स्टोर कर सकते हैं structs वहाँ के साथ कुछ int क्षेत्रों, और कुछ float खेतों ।
Yakov Galka
0

मैं नहीं हूँ यकीन है कि कैसे अपने इंजन कोड वास्तव में की तरह लग रहा है, लेकिन मुझे लगता है यह की तरह लग रहा है किसी भी अन्य ओपन का कार्यक्रम है ।

यदि ऐसा है तो, मेरे अनुभव में, रूपांतरण मैट्रिक्स चाहिए आमतौर पर शिखर shader को पारित और लागू किया जा सकता है के साथ दिए गए शीर्ष के बारे में जानकारी GPU है, जब आप आकर्षित किया है । उदाहरण के लिए:

//MVP matrix
GLuint MatrixID = glGetUniformLocation(shaderProgID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

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

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

शिखर जानकारी हमेशा होना चाहिए में मॉडल निर्देशांक और संग्रहीत में शीर्ष बफर के साथ कोई संपर्क है, जब तक आप चाहते हैं को लागू करने के लिए कुछ संशोधन उन पर.

2021-11-24 03:57:24

मैं हूँ batching कई ग्राफिक्स के साथ. इसलिए, मैं का उपयोग नहीं कर सकते वर्दी पारित करने के लिए ग्राफिक्स' बदल देती है, क्योंकि मैं करने में सक्षम नहीं होगा बदलने के लिए वर्दी को बदलने के बीच में आकर्षित कॉल. हालांकि, मेरा मानना है कि का उपयोग कर SSBOs एक बहुत अच्छा विकल्प है.
Christopher Barrios Agosto

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में