2013-07-31 83 views
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(); 
} 

我仍然試圖找到解決方案。我還會嘗試發佈圖片以幫助您瞭解此問題。提前致謝。

+0

它是如何「搞砸」_?它沒有顯示任何東西?它顯示紋理,但它沒有正確映射?字符不在相同的基線中?請指定 –

+0

繪製字符串後的所有內容都繪製爲像素缺失的矩形。 –

+0

與DrawString的區別在於,您可以爲位圖字體圖集計算不同的紋理座標,但是從上面的代碼看來沒有什麼錯誤。也許某些SpriteBatch類的狀態受到破壞(目前還不清楚如何使用起始和終點矩形),但是很難在沒有整個代碼的情況下發現它 –

回答

0

我覺得真的很慚愧,我每次回答我的問題,但我發現了它。我沒有清除我的Draw緩衝區中的紋理緩衝區。我真的不喜歡我在這個網站上沒有真正的問題。但至少現在已經解決了。在解決我的一個問題之後,我總是像往常一樣愚蠢。儘管感謝您的評論!