7月 31

おはようございます、Selphyです。
前回のエントリーでは、 構造体 を使った簡単なサンプルを説明しました。

今回は、テクスチャーを使ってみます。

RS内で使用している型やメソッドなどについては、RenderScriptのReference に記載されているので、そちらをご覧ください。

完成形のスクリーンショット

完成したアプリのスクリーンショット

ファイル構成

プロジェクトは、前回のものを使うので、特に変更はありません。

コード

改造したファイルのみ載せます。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
        script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
       
        texture = Allocation.createFromBitmapResource(rs, res, R.drawable.droid_yellow);
        script.set_texture(texture);

        progStoreBlendAlpha = ProgramStore.BLEND_ALPHA_DEPTH_TEST(rs);
        script.set_gProgStoreBlendAlpha(progStoreBlendAlpha);

        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(rs);
        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
        progFragmentTexture = texBuilder.create();
        progFragmentTexture.bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
        script.set_gProgFragmentTexture(progFragmentTexture);

        cullNone = ProgramRaster.CULL_NONE(rs);
        script.set_gCullNone(cullNone);
       
        rs.bindRootScript(script);
    }

    テクスチャーは、文字列と同様に、Allocationでメモリの確保を行います。
    そのため、テクスチャー自体のメモリ確保は簡単です。
    しかし、テクスチャーを表示するだけで、ProgramStoreや、ProgramFragmentFixedFunctionなどが必要となってくるため、文字列の描画に比べて難しそうな印象を受けるかもしれません。
    やっていることは、2DイメージのAlpha値を有効にしたり (7,8行目) 、ジャギーを軽減したり (13行目) 、カリング処理を施したり (16,17行目) といった作業なので、実際には、必要不可欠な行ではなく、テクスチャーの描画クォリティを上げるための行が多いです。

  • HelloWorldScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       
        rsgBindProgramStore(gProgStoreBlendAlpha);
        rsgBindProgramFragment(gProgFragmentTexture);
        rsgBindProgramRaster(gCullNone);
       
        float minX = gTouch.x;
        float maxX = minX + 100;
        float minY = gTouch.y;
        float maxY = minY + 100;
       
        rsgBindTexture(gProgFragmentTexture, 0, texture);
        rsgDrawQuadTexCoords(minX, minY, 0, 0.f, 0.f,
                             minX, maxY, 0, 0.f, 1.f,
                             maxX, maxY, 0, 1.f, 1.f,
                             maxX, minY, 0, 1.f, 0.f);  
       
        // 20fps
        return 50;
    }

    14行目でバインドしたテクスチャーデータを15行目で描画しているだけです。

RSで自動生成されるもの

今回、新たに自動生成されたクラスはありません。

今回のサンプルは Google Code で公開しています。
次回は、この連載の最初にスクリーンショットで紹介したカルーセルの基本となるサンプルを説明します。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.


Posted by selphy

Tagged with:
preload preload preload