2012-06-20 4 views
6

Ho un'immagine di sfondo che sto disegnando con open gl 1.0 es.Ottenere linee da GL10 disegnando immagini l'una accanto all'altra, soluzione?

Il problema è quando disegno questa immagine piccolo al grande schermo ottengo questo ...

enter image description here

Le linee /pause nel modello non sono supponiamo di essere lì. Ho provato un sacco di cose, ho pensato che forse il mio atlante era sbagliato ... ne dubito. Lo tratto da (0, 0, 50, 50) che è (x, y, larghezza, altezza). Controllato molto e ottiene sempre lo stesso risultato, è come dovrebbe essere.

provato diverse cose con il mio ciclo for, che è al di sotto ...

GL10 gl = this.glGraphics.getGL(); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     guiCam.setViewportAndMatrices(); 

     gl.glEnable(GL10.GL_TEXTURE_2D); 

     // Set background color // 

     batcher.beginBatch(Assets.mainmenuAtlas); 

     for(int x = Assets.mmbackgroundPattern.width/2; x < this.scale.getWidth() + Assets.mmbackgroundPattern.width/2; x += Assets.mmbackgroundPattern.width) { 
      for(int y = Assets.mmbackgroundPattern.height/2; y < this.scale.getHeight() + Assets.mmbackgroundPattern.height/2; y += Assets.mmbackgroundPattern.height) { 
       batcher.drawSprite(x, y, Assets.mmbackgroundPattern.width, Assets.mmbackgroundPattern.height, Assets.mmbackgroundPattern); 
      } 
     } 

La finestra & matrici è:

public void setViewportAndMatrices() { 
     GL10 gl = glGraphics.getGL(); 
     gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight()); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(position.x - frustumWidth * zoom/2, 
        position.x + frustumWidth * zoom/ 2, 
        position.y - frustumHeight * zoom/2, 
        position.y + frustumHeight * zoom/ 2, 
        1, -1); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

Quando disegno sprites:

public void endBatch() { 
     vertices.setVertices(verticesBuffer, 0, bufferIndex); 
     vertices.bind(); 
     vertices.draw(GL10.GL_TRIANGLES, 0, numSprites * 6); 
     vertices.unbind(); 
    } 

    public void drawSprite(float x, float y, float width, float height, TextureRegion region) { 
     float halfWidth = width/2; 
     float halfHeight = height/2; 
     float x1 = x - halfWidth; 
     float y1 = y - halfHeight; 
     float x2 = x + halfWidth; 
     float y2 = y + halfHeight; 

     verticesBuffer[bufferIndex++] = x1; 
     verticesBuffer[bufferIndex++] = y1; 
     verticesBuffer[bufferIndex++] = region.u1; 
     verticesBuffer[bufferIndex++] = region.v2; 

     verticesBuffer[bufferIndex++] = x2; 
     verticesBuffer[bufferIndex++] = y1; 
     verticesBuffer[bufferIndex++] = region.u2; 
     verticesBuffer[bufferIndex++] = region.v2; 

     verticesBuffer[bufferIndex++] = x2; 
     verticesBuffer[bufferIndex++] = y2; 
     verticesBuffer[bufferIndex++] = region.u2; 
     verticesBuffer[bufferIndex++] = region.v1; 

     verticesBuffer[bufferIndex++] = x1; 
     verticesBuffer[bufferIndex++] = y2; 
     verticesBuffer[bufferIndex++] = region.u1; 
     verticesBuffer[bufferIndex++] = region.v1; 

     numSprites++; 
    } 

Qui sono le mie regioni di texture e texture:

public TextureRegion(Texture texture, float x, float y, float width, float height) { 
     this.u1 = x/texture.width; 
     this.v1 = y/texture.height; 
     this.u2 = this.u1 + width/texture.width; 
     this.v2 = this.v1 + height/texture.height;   
     this.texture = texture; 

     this.width = (int) width; 
     this.height = (int) height; 
    } 

public class Texture { 
    GLGraphics glGraphics; 
    FileIO fileIO; 
    Bitmap img; 
    String fileName; 
    int textureId; 
    int minFilter; 
    int magFilter; 
    public int width; 
    public int height; 

    public Texture(GLGame glGame, String fileName) { 
     this.glGraphics = glGame.getGLGraphics(); 
     this.fileIO = glGame.getFileIO(); 
     this.fileName = fileName; 
     try { 
      load(BitmapFactory.decodeStream(this.fileIO.readAsset(fileName))); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public Texture(GLGame glGame, Bitmap img) { 
     this.glGraphics = glGame.getGLGraphics(); 
     this.fileIO = glGame.getFileIO(); 
     this.img = img; 
     load(img); 
    } 

    private void load(Bitmap bitmap) { 
     GL10 gl = glGraphics.getGL(); 
     int[] textureIds = new int[1]; 
     gl.glGenTextures(1, textureIds, 0); 
     textureId = textureIds[0]; 

     gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     setFilters(GL10.GL_LINEAR, GL10.GL_LINEAR); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); 
     width = bitmap.getWidth(); 
     height = bitmap.getHeight(); 
     bitmap.recycle(); 
    } 

    public void reload() { 
     if(fileName.equals(null)) { 
      load(this.img); 
     } else { 
      try { 
       load(BitmapFactory.decodeStream(this.fileIO.readAsset(fileName))); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     bind(); 
     setFilters(minFilter, magFilter);   
     glGraphics.getGL().glBindTexture(GL10.GL_TEXTURE_2D, 0); 
    } 

    public void setFilters(int minFilter, int magFilter) { 
     this.minFilter = minFilter; 
     this.magFilter = magFilter; 
     GL10 gl = glGraphics.getGL(); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, minFilter); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, magFilter); 
    }  

    public void bind() { 
     GL10 gl = glGraphics.getGL(); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
    } 

    public void dispose() { 
     GL10 gl = glGraphics.getGL(); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
     int[] textureIds = { textureId }; 
     gl.glDeleteTextures(1, textureIds, 0); 
    } 
} 

Ho provato ad aggiungere e sottrarre dalla larghezza aggiunta e dall'altezza, ma lo fa sembrare peggio.

La mia domanda è, cosa vorresti guardare per cercare di risolvere questo problema, mi sento molto perplesso, ma mi sento come io possa avere qualcosa che non va impostato in OpenGL. Cosa potrei avere impostato errato? Posso sempre fornire più codice in alto, ma non esattamente quello che potrebbe essere necessario.

L'immagine Sono ri incollare su tutto lo schermo è:

enter image description here

anche lo strumento che sto usando per fare Atlas è found here e sto usando quella sotto l'albero di beta che è considerato accumulo 4. Tuttavia, ho controllato l'atlante e sembra tutto a posto.

public class SpriteBatcher {   
    final float[] verticesBuffer; 
    int bufferIndex; 
    final Vertices vertices; 
    int numSprites;  

