如何用Fragment Shader更改纹理的像素颜色

我想改变纹理的像素颜色。 我不知道从哪里开始,要添加什么。 真的需要帮助,我只能在互联网上find无用的代码片断。

在这里输入图像说明

我目前的代码:

public void onSurfaceCreated(GL10 gl, EGLConfig config) { ... GLES20.glAttachShader(riGraphicTools.sp_SolidColor, vertexShader); GLES20.glAttachShader(riGraphicTools.sp_SolidColor, fragmentShader); GLES20.glLinkProgram(riGraphicTools.sp_SolidColor); vertexShader = riGraphicTools.loadShader(GLES20.GL_VERTEX_SHADER, riGraphicTools.vs_Image); fragmentShader = riGraphicTools.loadShader(GLES20.GL_FRAGMENT_SHADER, riGraphicTools.test_Image); riGraphicTools.sp_Image = GLES20.glCreateProgram(); GLES20.glAttachShader(riGraphicTools.sp_Image, fragmentShader); ... } 

riGraphicTools类:

 public class riGraphicTools { public static final String test_Image = "precision mediump float;" + "varying vec2 v_texCoord;" + "uniform sampler2D s_texture;" + "void main() {" + " gl_FragColor = texture2D( s_texture, v_texCoord );" + "}"; public static final String vs_Image = "uniform mat4 uMVPMatrix;" + "attribute vec4 vPosition;" + "attribute vec2 a_texCoord;" + "varying vec2 v_texCoord;" + "void main() {" + " gl_Position = uMVPMatrix * vPosition;" + " v_texCoord = a_texCoord;" + "}"; } 

texture2D()函数返回一个vec4,其中包含该texel的rgba值。 然后你可以像任何其他vec4一样操纵它。 例如,要使一切变黑,你可以做…

 gl_FragColor = texture2D( s_texture, v_texCoord ) * vec4(0.5, 0.5, 0.5, 1); 

诀窍是片段着色器在你绘制的任何片段上运行,select一个单独的纹理来处理通常是不合理的。 如果这是你想要做的,我建议在着色器之外,也许用glTexSubImage2D 。