1

消しゴムツールのように作成しようとしています(ユーザーがテクスチャ上で指をドラッグすると、その場所でテクスチャが透明になります)。以下のコードを使用してこれを試しました(オンラインで例を見つけて少し変更しました)が、遅すぎます。ブラシテクスチャを使用して背景テクスチャを描画しています。この問題に対する別の解決策はありますか?シェーダーを使用するともっと速くなるかもしれませんが、方法がわかりません。

助けてくれてありがとう

void Start()
{
   stencilUV = new Color[stencil.width * stencil.height];
   tex = (Texture2D)Instantiate(paintMaterial.mainTexture);
}

void Update () 
{
     RaycastHit hit;
    if (Input.touchCount == 0) return;
    //if (!Input.GetMouseButton(0)) return;
    if (Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), out hit))
    {
        pixelUV = hit.textureCoord;
        pixelUV.x *= tex.width;
        pixelUV.y *= tex.height;

        CreateStencil((int)pixelUV.x, (int)pixelUV.y, stencil);
    }
}

void CreateStencil(int x, int y, Texture2D texture)
{
    paintMaterial.mainTexture = tex;
    for (int xPix = 0; xPix<texture.width; xPix++)
    {
        for (int yPix=0;yPix<texture.height; yPix++)
        {
            stencilUV[i] = tex.GetPixel((x - texture.width / 2) + xPix,
                (y - texture.height / 2) + yPix);
            stencilUV[i].a = 0;//1-color.a;
            i++;
        }
    }
    i=0;
    tex.SetPixels(x-texture.width/2, y-texture.height/2, texture.width, texture.height, stencilUV);
    tex.Apply();
}
4

1 に答える 1

2

ご存知のように、このUpdate()関数はフレームごとに呼び出されます。したがって、これはコードの最適化を試みる場所です。CreateStencil()テクスチャ内のすべてのピクセルを反復処理してから for ループ内で呼び出すため、この関数は私にはかなり高価に思えtex.GetPixel(..)ます。つまり、画面に触れると、アプリはテクスチャ内のすべてのピクセルに対してこの関数をすべてのフレームで実行しようとします。行く道ではありません。Start()or関数内の他の配列にピクセル情報をバッファリングしてAwake()、必要な部分だけを 内で実行しようとしUpdate()ます。iPhone でアプリをスムーズに実行するには、省略できる高価な操作がすべて重要です。

于 2012-04-05T21:16:30.203 に答える