【问题标题】:What do the Renderscript FixedFunction shaders look like?Renderscript FixedFunction 着色器是什么样的?
【发布时间】:2012-02-20 04:46:34
【问题描述】:

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

我查看了 GLSL 教程,但似乎并没有完全翻译过来。我已经查看了 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);

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

谁能提供一个使用纹理的基本程序顶点和程序片段的示例?提前致谢。

【问题讨论】:

    标签: android renderscript


    【解决方案1】:

    查看 FountainFBO 示例。它使用带有纹理的程序片段,用作帧缓冲区对象。

    【讨论】:

    • 是的,但是那个例子仍然只使用了固定功能程序片段,所以不幸的是它并没有说明那些看起来像什么。
    【解决方案2】:

    我终于找到了用于创建 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 顶点着色器是什么样子,但我会在看到的时候更新这个答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多