2012-02-14 8 views
6

(संपादित करें: मैंने एक नमूना की कोशिश की है जो किसी भी बनावट या शेडर्स के बिना त्रिकोण को चित्रित करता है और केवल मेरे डिवाइस पर ओपनजीएल-ईएस 1.1 और उसी कलाकृतियों को देख सकता है। मैंने एमुलेटर में एक ही नमूना की कोशिश की और वहां कोई कलाकृतियों नहीं थे सब। क्या यह एक टेग्रा 2 मुद्दा हो सकता है या क्या मुझे एक विशिष्ट राज्य या कुछ ऐसा करने की आवश्यकता है जो एम्यूलेटर में आवश्यक नहीं है?)Android पर OpenGL ES 2.0 में पिक्सेल रंग सही क्यों नहीं हैं?

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

यहां समस्या का एक बड़ा screengrab है। सफेद लाइन के आसपास काले मूल्यों थोड़ा उज्जवल की तुलना में वे होना चाहिए:

enter image description here

मैं पहले से ही करने की कोशिश की:

GLES20.glDisable(GLES20.GL_DITHER); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 

लेकिन यह कोई प्रभाव नहीं पड़ा। पिक्सल थोड़ा सा बंद हैं। एक अंधेरे और सफेद पिक्सेल के बीच देखना आसान है क्योंकि इसके आगे का गहरा पिक्सेल थोड़ा उज्ज्वल है और एक चित्रकला कार्यक्रम के साथ आर, जी, बी मानों की जांच करने से मुझे यह भी पता चलता है।

क्या कोई मेरी सहायता कर सकता है?

कुछ अधिक जानकारी:

मेरा डिवाइस के सीपीयू एक Tegra 2.0 है। मैं 256x256 वर्ग को 256x256 पिक्सल में बिल्कुल प्रस्तुत करता हूं (मैंने जांच की है कि ग्रहण डीडीएमएस के साथ स्क्रीन पकड़ लेना)। पारदर्शिता बंद है और बिटमैप में प्रत्येक पिक्सेल के लिए 255 का अल्फा मान है।

glSurface.setEGLConfigChooser(8, 8, 8, 8, 0, 0); 

मैं कोड को सरल बनाया है लेकिन अभी भी समस्या देख सकते हैं जब मैं निम्नलिखित shaders के साथ प्रस्तुत:

String vshaderquad = "attribute vec4 a_pos;    \n" + // in  position 
          "attribute vec2 a_tex;    \n" + // in  Texture coordinates 
          "varying vec2 vtex;     \n" + // out  Texture coordinates 
          "void main(void) {     \n" + 
          " gl_Position = vec4(a_pos);  \n" + 
          " vtex = a_tex;     \n" + 
          "}"; 

    String fshaderquad = "precision mediump float;      \n" + 
          "varying vec2  vtex;      \n" + 
          "uniform sampler2D samp0;      \n" + 
          "void main() {         \n" + 
          " gl_FragColor = texture2D(samp0, vtex);  \n" + 
          "}"; 

और कमांड:

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mapid[0]); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glUniform1i(handlesampler0, 0); 
GLES20.glDisable(GLES20.GL_DITHER); 



GLES20.glViewport(0, 0, screenx, screeny); 

float screenx = (float)ddimx; 
float screeny = (float)ddimy; 
// 
vdata.put(0*4+0,  0.0f * (2.0f/screenx)); 
vdata.put(0*4+1, 256.0f * (2.0f/screeny)); 
vdata.put(0*4+2,  0.0f * (1.0f/256f)); 
vdata.put(0*4+3, 256.0f * (1.0f/256f)); 
// 
vdata.put(1*4+0,  0.0f * (2.0f/screenx)); 
vdata.put(1*4+1,  0.0f * (2.0f/screeny)); 
vdata.put(1*4+2,  0.0f * (1.0f/256f)); 
vdata.put(1*4+3,  0.0f * (1.0f/256f)); 
// 
vdata.put(2*4+0, 256.0f * (2.0f/screenx)); 
vdata.put(2*4+1, 256.0f * (2.0f/screeny)); 
vdata.put(2*4+2, 256.0f * (1.0f/256f)); 
vdata.put(2*4+3, 256.0f * (1.0f/256f)); 
// 
vdata.put(3*4+0, 256.0f * (2.0f/screenx)); 
vdata.put(3*4+1,  0.0f * (2.0f/screeny)); 
vdata.put(3*4+2, 256.0f * (1.0f/256f)); 
vdata.put(3*4+3,  0.0f * (1.0f/256f)); 

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
मैं के साथ अल्फा के साथ एक 32bit सतह के रूप में सतह बनाया

