(संपादित करें: मैंने एक नमूना की कोशिश की है जो किसी भी बनावट या शेडर्स के बिना त्रिकोण को चित्रित करता है और केवल मेरे डिवाइस पर ओपनजीएल-ईएस 1.1 और उसी कलाकृतियों को देख सकता है। मैंने एमुलेटर में एक ही नमूना की कोशिश की और वहां कोई कलाकृतियों नहीं थे सब। क्या यह एक टेग्रा 2 मुद्दा हो सकता है या क्या मुझे एक विशिष्ट राज्य या कुछ ऐसा करने की आवश्यकता है जो एम्यूलेटर में आवश्यक नहीं है?)Android पर OpenGL ES 2.0 में पिक्सेल रंग सही क्यों नहीं हैं?
मैं स्क्रीन पर एक पिक्सेल सही वर्ग प्रस्तुत कर रहा हूं लेकिन जब मैं एक स्क्रैरेग्राब बनाता हूं और पिक्सेल को देखो तो उनमें से कुछ एंटीअलाइज्ड या फ़िल्टर किए गए या कुछ ऐसा ही बंद हैं। जब आप उन पर ज़ूम करते हैं तो आप इसे केवल देखते हैं लेकिन यह बात नहीं है। मैं पिक्सेल शेडर में कुछ गणित करना चाहता हूं और यदि पिक्सल थोड़ा दूर हैं और यह मेरे लिए अच्छा नहीं है। मुझे उन्हें बिटमैप में बिल्कुल ठीक करने की ज़रूरत है।
यहां समस्या का एक बड़ा screengrab है। सफेद लाइन के आसपास काले मूल्यों थोड़ा उज्जवल की तुलना में वे होना चाहिए:
मैं पहले से ही करने की कोशिश की:
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) तक जाना चाहिए और पृष्ठभूमि ढाल के विपरीत हैं। मैंने इस छवि को केवल बनावट की सटीकता का परीक्षण करने के लिए बनाया है और वहां मुझे समस्या मिली है कि यह वास्तव में सटीक नहीं है। मतभेदों को दूर करने के लिए आपको ज़ूम इन करना होगा, इसलिए मैंने विस्तारित छवि पोस्ट की है। नोट: निर्देशांक ऊपर पोस्ट किए गए कोड से अलग हैं लेकिन समस्या एक जैसी है (मैंने विभिन्न ऑनस्क्रीन निर्देशांकों की कोशिश की और समस्या बनी रहती है)।
एक स्क्रीनग्रेब समस्या को दिखाने के लिए बहुत अच्छा होगा, लेकिन आप जो लिखते हैं से मुझे लगता है यह [हिचकिचाहट] है (http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/)। यह एक पोस्टप्रोकैसिंग है, इसलिए इसे आपके पिक्सेल शेडर्स को प्रभावित नहीं करना चाहिए। –
हाय, आपके उत्तर के लिए धन्यवाद और मैंने समस्या को बेहतर दिखाने के लिए एक छवि जोड़ा। मुझे यह भी नहीं लगता कि यह केवल पोस्टप्रोसेसिंग त्रुटि है क्योंकि मैं शेडरों में कुछ गणना करता हूं और अपेक्षित मूल्य बंद थे और समस्या के रूप में इंगित करते हैं। – HardCoder
मैं एंड्रॉइड डंस के रूप में पूछता हूं: क्या आप किसी भी तरह से पेनटाइल डिस्प्ले का उपयोग कर रहे हैं और वास्तविक रंग तत्वों से गणना की गई रंगों को वापस पढ़ रहे हैं? – Tommy