Получение строк из рисунков GL10 рядом друг с другом, решение?

У меня есть фоновое изображение, которое я рисую с открытым gl 1.0 es.

Проблема в том, что когда я рисую это маленькое изображение на большом экране, я получаю это...

enter image description here

Линии/разрывы в паттерне не должны там быть. Я пробовал много вещей, я думал, может быть, мой атлас был неправильным... Сомневаюсь. Я рисую его из (0, 0, 50, 50), что равно (x, y, ширине, высоте). Много раз проверял и все равно получаю тот же результат, так и должно быть.

Пробовал разные вещи с моим циклом for, который ниже...

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 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 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 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

Также инструмент, который я использую для создания атласа, можно найти здесь, и я использую тот, который находится в бета-дереве, который считается построенным. 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);


    }
        }

6
задан Zeveso 20 June 2012 в 19:42
поделиться