Renderscript FixedFunction着色器是什么样的?

时间:2012-02-13 02:32:51

标签: android renderscript

我最近选择了renderscript并非常喜欢它,但缺乏文档和示例并没有帮助。我已经设法使用动态壁纸和示例来运行我自己的动态壁纸,但我一直在使用固定功能着色器进行纹理化。

我看过GLSL教程,但似乎并没有完全翻译。我查看了renderscript源代码,但它仍然没有太多帮助。

这是我从renderscript源挖出的一些代码,看起来像是固定函数正在做的:

编程顶点

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

非常基本但是任何绑定纹理的尝试都失败了。我不知道纹理需要什么变量。

有人能提供使用纹理的基本程序顶点和程序片段的示例吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

查看FountainFBO样本。它使用带有纹理的程序片段,该纹理用作帧缓冲对象。

答案 1 :(得分: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顶点着色器的样子,但是当我这样做时我会更新这个答案。