2012-09-19 3 views
3

Je rencontre des problèmes lors du chargement d'une texture sur un cercle. Mon cercle est fait avec un ventilateur en triangle. Cela donne une mauvaise sortie.Comment charger une texture sur un cercle avec OpenGL ES

image originale: Original Image

Le résultat: The result

Mon code:

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

S'il vous plaît aidez-moi à travers ce

+0

Veuillez décrire votre problème. Les images sont d'une grande aide à la compréhension. – Tim

+0

s'il vous plaît donnez moi votre email. Je ne suis pas en mesure d'afficher les images ici car les nouveaux utilisateurs ne sont pas autorisés à poster des photos. –

+0

J'ai posté tout ... mais maintenant je ne suis pas capable d'analyser pourquoi ma texture n'est pas chargée correctement. –

Répondre

1

Pour commencer, vous devez avoir le même nombre de paires texcoord dans votre tableau texcoord car vous avez des tuples vertex dans votre tableau de vertex.

Il semble que vous ayez 3 paires de coordonnées de texture et 360 vertices.

Vous devez avoir un tableau texcoord contenant 360 coordonnées de texture. Puis, quand les sommets sont dessinés, sommet [0] se TexCoord [0], sommet [1] se jumelé avec TexCoord [1], etc.

=== === EDIT

Vous avez juste définissez les coordonnées de la texture d'une manière similaire à la façon dont vous définissez vos sommets: dans une boucle en utilisant des formules mathématiques. Par exemple, votre premier sommet du triangle est au centre du cercle. Par exemple: Pour le centre de votre cercle, vous voulez que la texcoord fasse référence au centre de la texture, qui est la coordonnée (0.5, 0.5). Lorsque vous contournez les bords, pensez aux mappes de texture correspondant à cette partie du cercle. Supposons donc que votre prochain sommet est le sommet le plus à droite du cercle, qui se trouve le long de la même valeur y que le centre du cercle. Le texcoord pour celui-ci serait (1.0, 0.5), ou le bord droit de la texture dans le milieu vertical.

Le sommet haut du cercle aurait TexCoord (0,5, 1,0), le sommet serait plus à gauche (0,0, 0,5), etc.

Vous pouvez utiliser votre trigonométrie pour remplir le reste des sommets.

+0

J'apprécie vos commentaires précieux Tim, donc cela signifie que je dois écrire toutes les coordonnées 360? Est-ce que ce ne sera pas un peu agité et irréalisable pour moi d'analyser toutes les coordonnées 360? –

+0

De quelle autre façon sait-il quelle partie de la texture doit correspondre à chaque sommet? Le wawy plus standard que je pense serait d'utiliser simplement un quad, et d'utiliser une texture alpha pour rendre le coin invisible, tout ce qui reste est le cercle. Cela ne nécessiterait que 4 sommets et 4 coordonnées de texture. – shenles

+0

@SiddharthVerma J'ai mis à jour mon message avec une explication. – Tim

Questions connexes