2016-04-25 47 views
0

我需要的是通过片段着色器1传递纹理,并将结果传递给片段着色器2.如何通过两个着色器传递纹理?

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

我不知道如何让着色器1的结果,切换着色器(GLES20.glUseProgram?),并通过着色器1的结果着色器2.

任何想法怎么办呢?

UPDATE 这是一个例子,我想才达到什么

效果1:

enter image description here

效果2:

​​

我的目标是结合Effect 1和Effect 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

如果你希望将结果传递的纹理着色器的另一个,你应该使用RTT(渲染纹理),以便你可以得到一个纹理传递给另一个着色器。

是的,你应该使用glUseProgram(名称)切换另一个着色器,但不仅如此,你应该在原来的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. 定义uniform float effect2在10个片段中类似effect1。
  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); 
        } 
    
+0

谢谢您的回答。你能看到更新的问题吗? 在这种情况下,您的解决方案是否有用? –

+0

@VitaliGrabovski这是一个简单的问题。总之,你不需要两个着色器程序,FBO甚至RTT。答案现在已更新。 – Sung

+0

如果有10个片段着色器,比如效果1和效果2等3个着色器,该怎么办?我是否需要创建30个着色器来覆盖所有情况? –

相关问题