0

画像を描画する独自の方法があります。Vertex と UVBuffer を使用します。

次のように描きます。

SpriteBatch.Begin(blendMode) <- sets up blending
SpriteBatch.Draw(parameters) <- add vertices to the list of vertex arrays
SpriteBatch.End() <- Sets up buffers and draw out everything at once

そして、それは魅力のように機能します。

ただし、同じ Draw メソッドを使用する DrawString メソッドを試してみると。テクスチャ UV マップまたは一部のバッファが台無しになります (すべてが、ピクセルが欠落した塗りつぶされた長方形のように描画されます)。

Angelcode Bitmap Font Generator を使用しています。

同じ機能を使用しますが、唯一の違いは、現在のキャラクターのデータに従ってテクスチャと UV マップを設定することです。

他の関数で何かを台無しにした場合に備えて、すべての Draw 関数を投稿します。

public void Begin(int Source, int Destination)
{
    GL.glEnable(GL10.GL_BLEND);
    GL.glBlendFunc(Source, Destination);
}

すべてのバッファと変数 (関数で宣言したくなかった)

ArrayList<float[]> vertices = new ArrayList<float[]>();
FloatBuffer vertexBuffer;
ArrayList<short[]> indices = new ArrayList<short[]>();
ShortBuffer indexBuffer;
float minU = 0;
float maxU = 1;
float minV = 0;
float maxV = 1;
ArrayList<GLColor> colors = new ArrayList<GLColor>();
GLColor c_color;
ArrayList<float[]> vertexUVs = new ArrayList<float[]>();
FloatBuffer uvBuffer;
ArrayList<TransformationMatrix> matrices = new ArrayList<TransformationMatrix>();
TransformationMatrix matrix = new TransformationMatrix();
ArrayList<Integer> textures = new ArrayList<Integer>();

DrawString から main メソッドにアクセスする Draw メソッド

public void Draw(Texture2D texture, Rectangle destination, Rectangle source, GLColor color)
{
    Draw(texture, destination, source, color, new Vector2(0, 0), 0);
}

Draw メソッド

public void Draw(Texture2D texture, Rectangle destination, Rectangle source, GLColor color, Vector2 origin, float Rotation)
{
    vertices.add(new float[]{-origin.X, -origin.Y,
            destination.Width - origin.X, -origin.Y,
            destination.Width - origin.X, destination.Height - origin.Y,
                    -origin.X, destination.Height - origin.Y});

    indices.add(new short[]{0, 1, 2, 2, 3, 0});

    //Generate UV of Vertices

    minU = 0;
    maxU = 1;
    minV = 0;
    maxV = 1;

    if (source != null)
    {
        minU = (float)source.X / (float)texture.getWidth();
        maxU = (float)(source.X + source.Width) / (float)texture.getWidth();
        minV = (float)source.Y / (float)texture.getHeight();
        maxV = (float)(source.Y + source.Height) / (float)texture.getHeight();
    }
    vertexUVs.add(new float[]{minU, minV,
                        maxU, minV,
                        maxU, maxV,
                        minU, maxV});

    //Calculate Matrix
    matrix = new TransformationMatrix();
    matrix.Translate(destination.X + origin.X, destination.Y + origin.Y, 0);
    matrix.Rotate(0, 0, Rotation);
    matrices.add(matrix);

    colors.add(color);
    textures.add(texture.ID);
    }

Draw String メソッド (バグの原因)

public void DrawString(SpriteFont spriteFont, String Text, Vector2 vector, GLColor color)
{
    int cursorX = (int)vector.X;
    int cursorY = (int)vector.Y;

    for (int i = 0; i < Text.length(); i++)
    {
        char c = Text.charAt(i);
        if (c == '\n') cursorX += spriteFont.LineHeight;
        else
        {
            int index = (int)c;

            //Draw Character
            if (spriteFont.Characters.length <= index)
            {
                Log.d("SpriteFont error", "Character is not presented in SpriteFont!");
                continue;
            }

            CharacterDescriptor cd = spriteFont.Characters[index];

            Rectangle source = new Rectangle(cd.x, cd.y, cd.Width, cd.Height);
            //Draw Character
            Rectangle destination = new Rectangle(cursorX + cd.XOffset, cursorY + cd.YOffset, cd.Width, cd.Height);

            Draw(spriteFont.Pages[cd.Page], destination, source, color);

            cursorX += cd.XAdvance;
        }
    }
}

そして最後に終了方法:

public void End()
{
    vertexBuffer = ByteBuffer.allocateDirect(vertices.size() * 8 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
    for (int i = 0; i < vertices.size(); i++)
    {
        vertexBuffer.put(vertices.get(i));
    }
    vertexBuffer.flip();


    //Generate Indices
    indexBuffer = ByteBuffer.allocateDirect(indices.size() * 6 * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
    for (int i = 0; i < vertices.size(); i++)
    {
        indexBuffer.put(indices.get(i));
    }
    indexBuffer.flip();

    //Generate UV of Vertices
    uvBuffer = ByteBuffer.allocateDirect(vertexUVs.size() * 8 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
    for (int i = 0; i < vertexUVs.size(); i++)
    {
        uvBuffer.put(vertexUVs.get(i));
    }
    uvBuffer.flip();

    //Bind Vertices

    for (int i = 0; i < colors.size(); i++)
    {
        //Bind Pointers
        GL.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        GL.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        GL.glEnable(GL10.GL_TEXTURE_2D);
        vertexBuffer.position(i * 8);
        GL.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
        uvBuffer.position(i * 8);
        GL.glTexCoordPointer(2, GL10.GL_FLOAT, 0, uvBuffer);
        matrix = matrices.get(i);
        c_color = colors.get(i);

        GL.glMatrixMode(GL10.GL_MODELVIEW);
        GL.glLoadIdentity();
        GL.glTranslatef(matrix.TranslationX, matrix.TranslationY, matrix.TranslationZ);
        GL.glRotatef((float)Math.sqrt(matrix.RotationX * matrix.RotationX + matrix.RotationY*matrix.RotationY + matrix.RotationZ*matrix.RotationZ), matrix.RotationX, matrix.RotationY, matrix.RotationZ);
        //Bind Texture
        GL.glBindTexture(GL10.GL_TEXTURE_2D, textures.get(i));
        GL.glColor4f(c_color.R, c_color.G, c_color.B, c_color.A);

        //Draw Elements
        GL.glDrawElements(GL10.GL_TRIANGLES, 8, GL10.GL_UNSIGNED_SHORT, indexBuffer);

        GL.glBindTexture(GL10.GL_TEXTURE_2D, 0);
        GL.glDisable(GL10.GL_TEXTURE_2D);
        GL.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        GL.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }

    //Disable things
    GL.glDisable(GL10.GL_BLEND);
    colors.clear();
    matrices.clear();
    vertices.clear();
    vertexUVs.clear();
}

私はまだ解決策を見つけようとしています。また、この問題を理解するのに役立つ画像を投稿しようとします。前もって感謝します。

4

1 に答える 1