2012-09-19 44 views
3

我在將紋理加載到圓上時遇到問題。我的圈子是用三角形風扇製成的。它給出了一個糟糕的輸出。如何使用OpenGL ES將紋理加載到圓上

原始圖像: Original Image

結果:The result

我的代碼:

public class MyOpenGLCircle { 

    private int points=360; 
    private float vertices[]={0.0f,0.0f,0.0f}; 
    private FloatBuffer vertBuff, textureBuffer; 
    float texData[] = null; 


    float theta = 0; 
    int[] textures = new int[1]; 
    int R=1; 
    float textCoordArray[] = 
     { 
      -R, (float) (R * (Math.sqrt(2) + 1)), 
      -R, -R, 
      (float) (R * (Math.sqrt(2) + 1)), -R 
     }; 
    public MyOpenGLCircle(){ 

     vertices = new float[(points+1)*3]; 
     for(int i=0;i<(points)*3;i+=3) 
     {  
       //radius is 1/3 
       vertices[i]=(float) (Math.cos(theta))/3; 
       vertices[i+1]=(float) (Math.sin(theta))/3; 
       vertices[i+2]=0; 
       theta += Math.PI/90; 

     } 
     ByteBuffer bBuff=ByteBuffer.allocateDirect(vertices.length*4);  
      bBuff.order(ByteOrder.nativeOrder()); 
      vertBuff=bBuff.asFloatBuffer(); 
      vertBuff.put(vertices); 
      vertBuff.position(0); 


     ByteBuffer bBuff2=ByteBuffer.allocateDirect(textCoordArray.length * 4 * 360); 
     bBuff2.order(ByteOrder.nativeOrder()); 
     textureBuffer=bBuff2.asFloatBuffer(); 
     textureBuffer.put(textCoordArray); 
     textureBuffer.position(0); 
    } 

    public void draw(GL10 gl){ 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //4 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT,0, textureBuffer); //5 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points/2); 
    } 

    public void loadBallTexture(GL10 gl, Context context, int resource){ 
     Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resource); 
     gl.glGenTextures(1, textures, 0); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 
    } 
} 

請幫我度過這個

+0

請描述您的問題。圖像對理解有很大的幫助。 – Tim

+0

請給我你的電子郵件。我無法在這裏發佈圖片,因爲新用戶不允許發佈任何圖片。 –

+0

我已經發布了一切......但現在我無法分析爲什麼我的紋理沒有以正確的方式加載。 –

回答

1

對於初學者來說,你需要有相同數量的texcoord對在你的texcoord數組中,因爲你的頂點數組中有頂點元組。

看起來你剛剛有3對紋理座標和360個頂點。

您需要有一個texcoord數組,其中有360個紋理座標。然後,當頂點繪製,頂點[0]被texcoord [0],頂點[1]獲取與texcoord [1]成對等

===編輯===

你只需要以類似於定義頂點的方式定義紋理座標:在使用數學公式的循環中。

因此,例如,三角形風扇的第一個頂點位於圓的中心。對於圓的中心,您希望texcoord引用紋理的中心,即座標(0.5,0.5)。

當你繞過邊緣時,只需考慮哪些紋理座標映射到圓的那一部分即可。因此,讓我們假設你的下一個頂點是圓的最右邊的頂點,它與圓的中心位於相同的y值。這個紋理的texcoord應該是(1.0,0.5),或者垂直中間的紋理的右邊緣。

圓的頂部頂點將有texcoord(0.5,1.0),最左邊的頂點將是(0.0,0.5)等

您可以使用三角填寫頂點的其餘部分。

+0

我很感謝你的寶貴意見,Tim,這意味着我必須編寫所有的360座標?對我來說,分析所有360座標是不是有點緊張和不可行? –

+0

它還知道映射到每個頂點的紋理部分是什麼?我認爲更標準的wawy只是使用四邊形,並使用alpha紋理使角不可見,所以剩下的就是圓。那隻需要4個頂點和4個紋理座標。 – shenles

+0

@SiddharthVerma我已經更新了我的帖子,並附有解釋。 – Tim