2013-01-07 14 views
5

मैं 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(); 
    } 

उत्तर

3

मैं ' मैं इस मुद्दे को ठीक करने में कामयाब रहा। समस्या माली जीपीयू में है। माली खंड टुकड़े में उच्च परिशुद्धता फ्लोट गणना का समर्थन नहीं करता है। जब केंद्र से बिंदु तक दूरी शून्य के पास थी - आर चर शून्य हो गया।

इसलिए मैंने अपनी गणनाओं में निरंतर गुणांक जोड़ा है और यह चाल है।

यहाँ काम कर रहा है टुकड़ा शेडर:

precision mediump float; 

varying lowp vec4 v_color; 
varying vec2 v_texCoords; 


uniform sampler2D u_texture; 

const float PI = 3.14159; 
const float koef = 10.0; 
void main() { 
    vec2 uv;  
    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; //radius of lens 
    float lensCut = 0.0342; //height of cut 

    float cuttop = m.y + lensCut; 
    float cutbottom = m.y - lensCut; 
    float cutleft = m.x-lensSize; 
    float cutright = m.x+lensSize; 

//don't transform pixels, that aren't in lens area 
    if (v_texCoords.y >= cuttop) { 
     uv = v_texCoords; 
    } else if (v_texCoords.y <= cutbottom) { 
     uv = v_texCoords; 
      } else if (v_texCoords.x <= cutleft) { 
     uv = v_texCoords; 
      } else if (v_texCoords.x >= cutright) { 
     uv = v_texCoords; 
     } else { 
    vec2 p = v_texCoords*koef; //current point 
    vec2 d = p - m*koef; //vector differnce between current point and center point 
    float r = distance(m*koef,p); // distance of pixel from center 

    if (r/koef >= lensSize) { 
     uv = v_texCoords; 
     } else { 
    uv =m + normalize(d) * asin(r)/(PI*0.37*koef); 
    } 
    } 

    gl_FragColor = texture2D(u_texture, uv); 
} 
+1

मैं कॉपी और अपने शीर्ष और टुकड़ा shaders पेस्ट और 'SpriteBatch.begin' विधि में एक त्रुटि मिली थी:' java.lang.IllegalArgumentException: नाम के साथ कोई वर्दी ' u_projTrans 'shader में'। मुझसे क्या छूट गया? – Nolesh

+1

संभवतः स्प्राइटबैच ने आपके कस्टम शेडर को प्रक्षेपण मैट्रिक्स वर्दी सेट नहीं किया है। आप शेडर में सभी वर्दी की जांच अक्षम करने के लिए ShaderProgram.pedantic = false सेट करने का प्रयास कर सकते हैं। निर्माता को सीधे स्प्राइटबैच पर सेट करने का प्रयास करें, निर्माता में नहीं। देखें: https://code.google.com/p/libgdx/issues/detail?id=1114 https://code.google.com/p/libgdx/issues/detail?id=555 –

+0

ठीक है । मैं इसे बाद में कोशिश करूंगा। लेकिन, कभी-कभी यह त्रुटि तब होती है जब आपके शेडर में कुछ गलत हो। – Nolesh

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