मैं libgdx और इसकी स्प्राइटबैच कक्षा का उपयोग करके एंडॉइड के लिए 2 डी लाइव वॉलपेपर विकसित कर रहा हूं। यह एक घड़ी है, इसलिए मुझे केवल इतना चाहिए कि libgdx से केवल कई बनावट खींचना जा रहा है, जो उन्हें विशिष्ट कोण पर घूर्णन कर रहा है।libgdx: स्प्राइटबैच, सैमसंग एंड्रॉइड डिवाइस पर खंड शेडर गलत काम करता है
मैंने स्प्राइटबैच कक्षा का उपयोग करके इस समस्या को हल किया है और सब ठीक था।
लेकिन अब मुझे अपने दृश्य में आवर्धक लेंस प्रभाव जोड़ने की आवश्यकता है। कार्य वास्तविक लेंस अनुकरण करने के लिए विशिष्ट अनुपात के साथ विशिष्ट क्षेत्र को बड़ा करना है।
मैंने फ़्रेमबफर को प्रतिपादन करके, फ्रेमबफर से बनावट क्षेत्र प्राप्त करके और अंत में स्प्राइटबैच का उपयोग करके कस्टम शेडर के साथ इस क्षेत्र को चित्रित करके हल किया है।
समस्या: सैमसंग उपकरणों पर (मैंने गैलेक्सी नोट एन 7000, और गैलेक्सी टैब 10.1 पर कोशिश की है) 16x16px के आवर्धन क्षेत्र के केंद्र में एक छोटा आयताकार है, जहां आवर्धन अनुपात थोड़ा बढ़ता है। क्षमा करें, अब मैं एक स्क्रीनशॉट पोस्ट नहीं कर सकता, क्योंकि मेरे पास सैमसंग डिवाइस नहीं है। अन्य उपकरणों पर सभी ठीक काम करते हैं, एचटीसी विविड, एसर ए 500, Google नेक्सस वन में कोशिश की।
मुझे लगता है कि अगर सैमसंग उपकरणों पर माली जीपीयू में समस्या है, लेकिन यह नहीं पता कि इसे कैसे ठीक किया जाए।
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
यहाँ मेरी render()
विधि है:
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main() {
vec2 m = vec2(0.622 , 0.4985); // lens center point, note that in live wallpaper center of texture is (0.5,0.5)
float lensSize = 0.045; //diameter of lens
float lensCut = 0.0342; //length of cut lines
vec2 d = v_texCoords - m;
float r = sqrt(dot(d, d)); // distance of pixel from mouse
float cuttop = m.y + lensCut;
float cutbottom = m.y - lensCut;
vec2 uv;
if (r >= lensSize) {
uv = v_texCoords;
} else if (v_texCoords.y >= cuttop) {
uv = v_texCoords;
} else if (v_texCoords.y <= cutbottom) {
uv = v_texCoords;
} else {
uv = m + normalize(d) * asin(r)/(3.14159 * 0.37);
}
gl_FragColor = texture2D(u_texture, uv);
}
वर्टेक्स शेडर SpriteBatch स्रोतों से डिफ़ॉल्ट है:
मैं Add Fisheye effect to images at runtime using OpenGL ES SpriteBatch को यहाँ इस सवाल से टुकड़ा शेडर कोड अनुकूल नहीं बनाया है यह है:
GL20 gl = Gdx.graphics.getGL20();
gl.glEnable(GL20.GL_TEXTURE_2D);
gl.glActiveTexture(GL20.GL_TEXTURE0);
gl.glClearColor(WallpaperService.bg_red, WallpaperService.bg_green, WallpaperService.bg_blue, 1f);
gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Creating framebuffer, if it has gone
if (mFrameBuffer == null) {
mFrameBuffer = new FrameBuffer(Format.RGBA4444, BG_WIDTH, BG_HEIGHT, true);
mFrameBufferRegion = new TextureRegion(mFrameBuffer.getColorBufferTexture());
mFrameBufferRegion.flip(false, true);
}
//Camera setting according to background texture
camera = new OrthographicCamera(BG_WIDTH, BG_HEIGHT);
camera.position.set(BG_WIDTH/2, BG_WIDTH/2, 0);
camera.update();
batch.setProjectionMatrix(camera.combined);
//Rendering scene to framebuffer
mFrameBuffer.begin();
batch.begin();
//main Drawing goes here
batch.end();
//Drawing frame to screen with applying shaders for needed effects
if (mFrameBuffer != null) {
mFrameBuffer.end();
camera = new OrthographicCamera(width, height);
camera.position.set(width/2, height/2, 0);
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.setShader(null);
batch.setShader(shader);
batch.draw(mFrameBufferRegion, width/2 - (BG_WIDTH/2) + (MARGIN_BG_LEFT * ratio), height/2
- (BG_HEIGHT/2) + (MARGIN_BG_TOP * ratio), (float) BG_WIDTH/2, (float) BG_HEIGHT/2,
(float) BG_WIDTH, (float) BG_HEIGHT, (float) ratio, (float) ratio, 0f);
batch.setShader(null);
batch.end();
}
मैं कॉपी और अपने शीर्ष और टुकड़ा shaders पेस्ट और 'SpriteBatch.begin' विधि में एक त्रुटि मिली थी:' java.lang.IllegalArgumentException: नाम के साथ कोई वर्दी ' u_projTrans 'shader में'। मुझसे क्या छूट गया? – Nolesh
संभवतः स्प्राइटबैच ने आपके कस्टम शेडर को प्रक्षेपण मैट्रिक्स वर्दी सेट नहीं किया है। आप शेडर में सभी वर्दी की जांच अक्षम करने के लिए ShaderProgram.pedantic = false सेट करने का प्रयास कर सकते हैं। निर्माता को सीधे स्प्राइटबैच पर सेट करने का प्रयास करें, निर्माता में नहीं। देखें: https://code.google.com/p/libgdx/issues/detail?id=1114 https://code.google.com/p/libgdx/issues/detail?id=555 –
ठीक है । मैं इसे बाद में कोशिश करूंगा। लेकिन, कभी-कभी यह त्रुटि तब होती है जब आपके शेडर में कुछ गलत हो। – Nolesh