2016-04-25 48 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個着色器來覆蓋所有情況? –

相關問題