2012-08-25 21 views
11

मुझे एंड्रॉइड एमुलेटर पर बनावट भ्रष्टाचार के साथ समस्याएं आ रही हैं (यह अधिकांश एंड्रॉइड उपकरणों पर ठीक चलती है)।एंड्रॉइड ओपनग्ल बनावट भ्रष्टाचार

Android 4.1 reference rendering

ऊपर चित्र एक संदर्भ प्रतिपादन एंड्रॉयड 4.1 Jelly Bean चल एमुलेटर द्वारा उत्पादित सब कुछ एकदम सही ढंग से दिखता है,।

Android 1.6

दूसरा चित्र एमुलेटर में कब्जा Android 1.6 चल रहा है। नोट विकलांग टूलबार बटनों में से कुछ की भ्रष्टाचार

Android 1.6

तीसरे चित्र एक ही एमुलेटर में कब्जा कर लिया है (वे रंग 1f, 1f, 1f, 0.5f साथ गाया जाता है)। अंतर यह है कि अब ऊपरी-दाएं कोने में स्कोर प्रदान किया जाता है। स्कोर एक बिटमैप फ़ॉन्ट है, यह बनावट अल्फा मुखौटा है। स्कोर के बाद प्रस्तुत की गई सबकुछ इसकी बनावट को खो देती है। ध्यान दें कि पिछले स्क्रीनशॉट में बिटमैप फ़ॉन्ट भी शामिल है (लेकिन विभिन्न बनावट का उपयोग करके)।

ऐसा ही एक समस्या सैमसंग उपकरणों (मैं मॉडल याद नहीं है) में से एक पर उपस्थित थे। जब फर्श बनावट प्रदान की जाती थी, तो उस खोए हुए बनावट के बाद सबकुछ प्रस्तुत किया जाता था। समस्या तब प्रकट नहीं हुई जब मैं या तो) बनावट को बांध नहीं पाया था बी) बनावट को बांध दिया था, लेकिन इसका उपयोग करके कोई त्रिकोण नहीं बनाया सी) पीएनजी परिसंपत्ति को खरोंच से फिर से बनाया।

ओपन सेटिंग्स:

gl.glDisable(GL10.GL_LIGHTING); 
gl.glDisable(GL10.GL_CULL_FACE); 
gl.glDisable(GL10.GL_DEPTH_TEST); 
gl.glDisable(GL10.GL_DITHER); 
gl.glDepthMask(false); 
gl.glEnable(GL10.GL_TEXTURE_2D); 
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA); 
gl.glShadeModel(GL10.GL_FLAT); 
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 

कैसे बनावट लोड किए गए हैं:

public void doGLLoading(Engine renderer) { 
     GL10 gl=renderer.getGl(); 
     int[] ids=new int[1]; 
     gl.glGenTextures(1, ids,0); 
     id=ids[0]; 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, id); 
     Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString())); 
     buildMipmap(gl, bitmap); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT); 
    } 
private void buildMipmap(GL10 gl, Bitmap bitmap) { 
    int level = 0; 
    int height = bitmap.getHeight(); 
    int width = bitmap.getWidth(); 

    while (height >= 1 || width >= 1) { 
     // First of all, generate the texture from our bitmap and set it to 
     // the according level 
        //TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0); 
     if (height == 1 || width == 1) { 
      break; 
     } 
     // Increase the mipmap level 
     level++; 
     height /= 2; 
     width /= 2; 
     Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, 
       true); 

     // Clean up 
     bitmap.recycle(); 
     bitmap = bitmap2; 
    } 
} 

नोट्स: फ़ॉन्ट gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); और GL10.glDrawArrays का उपयोग कर गाया है। भ्रष्टाचार न केवल 1.6 एमुलेटर को प्रभावित करता है, बल्कि एंड्रॉइड की 2.x श्रृंखला को भी प्रभावित करता है, यह सोचता है कि यह प्रमुख नहीं है (अल्फा मास्क अभी भी गलत तरीके से प्रस्तुत किए गए हैं)। सभी संपत्तियों को दो बिटमैप्स की शक्ति के रूप में सही ढंग से लोड किया जाता है।

+0

बनावट बनाम दो शक्ति है? और क्या आप सुपरपिंग या पीएनजी का उपयोग करते हैं? सामान्य पीएनजी फाइल मास्क के रूप में अल्फा को सही तरीके से आरक्षित नहीं करती हैं। लेकिन superPng इसे आरक्षित कर सकते हैं। फ़ोटोशॉप के लिए एक प्लगइन superPng – Behnam

+0

के रूप में निर्यात करने के लिए मौजूद है हां, वे सभी की शक्तियां हैं (पोस्ट के अंत में उल्लिखित)। बिटमैप्स को ग्रेस्केल बिटमैप्स के रूप में संग्रहीत किया जाता है, जिसे एंड्रॉइड द्वारा ARGB_8888 के रूप में लोड किया जाता है, और मेरे कोड द्वारा अल्फा मास्क में परिवर्तित किया जाता है। – rkapl

उत्तर

2
  1. मैं 32bit बनावट उपयोग करने का सुझाव, ग्रेस्केल नहीं, नहीं "alphamasks" (है कि क्या?)
  2. अपने बनावट का आकार की जाँच करें, यह अधिकतम आकार (glGetInteger (GL_MAX_TEXTURE_SIZE) अधिक नहीं होनी चाहिए। इसके अलावा shure कर अपने बनावट 2. की शक्ति हाँ, आप का उल्लेख वे कर रहे हैं से पहले कर रहे हैं, लेकिन अगर वे स्केलेबल परिसंपत्तियों (drawable_x_dpi फ़ोल्डर) में हैं, वे एंड्रॉयड से बदल दिया जाएगा। स्केलिंग से बचने के लिए उन्हें "कच्चे" फ़ोल्डर डाल दिया।
  3. बस के लिए परीक्षण, mipmaps सहित सभी फ़िल्टरिंग को अक्षम करने का प्रयास करें - GL_TEXTURE_WRAP_S सेट करें, और GL_TEXTURE_WRAP_T को GL_NEAREST
+0

अल्फा मास्क केवल अल्फा चैनल के साथ एक बनावट है। उन्हें ठीक काम करना चाहिए। सभी बनावट वास्तव में दो बिटमैप्स की शक्ति के रूप में लोड की जाती हैं (वे 'इनपुटस्ट्रीम' का उपयोग करके लोड की जाती हैं, संसाधन आईडी नहीं, इसलिए उन्हें स्केल नहीं किया जाता है)। फ़िल्टरिंग के रूप में, मुझे लगता है कि आपका मतलब 'GL_TEXTURE_MIN_FILTER' था। इसे 'GL_NEAREST' पर सेट करने से समस्या ठीक नहीं होती है। – rkapl

+0

हां, मेरा मतलब है GL_TEXTURE_MIN_FILTER। अगली चीज़ जो आप कोशिश कर सकते हैं वह बनावट फ़ाइलों को प्रतिस्थापित करना है जो सामान्य रूप से बनावट वाले बनावट के साथ गड़बड़ करते हैं। तो आपको पता चलेगा कि क्या समस्या बनावट में है या जिस तरह से आप उनका उपयोग करते हैं। – Dave

संबंधित मुद्दे