2013-05-18 96 views
0

我在Open GL ES 2.0中使用這個簡單的着色器進行紋理映射 我需要爲疊加混合模式添加代碼。 算法我明白一切。 但是如何獲得屏幕上像素的顏色進行混合。如何獲取着色器上的像素的顏色(Open GL ES 2,0)

P.S我只使用一個紋理作爲源

String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // 
     + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // 
     + "uniform mat4 u_projTrans;\n" // 
     + "varying vec4 v_color;\n" // 
     + "varying vec2 v_texCoords;\n" // 
     + "\n" // 
     + "void main()\n" // 
     + "{\n" // 
     + " v_color = vec4(1, 1, 1, 1);\n" // 
     + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // 
     + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // 
     + "}\n"; 
    String fragmentShader = "#ifdef GL_ES\n" // 
     + "#define LOWP lowp\n" // 
     + "precision mediump float;\n" // 
     + "#else\n" // 
     + "#define LOWP \n" // 
     + "#endif\n" // 
     + "varying LOWP vec4 v_color;\n" // 
     + "varying vec2 v_texCoords;\n" // 
     + "uniform sampler2D u_texture;\n" // 
     + "void main()\n"// 
     + "{\n" // 
     + " gl_FragColor = texture2D(u_texture, v_texCoords);\n" // 
     + "}"; 

回答

2

簡短的回答是:你不能。有glBlendFunc()控制的經典GL混合,glBlendEquation & Co,但這是在片段着色器後執行的完全不同的管道階段 - 混合將混合當前像素顏色(目標)和片段着色器計算的顏色(源)使用您可以設置的各種模式和方程式。如果這足以達到你想達到的效果,那就去做吧。

如果您需要更多地控制着色器中的混合,可以將要混合的圖像渲染到紋理中,並在繪製要混合的物體時將其用作額外的輸入紋理,但這會導致一個巨大的overhaed,應該避免。

另請參閱問題OpenGL Blend Modes vs Shader Blending