2012-08-15 16 views
5

मैं खुशी से लिबजीडीएक्स फ्रेमवर्क की स्प्राइटबैच कक्षा का उपयोग कर रहा हूं। मेरा लक्ष्य एक शेडर के माध्यम से स्प्राइट के प्रतिनिधित्व को संशोधित करना है।LibGDX SpriteBatch मल्टीटेक्चर संभव है?

batch = new SpriteBatch(2, shaderProgram); 

मैं SpriteBatch कक्षा से डिफ़ॉल्ट शेडर की नकल की और एक अन्य वर्दी नमूना 2 डी

+ "uniform sampler2D u_Texture2;\n"// 

जोड़ा वहाँ एक काम कर रास्ता शेडर को बनावट दे रहा है। ऐसा करने से, सब कुछ एक ClearColor स्क्रीन में समाप्त होता है।

batch.begin(); 
    texture2.bind(1); 
    shaderProgram.setUniformi("u_Texture2", 1); 
    batch.draw(spriteTexture,positions[0].x,positions[0].y); 
    batch.draw(spriteTexture,positions[1].x,positions[1].y); 
batch.end(); 

अकेले प्रत्येक बनावट काम कर रही है। मेष कक्षा की मदद से मैन्युअल रूप से ड्राइंग की अपेक्षा की जाती है। तो मैं स्प्राइटबैच की सुविधा का उपयोग करने के लिए क्या कर सकता हूं?

THX सहायता

उत्तर

6

के लिए मैं इस समस्या वहाँ बनावट बाइंडिंग से संबंधित है लगता है। SpriteBatch asumes कि सक्रिय बनावट इकाई 0 हो जाएगा, तो यह

बजाय lastTexture.bind();lastTexture.bind(0);

समस्या को फोन करेगा कि सक्रिय इकाई आप इसे दे रहे हैं 1 है (जैसा कि आप अपने कोड में texture2.bind(1); कहते हैं)। इसलिए, बनावट इकाई 0 कभी बाध्य नहीं होती है, और हो सकता है कि रिक्त स्क्रीन हो।

उदाहरण के लिए, मैं draw कॉल से पहले Gdx.GL20.glActiveTexture(0); जोड़ दूंगा। मुझे पूरा यकीन नहीं है कि यह समस्या का समाधान करेगा, लेकिन यह एक शुरुआत है!

संपादित करें: मैं अपने सुझाए गए समाधान का प्रयास करता हूं और यह काम करता है! : डी। स्पष्ट होने के लिए, आपको यह करना चाहिए:

 batch.begin(); 
     texture2.bind(1); 
     shaderProgram.setUniformi("u_Texture2", 1); 
     Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);//This is required by the SpriteBatch!! 
      //have the unit0 activated, so when it calls bind(), it has the desired effect. 
     batch.draw(spriteTexture,positions[0].x,positions[0].y); 
     batch.draw(spriteTexture,positions[1].x,positions[1].y); 
    batch.end(); 
+0

अरे आखिर में मुझे जवाब मिला, धन्यवाद! आप सही हैं। इस तरह का कारण है कि वर्ग बनावट को बांधता है। मुझे यह कहना है कि मैंने पहले से ही अपनी खुद की कस्टम स्प्राइटबैच कक्षा बनाई है। स्प्राइटबैच ने बड़े आकार के फ़्रेमबफर बनावट को प्रस्तुत करने में कुछ समस्याएं भी दिखायी हैं। और मैं हमेशा पहले टेक्स्ट 0 बांधता हूं। Thats क्यों मैंने इसे अपना रास्ता तय करने का फैसला किया। कम समझदार लेकिन रास्ता अधिक लचीला। अब मेरे पास स्प्राइट बैच है जो केवल ऊर्ध्वाधर की पीढ़ी को संभालता है। सब कुछ चारों ओर अपने शेडर्स के साथ अनुकूलित किया जा सकता है। – fky

+1

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

+1

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