0

押されていない場合は青い円、押されている場合は赤い円を表示するボタン クラスを作成しています。まず、2 つの三角形で構成される 4 つの頂点クワッドを作成します。独自のビットマップを生成し、ビットマップ上に 2 つの円を左から右に並べて描画します。次に、代わりに 4 つの UV ポイントを使用してテクスチャ バッファを作成し、8 つの UV ポイントを使用して作成します。1 つは青い円をマップし、もう 1 つは赤い円をマップします。ボタンが押されたときに赤い円をレンダリングしたいと思います。理想的には、

gl.glTexCoordPointer

メソッドとオフセットを渡しますが、それは機能していません。これは、ビットマップを生成し、キャンバスを使用してビットマップ上に描画し、オブジェクトをペイントしてから、テクスチャのマッピングを試みるために使用した私の方法です。2 のべき乗であるテクスチャを生成する必要があることに注意してください。そのため、コンストラクタで指定されたボタンの幅と高さの変数に基づいて、必要以上に大きなビットマップを生成できる数学があります。

public void InitializeButton(GL10 gl, int upcolor, int downcolor, String symbol)
    {
        //Our variables for creating a bitmap and texture
        Canvas canvas   = null; 
        Bitmap bitmap   = null;
        Paint  paint    = null;

    //Set up the bitmap type
    Bitmap.Config conf = Bitmap.Config.ARGB_8888;


    /*
     * We now want to calculate the size of the texture. Remember it is best to be a square
     * texture or at least a power of 2. The below equation below will do this. For example
     * if the width of the button was say 20, we need to find the smallest power of 2 that is
     * greater than 20. In this case we know it is 32. But how do we calculate that? First we
     * have to find out the exponent of what 2^x = 20. Then we find the ceiling of tha number.
     * In order to make that calculation we have to take the log of that, but in order to use
     * the log function which is base 10, we have to switch to base 2 so that means 
     * we have to take the log(width)/log(2) to switch to base 2, then get the ceiling of that
     * number because it would be between 4 and 5 in this case. When we take the ceiling we get
     * 5 and 2^5 is 32.
     * 
     * Side note, we want to double the size to make sure there is room for the up and the down
     * actions.
     */
    widthTexture = (int) Math.pow(2,Math.ceil((Math.log(this.width*2)/Math.log(2))));
    heightTexture = (int) Math.pow(2,Math.ceil((Math.log(this.height*2)/Math.log(2))));

    /*
     * Now we will create the bitmap for the creation of the button
     */
    bitmap = Bitmap.createBitmap(widthTexture,heightTexture,conf);

    //Now create a new canvas from that bitmap
    canvas = new Canvas(bitmap);

    //Create a new Paint
    paint = new Paint();

    /*
     * Now we want to render the draw the up and down button on the texture. We are just going
     * to use two different colors to represent up and down. So we will draw the up circle button
     * starting at 0 0 and the down button off to the right.
     */
    paint.setColor(upcolor);
    paint.setAlpha(120);
    canvas.drawOval(new RectF(0,0,width,height), paint);
    paint.setColor(Color.BLACK);
    canvas.drawText(symbol, width/2, height/2, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(symbol, width/2+3, height/2+3, paint);

    //Draw the down color button
    paint.setColor(downcolor);
    paint.setAlpha(120);
    canvas.drawOval(new RectF(width,0,width*2,height), paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(symbol, width+(width/2), height/2, paint);
    paint.setColor(Color.BLACK);
    canvas.drawText(symbol, width+(width/2)+3, height/2+3, paint);

    float widthpercent  =  ((float)width/(float)widthTexture);
    float heightpercent =  ((float)height/(float)heightTexture);

    /*
     * Now create two texture maps. One for the up button and one for the down button
     * You can change the offset of the draw texture thing to change the animations now
     */
    float uvTextures[] = {0f,                   heightpercent,
                          widthpercent,         heightpercent,
                          widthpercent,         0f,
                          0f,                   0f,
                          widthpercent,         heightpercent,
                          widthpercent*2,       heightpercent,
                          widthpercent*2,       0f,
                          widthpercent,         0f,
                          };

    /*
     * Allocate the byte buffer so it is a normal array of floats and not a java array.
     * load the uvTexture values inside.
     */
    ByteBuffer tbb = ByteBuffer.allocateDirect(uvTextures.length*4);
    tbb.order(ByteOrder.nativeOrder());
    textureBuffer = tbb.asFloatBuffer();
    textureBuffer.put(uvTextures);
    textureBuffer.position(0);  

    int [] textures = new int[1];

    gl.glGenTextures(1, textures,0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D,  textures[0]);
    textureID = 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);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bitmap,0);


    //Don't forget to deallocate the bitmap
    bitmap.recycle();
}

したがって、最終的に render メソッドで、テクスチャ マップ上の異なる座標を同じ頂点にレンダリングできるようにしたいと考えています。だから私は glTexCoordPointer を呼び出し、オフセットを「カウンター」に変更します。ここで、カウンターは 6*4 (フロートごとに 6 つの頂点 x 4 バイト) である必要がありますが、それは機能しないため、カウンターを 0 で試してインクリメントしましたが、魔法のものが見つかりませんでした赤いボタンをマップする番号。余談ですが、それを試してみると、非常に奇妙なパターンが描かれ、10 ~ 15 個の小さな青と赤の円が表示されることもありました。

    if(isdown)
        gl.glTexCoordPointer(2,GL10.GL_FLOAT,counter,textureBuffer);
    else
        gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);
4

1 に答える 1

0

@Harismは私の状況では正しかった。これをまだ正しく使用していることを願っています。ストライド変数を変更できると思っていましたが、バッファの位置を変更する必要がありました。これは、3D サーフェス上のテクスチャをアニメーション化するために機能しました。これが「最善の」方法かどうかはわかりませんが、それまではこれを使用します。

于 2012-12-10T11:15:11.307 に答える