2012-06-20 5 views
6

私は背景画像を持っています。私は開いたgl 1.0で描いています。私はこれを取得大画面に、この小さな画像を描画する際に問題があるGL10の描画イメージを互いに隣り合ったソリューションにするには?

...

enter image description here

行は/パターンの断線があっすると仮定されていません。私はたくさんのことを試しましたが、おそらく私のアトラスが間違っていると思っていました。私は(x、y、幅、高さ)である(0、0、50、50)から描画します。これをたくさんチェックしても、同じ結果が得られるはずです。

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); 
      } 
     } 

ビューポート&行列がある...以下であるループのための私と違うことをしようとしました:ここ

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++; 
    } 

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

私はスプライトを描く

私のテクスチャとテクスチャの領域です:

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); 
    } 
} 

追加された幅と高さが加算されていますが、それは悪化しています。

私の質問は、あなたがしようとすると、この問題の解決を見てどうなるかですが、私は非常に困惑を感じるが、私はOpenGLで何かを間違って設定している可能性がありようは、私は感じています。何がセットアップに間違っていますか? 私はいつもより多くのコードを提供することができますが、あなたが必要とするものが何であるかは正確には分かりません。

私は画面全体貼り付け直していた画像は、次のとおりです。

また

enter image description here

私はアトラスを作るために使用していますツールはfound hereであると私は、ビルドと見なされるベータツリーの下に1を使用しています4.しかし、私はアトラスをチェックして、それはちょうどいいようです。

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

コードがlibgdx' 'のことを思い出します。境界に1ピクセルの重なりがあります。ブレンドが問題になるかどうかは分かりません。 –

+0

@StefanHanke ok、オーバーラップがあるので、これを修正するにはどうしたらいいですか?私はアトラスからピクセルを1つ減らしてみました...うまくいきません。実際には、それを悪化させます。私は別に何かできることはありますか?また、私はブレンドを試みたが、助けても妨げていないようだった。 – Zeveso

+2

このコードは浮動小数点数を使って、等分していますが、最後には整数のスクリーン座標にマップされます。分割しないintパラメータを取る 'drawSprite'を作成してください。 –

答えて

3

GL_LINEARの代わりにGL_NEARESTフィルタリングを使用できますか?エッジピクセルと境界線の色の間で線形サンプリングを行っている可能性があります。具体的にここに

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

あなたは正しかった、ありがとうございます!同じことで私を救ったのはこれが二回目です!実際に!どこでこれについてもっと知ることができますか?私はopen-gl/opengl-esを始めたばかりです。あなたの提案する書籍や別の媒体がありますか? – Zeveso

関連する問題