0

私は最近renderscriptを手に入れ、それを本当に気に入っていますが、ドキュメントと例が不足していることは役に立ちません。私はライブ壁紙と例を使用して自分のライブ壁紙を実行することができましたが、テクスチャリングには固定機能シェーダーを使用しています。

GLSLチュートリアルを見てきましたが、正確に翻訳されていないようです。私はrenderscriptのソースコードを調べましたが、それでもあまり役に立ちませんでした。

これは、renderscriptソースから掘り下げたコードで、fixed関数が実行しているように見えます。

プログラム頂点

shaderString.append("varying vec4 varColor;\n");
shaderString.append("varying vec2 varTex0;\n");
shaderString.append("void main() {\n");
shaderString.append("  gl_Position = UNI_MVP * ATTRIB_position;\n");
shaderString.append("  gl_PointSize = 1.0;\n");
shaderString.append("  varColor = ATTRIB_color;\n");
shaderString.append("  varTex0 = ATTRIB_texture0;\n");
shaderString.append("}\n");

プログラムの断片

shaderString.append("varying lowp vec4 varColor;\n");
shaderString.append("varying vec2 varTex0;\n");
shaderString.append("void main() {\n");
shaderString.append("  lowp vec4 col = UNI_Color;\n");
shaderString.append("  gl_FragColor = col;\n");
shaderString.append("}\n");

フラグメントがvarTex0変数に触れていないように見えるため、これらが最良の例ではないと思います。独自のプログラムフラグメントを作成し、固定関数の頂点シェーダーを使用しようとしました。

これが私のフラグメントシェーダーです:

ProgramFragment.Builder b = new ProgramFragment.Builder(mRS);
    String s = "void main() {" +
       " gl_FragColor = vec4(1.0,1.0,1.0,0.5);" +
       "}";
    b.setShader(s);
    pf = b.create();
    mScript.set_gPFLights(pf);

非常に基本的ですが、テクスチャをバインドする試みは失敗しました。テクスチャに必要な変数がわかりません。

テクスチャを使用する基本的なプログラム頂点とプログラムフラグメントの例を誰かが提供できますか?前もって感謝します。

4

2 に答える 2

0

FountainFBOサンプルをチェックしてください。フレームバッファオブジェクトとして使用されるテクスチャを持つプログラムフラグメントを使用します。

于 2012-02-16T01:56:46.537 に答える
0

私はついに、GLSLシェーダーの作成に使用されるFixedFunctionクラスのソースを見つけることができました。「android_frameworks_base/graphics / java / android/renderscript」内にあります。

これらのFixedFunction設定を使用したフラグメントシェーダーは次のとおりです。

ProgramFragmentFixedFunction.Builder builder = new ProgramFragmentFixedFunction.Builder(mRS);
    builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
                       ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); //CHANGED
    ProgramFragment pf = builder.create(); //RENAMED
    pf.bindSampler(Sampler.WRAP_NEAREST(mRS), 0);

次のようになります:

ProgramFragment.Builder pfBuilder = new ProgramFragment.Builder(mRS);
    String s = "varying vec2 varTex0;" +
                       "void main() {" +
                       " lowp vec4 col;" +
                       " vec2 t0 = varTex0;" +
                       " col.rgba = texture2D(UNI_Tex0, t0).rgba;" +
                       " gl_FragColor = col;" +
                   "}";
    pfBuilder.setShader(s);
    pfBuilder.addTexture(TextureType.TEXTURE_2D);
    pf = pfBuilder.create();

このフラグメントシェーダーは、ProgramVertexFixedFunctionで動作します。

FixedFunction頂点シェーダーがどのように見えるかを確認することはできませんが、確認したらこの回答を更新します。

于 2012-02-19T20:41:03.923 に答える