    public SpriteBatcher(GLGraphics glGraphics, int maxSprites) {     
     this.verticesBuffer = new float[maxSprites*4*4];   
     this.vertices = new Vertices(glGraphics, maxSprites*4, maxSprites*6, false, true); 
     this.bufferIndex = 0; 
     this.numSprites = 0; 

     short[] indices = new short[maxSprites*6]; 
     int len = indices.length; 
     short j = 0; 
     for (int i = 0; i < len; i += 6, j += 4) { 
       indices[i + 0] = (short)(j + 0); 
       indices[i + 1] = (short)(j + 1); 
       indices[i + 2] = (short)(j + 2); 
       indices[i + 3] = (short)(j + 2); 
       indices[i + 4] = (short)(j + 3); 
       indices[i + 5] = (short)(j + 0); 
     } 
     vertices.setIndices(indices, 0, indices.length);     
    } 

     public void drawSprite(float x, float y, float width, float height, TextureRegion region, boolean corner) { 
       if(corner) { 
        float x1 = x; 
        float y1 = y; 
        float x2 = x + width; 
        float y2 = y + height; 

        verticesBuffer[bufferIndex++] = x1; 
        verticesBuffer[bufferIndex++] = y1; 
        verticesBuffer[bufferIndex++] = region.u1; 
        verticesBuffer[bufferIndex++] = region.v2; 

        verticesBuffer[bufferIndex++] = x2; 
        verticesBuffer[bufferIndex++] = y1; 
        verticesBuffer[bufferIndex++] = region.u2; 
        verticesBuffer[bufferIndex++] = region.v2; 

        verticesBuffer[bufferIndex++] = x2; 
        verticesBuffer[bufferIndex++] = y2; 
        verticesBuffer[bufferIndex++] = region.u2; 
        verticesBuffer[bufferIndex++] = region.v1; 

        verticesBuffer[bufferIndex++] = x1; 
        verticesBuffer[bufferIndex++] = y2; 
        verticesBuffer[bufferIndex++] = region.u1; 
        verticesBuffer[bufferIndex++] = region.v1; 

        numSprites++; 
       } else { 
        drawSprite(x, y, width, height, region); 
       } 
      } 

    public void present(float deltaTime) { 
      GL10 gl = this.glGraphics.getGL(); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      guiCam.setViewportAndMatrices(); 

      gl.glEnable(GL10.GL_TEXTURE_2D); 

      // Set background color // 

      batcher.beginBatch(Assets.mainmenuAtlas); 

      for(float x = 0; x < this.scale.getWidth(); x += Assets.mmbackgroundPattern.width) { 
       for(float y = 0; y < this.scale.getHeight(); y += Assets.mmbackgroundPattern.height) { 
        batcher.drawSprite(x, y, Assets.mmbackgroundPattern.width, Assets.mmbackgroundPattern.height, Assets.mmbackgroundPattern, true); 


    } 
     } 
+0

Il codice mi ricorda 'libgdx'. C'è una sovrapposizione di un pixel sul bordo; Non sono sicuro che la miscelazione potrebbe essere un problema. –

+0

@StefanHanke ok, quindi c'è una sovrapposizione, come faresti per risolvere questo? Ho provato a ritagliare un pixel in meno dall'atlante ... non funziona. In effetti, lo rende peggiore. C'è qualcosa che potrei fare diversamente? Inoltre ho provato a mescolare, ma non sembravano aiutare né ostacolare. – Zeveso

+2

Il codice usa i float, dividendo ecc., Ma alla fine verrà mappato alle coordinate dello schermo intero. Crea un 'drawSprite' prendendo i parametri int che non divide. –

risposta

3

Puoi provare a utilizzare il filtro GL_NEAREST anziché GL_LINEAR? Potresti ottenere un campionamento lineare tra i pixel del bordo e il colore del bordo.

In particolare qui:

setFilters(GL10.GL_LINEAR, GL10.GL_LINEAR); 
+0

Eri corretto, GRAZIE MOLTO!Questa è la seconda volta che mi hai salvato con la stessa cosa! DAVVERO! Dove posso imparare di più su questo ... Sto solo aprendo open-gl/opengl-es, quindi c'è un libro che suggeriresti o un altro mezzo? – Zeveso