3

テクスチャを円にロードする際に問題に直面しています。私のサークルは三角うちわで作っています。それは悪い出力を与えます。

元の画像: 元の画像

結果 : 結果

私のコード:

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

これで私を助けてください

4

1 に答える 1

1

手始めに、頂点配列に頂点タプルがあるのと同じ数のtexcoordペアをtexcoord配列に含める必要があります。

3組のテクスチャ座標と360個の頂点があるようです。

360テクスチャ座標を持つtexcoord配列が必要です。次に、頂点が描画されると、vertex[0]はtexcoord[0]を取得し、vertex[1]はtexcoord[1]とペアになります。

===編集===

頂点を定義するのと同じ方法で、数式を使用してループでテクスチャ座標を定義する必要があります。

たとえば、三角形のファンの最初の頂点は円の中心にあります。円の中心については、texcoordがテクスチャの中心(座標(0.5、0.5))を参照するようにします。

エッジを回るときは、どのテクスチャ座標が円のその部分にマップされているかを考えてください。したがって、次の頂点が円の右端の頂点であり、円の中心と同じy値に沿っていると仮定します。これのtexcoordは、(1.0、0.5)、つまり垂直方向の中央のテクスチャの右端になります。

円の一番上の頂点はtexcoord(0.5、1.0)になり、左端の頂点は(0.0、0.5)になります。

三角法を使用して、残りの頂点を埋めることができます。

于 2012-09-19T19:25:21.373 に答える