पीएस: मामूली रंग परिवर्तन वास्तव में चरम ज़ूमिंग के बिना दिखाई नहीं देता है लेकिन मैं मूल्यों के साथ गणना करना चाहता हूं और इसका मतलब है कि उन्हें केवल सटीक होना चाहिए।

संपादित करें: मैंने एक पूर्ण रिज़ॉल्यूशन छवि जोड़ा। लाइनों पर रंग (0,0,0) से (255,255,255) तक जाना चाहिए और पृष्ठभूमि ढाल के विपरीत हैं। मैंने इस छवि को केवल बनावट की सटीकता का परीक्षण करने के लिए बनाया है और वहां मुझे समस्या मिली है कि यह वास्तव में सटीक नहीं है। मतभेदों को दूर करने के लिए आपको ज़ूम इन करना होगा, इसलिए मैंने विस्तारित छवि पोस्ट की है। नोट: निर्देशांक ऊपर पोस्ट किए गए कोड से अलग हैं लेकिन समस्या एक जैसी है (मैंने विभिन्न ऑनस्क्रीन निर्देशांकों की कोशिश की और समस्या बनी रहती है)।

enter image description here

+0

एक स्क्रीनग्रेब समस्या को दिखाने के लिए बहुत अच्छा होगा, लेकिन आप जो लिखते हैं से मुझे लगता है यह [हिचकिचाहट] है (http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/)। यह एक पोस्टप्रोकैसिंग है, इसलिए इसे आपके पिक्सेल शेडर्स को प्रभावित नहीं करना चाहिए। –

+0

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

+0

मैं एंड्रॉइड डंस के रूप में पूछता हूं: क्या आप किसी भी तरह से पेनटाइल डिस्प्ले का उपयोग कर रहे हैं और वास्तविक रंग तत्वों से गणना की गई रंगों को वापस पढ़ रहे हैं? – Tommy

उत्तर

3

ठीक है, मुझे लगता है कि मैं समाधान मिल गया है।

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

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

किसी भी तरह से, जब मैं निम्न फ़ंक्शन का उपयोग करता हूं तो मैं स्क्रीनशॉट को सहेज सकता हूं जो ओपनजीएल-ईएस 2.0 फ़्रेमबफर लेता है और इसे एक पीएनजी फ़ाइल में सहेजता है जिसे मैं आसानी से बैच फ़ाइल ("adb /mnt/sdcard/info/Testfile.txt "पुल) और अपने कंप्यूटर पर देखने:

public boolean SaveFrameBuffer(int x, int y) 
{ try 
    { IntBuffer pinbuffer = IntBuffer.allocate(x*y*4); 
     IntBuffer poutbuffer = IntBuffer.allocate(x*y*4); 
     int   i,j,z; 
     int []  pin   = pinbuffer.array(); 
     int []  pout  = poutbuffer.array(); 
     // 
     GLES20.glReadPixels(0, 0, x, y, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pinbuffer);    
     for(i=0;i<y;i++) 
     { for(j=0;j<x;j++) 
      { z = pin[(y-1-i)*x+j]; 
       pout[i*x+j] = (z & 0xff000000) | ((z >> 16) & 0x000000ff) | ((z << 16) & 0x00ff0000) | (z & 0x0000ff00); 
      } 
     } 
     Bitmap map = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888); 
     map.setPixels(pout, 0, x, 0,0, x, y); 
     OutputStream stream = new FileOutputStream("/sdcard/info/test.png"); 
     map.compress(CompressFormat.PNG, 100, stream); 
     stream.close(); 
     return true; 
    } catch (Exception e) 
    { e.printStackTrace(); 
     return false; 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^