2013-05-18 64 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