0

我有自己的方法来绘制图像。它使用顶点和 UVBuffers。

我画如下:

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 位图字体生成器。

我使用相同的功能,唯一的区别是我根据当前角色的数据设置纹理和 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);
}

绘制方法

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

绘制字符串方法(导致错误)

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

0

我为每次都回答我的问题而感到非常惭愧,但我发现了。我没有从我的绘图缓冲区中清除纹理缓冲区。我真的不喜欢我在这个网站上没有真正的问题。但至少现在解决了。在解决了我的一个问题之后,我现在和往常一样感到非常愚蠢。不过感谢您的评论!

于 2013-08-01T18:43:14.203 回答