如何通过两个着色器传递纹理?

时间:2016-04-25 19:44:16

标签: android opengl-es shader opengl-es-2.0

我只需要通过片段着色器1传递纹理,得到结果并将其传递给片段着色器2.

我知道如何将顶点和片段着色器链接到一个程序中并获取着色器对象。

我不知道如何获取着色器1的结果,切换着色器(GLES20.glUseProgram?)并将着色器1的结果传递给着色器2.

任何想法怎么做?

更新 这是我想要实现的一个例子

效果1:

enter image description here

效果2:

enter image description here

我的目标是结合效果1和效果2。 更新2

效果2功能:

...    
    uniform float effect2;

    vec2 getEffect_() {
        float mType = effect2;
        vec2 newCoordinate = vec2(textureCoordinate.x, textureCoordinate.y);
        vec2 res = vec2(textureCoordinate.x, textureCoordinate.y);

        //case 1
        if(mType==3.5) {
            if (newCoordinate.x > 0.5) {
                res = vec2(1.25 - newCoordinate.x, newCoordinate.y); }
        }
        else
        //case 2
        ...

        return res;
    }
...

1 个答案:

答案 0 :(得分:1)

如果要将结果作为纹理传递给另一个着色器,则应使用RTT(渲染到纹理),以便可以将纹理传递给另一个着色器。

是的,您应该使用glUseProgram(name)来切换另一个着色器,但不仅如此,您应该在原始FBO(现在使用)上渲染它

  1. 制作一个FBO,将结果作为纹理。
  2. 使用第一个着色器渲染到纹理,然后就可以获得纹理
  3. 使用主fbo(现在使用)
  4. 的第二个着色器绘制纹理

    如果您只想组合两个效果,只需合并两个片段着色器即可。

    //At the end of the second frag shader
    // skip this below
    //gl_FragColor = result;
    // put these codes 
     float grayScale = dot(result.rgb, vec3(0.299, 0.587, 0.114));
     gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0);
    

    仅使用一个着色器程序和第二个效果片段着色器。

    我假设您不需要一次显示这30种效果。

    1. 在像effect1这样的10个片段中定义uniform float effect2
    2. 传递效果2,如0.5,1.5或2.5
    3. 根据您传递的值,不同地混合效果。 例如,

      if(effec2>2.0) {
              float grayScale = dot(result.rgb, vec3(0.299, 0.587, 0.114));
               gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0); 
          } else if(effect2>1.0) {
              vec3 final_result_of_effec2_2 = fun_2(result.rgb);
               gl_FragColor = vec4(final_result_of_effec2_2, 1.0); 
          } else {
                vec3 final_result_of_effec2_3 = fun_3(result.rgb);
               gl_FragColor = vec4(final_result_of_effec2_3, 1.0); 
          }