मैं एंड्रॉइड के लिए ओपनजीएल ईएस 2.0 के साथ काम करना सीख रहा हूं। मैं बस स्क्रीन के बीच में एक बनावट प्रदर्शित करने की कोशिश कर रहा हूं, जो काफी आसान था, लेकिन मुझे लगता है कि पीएनजी अल्फा ठीक से काम करने के लिए प्रतीत नहीं होता है। छवि या तो काले रंग की पृष्ठभूमि के साथ दिखाई देगी, या पूरी छवि को पृष्ठभूमि सेटिंग्स में मिश्रित किया जाएगा, जो सेटिंग्स मैं उपयोग करता हूं उसके आधार पर।ओपनजीएल ईएस 2.0 पीएनजी अल्फा चैनल
इस बिंदु तक पहुंचने के लिए मैंने जो वास्तविक ट्यूटोरियल का पालन किया है, वह पारदर्शिता के साथ कभी काम नहीं करता है, इसलिए मैंने कोड में काम करने की कोशिश की है जिसे मैंने चारों ओर खोजकर पाया है, और संभवतः एक महत्वपूर्ण कदम से चूक गया है। मैंने इस समस्या को हल करने के लिए काफी कुछ खोजा है, और मैंने कोई जवाब नहीं देखा है जिसमें मेरा सेटअप कुछ नहीं था। मैंने glblendFunc के हर संयोजन की कोशिश की है और कोई भाग्य नहीं है।
मुझे लगा कि अगर मैंने इससे संबंधित सभी कोड में पेस्ट करने का प्रयास किया है, तो सवाल बहुत फूला हुआ प्रतीत होता है, इसलिए मुझे आपके द्वारा पूछे जाने वाले कोड के किसी बिट को पोस्ट करने में खुशी होगी। मैं किसी भी विचार की सराहना करता हूं कि मुझे आगे क्या करना चाहिए।
EDIT :: यहां मेरा टुकड़ा शेडर है, जो मुझे लगता है कि यह कारण है। यह एकमात्र ऐसा हिस्सा है जिसे मैंने कभी पारदर्शिता के साथ काम करने के लिए एक सभ्य उदाहरण नहीं मिला है, और बाकी सब कुछ जो मैंने कहीं और देखा है उससे मेल खाता है।
final String fragmentShader =
"precision mediump float; \n"
+ "varying vec2 v_Color; \n"
+ "uniform sampler2D s_baseMap; \n"
+ "void main() \n"
+ "{ \n"
+ " vec4 baseColor; \n"
+ " baseColor = texture2D(s_baseMap, v_Color); \n"
+ " gl_FragColor = baseColor; \n"
+ "} \n";
यह कभी नहीं करता है अल्फा स्पष्ट रूप से कुछ भी, यह एक उदाहरण है कि यह सब के बाद का उपयोग नहीं करता से है, लेकिन मैं अभी भी टुकड़ा shaders के बारे में ज्यादा पता नहीं है और क्योंकि यह लग रहा था करने के लिए "एक तरह से" जब यह पृष्ठभूमि में छवि को मिश्रित करता है, तो मुझे लगता है कि यह कुछ रूपों में अल्फा के साथ काम कर रहा था और मैंने अभी कुछ गलत सेट किया था।
EDIT :: यहां "लोडटेक्चर" विधि है। यह लगभग ओपनजीएल ईएस 2.0 पुस्तक के उदाहरण जैसा ही है, जिसे मैं सीखने की कोशिश कर रहा हूं, कुछ बदलावों के साथ जो छवि को ठीक से काम करने के करीब लगती हैं।
private int loadTexture (InputStream is)
{
int[] textureId = new int[1];
Bitmap bitmap;
bitmap = BitmapFactory.decodeStream(is);
byte[] buffer = new byte[bitmap.getWidth() * bitmap.getHeight() * 4];
for (int y = 0; y < bitmap.getHeight(); y++)
for (int x = 0; x < bitmap.getWidth(); x++)
{
int pixel = bitmap.getPixel(x, y);
buffer[(y * bitmap.getWidth() + x) * 4 + 0] = (byte)((pixel >> 16) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 1] = (byte)((pixel >> 8) & 0xFF);
buffer[(y * bitmap.getWidth() + x) * 4 + 2] = (byte)((pixel >> 0) & 0xFF);
}
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bitmap.getWidth() * bitmap.getHeight() * 4);
byteBuffer.put(buffer).position(0);
GLES20.glGenTextures (1, textureId, 0);
GLES20.glBindTexture (GLES20.GL_TEXTURE_2D, textureId[0]);
GLES20.glTexImage2D (GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri (GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
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);
return textureId[0];
}
मैं समझता हूँ कि क्या कोड क्या कर रहा है, लेकिन बेशक यह अभी भी मुझे ज्ञान की मेरी कमी के कारण एक सा तो मैं बस कुछ स्पष्ट गायब हो सकता है confuses।
मुझे अपने कोड के किसी अन्य भाग को नहीं दिखता है, ऐसा लगता है कि वे मेरी तरह की समस्याओं का कारण बन सकते हैं, लेकिन प्रोग्रामिंग हमेशा अप्रत्याशित (विशेष रूप से ओपनजीएल की दुनिया में) से भरा हुआ है, इसलिए यदि आप कुछ और सोचें क्योंकि मैं आपके लिए भी पोस्ट करना सुनिश्चित करूँगा। सभी परेशानी के लिए खेद है!
सुनिश्चित करें कि पीएनजी से अल्फा चैनल बनावट में छवि लोड करते समय संरक्षित है (आरजीबी छवि लोड करने या आरजीबी बनावट बनाने के बजाय)। और निश्चित रूप से सुनिश्चित करें कि आप 'glEnable (GL_BLEND)' (सही 'glblendFunc' सेट करने के अलावा) को कॉल करें। लेकिन कुछ कोड निश्चित रूप से आपकी मदद करने के लिए थोड़ा और मदद करेंगे। शायद सिर्फ छवि लोडिंग और बनावट निर्माण कोड और कोड जहां आप मिश्रण स्थिति सेट करते हैं। और निश्चित रूप से, जैसा कि आप यहां नए हैं, स्वीकृति और अप-वोट सुविधाओं के बारे में खुद को सूचित करना न भूलें। –
टुकड़ा शेडर मान्य लगता है, क्योंकि यह सही रूप से बनावट के रंग में बनावट के अल्फा को प्रतिनिधि करता है। तो आप अपने कुछ लोडिंग और बनावट निर्माण कोड पोस्ट करने के आसपास नहीं मिलेंगे। –
आप ब्लेंडिंग अक्षम के साथ 'gl_FragColor = vec4 (baseColor.aaa, 1.0)' आज़मा सकते हैं। यह आपको अल्फा चैनल की एक ग्रेस्केल छवि देनी चाहिए। – trenki