0
我有自己的方法來繪製圖像。它使用Vertex和UVBuffers。Android Open GL ES紋理搞砸了
我得出這樣的:
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
和它的作品般的魅力。
但是,當我嘗試使用相同的繪製方法我的DrawString方法。紋理UV貼圖或某些緩衝區被搞砸了(所有東西都像一個缺少像素的實心矩形)。
我使用Angelcode位圖字體生成器。
我使用相同的功能,唯一的區別是我根據當前角色的數據設置紋理和UV貼圖。
我會發布我所有的繪圖函數,以防萬一我在其他函數中搞砸了某些東西。
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>();
從束帶
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);
}
Dra w ^字符串的方法(導致錯誤)
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();
}
我仍然試圖找到解決方案。我還會嘗試發佈圖片以幫助您瞭解此問題。提前致謝。
它是如何「搞砸」_?它沒有顯示任何東西?它顯示紋理,但它沒有正確映射?字符不在相同的基線中?請指定 –
繪製字符串後的所有內容都繪製爲像素缺失的矩形。 –
與DrawString的區別在於,您可以爲位圖字體圖集計算不同的紋理座標,但是從上面的代碼看來沒有什麼錯誤。也許某些SpriteBatch類的狀態受到破壞(目前還不清楚如何使用起始和終點矩形),但是很難在沒有整個代碼的情況下發現它 –