我有自己的方法来绘制图像。它使用顶点和 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();
}
我仍然试图找到解决方案。我也会尝试发布一张图片来帮助你理解这个问题。提前致谢。