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

How to pass texture through two shaders?

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

我知道如何link将顶点着色器和片段着色器一起放入程序中并获取着色器对象。

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

知道怎么做吗?

更新 这是我想要实现的示例

效果一:

效果二:

我的目标是结合效果 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;
    }
...

如果你想将结果作为纹理传递给另一个着色器,你应该使用 RTT(渲染到纹理),这样你就可以获得纹理传递给另一个着色器。

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

  1. 做一个FBO把结果做成贴图。
  2. 使用第一个着色器渲染到纹理然后你可以获得纹理
  3. 在主 fbo 处使用第二个着色器绘制纹理(现在你使用)

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

//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. 传递 effect2,例如 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); 
        }