Android 颜色扩散效果GLSL着色器Opengl ES 2.0

Android 颜色扩散效果GLSL着色器Opengl ES 2.0,android,graphics,opengl-es,opengl-es-2.0,cocos2d-x,Android,Graphics,Opengl Es,Opengl Es 2.0,Cocos2d X,我希望在Android和OpenGL ES 2.0上使用GLSL创建一种效果,在开始时,我使用着色器将彩色图像转换为灰度,然后从图像的任何一个角顶点开始一次显示一个像素的原始颜色 我已经能够成功地应用第一个效果(转换为灰度) 但我不知道如何一次选择一个像素并在图像上显示扩散效果 (谁能把我推向正确的方向?) 首先,我认为您需要在客户端内存中创建位图。此位图将用于告诉着色器哪些像素应转换为灰度。想象一个巨大的二维布尔值数组。0表示错误,1表示正确。你只需要一个频道 对于每个渲染帧,将使用glTex

我希望在Android和OpenGL ES 2.0上使用GLSL创建一种效果,在开始时,我使用着色器将彩色图像转换为灰度,然后从图像的任何一个角顶点开始一次显示一个像素的原始颜色

我已经能够成功地应用第一个效果(转换为灰度)

但我不知道如何一次选择一个像素并在图像上显示扩散效果

(谁能把我推向正确的方向?)


首先,我认为您需要在客户端内存中创建位图。此位图将用于告诉着色器哪些像素应转换为灰度。想象一个巨大的二维布尔值数组。0表示错误,1表示正确。你只需要一个频道

对于每个渲染帧,将使用glTexImage2D将位图转换为GL纹理,并将其与彩色图像一起传递到着色器中

您的frag着色器将如下所示:

uniform Sampler2D s_input;
uniform Sampler2D s_pixelsToGrayscale;
varying vec2 v_texCoord;

main() {
    vec4 color = texture2D(s_input, v_texCoord);
    vec4 isGrayscalePixel = texture2D(s_pixelsToGrayscale, v_texCoord);
    if( isGrayscalePixel.x > 0.0 ) {
        color = vec4(0.2126*color.r + 0.7152*color.g + 0.722*color.b);
    }
    gl_FragColor = color;
}

这其中最烦人的部分是创建位图,除非您刚刚开始后期处理效果(在这种情况下,您可能希望开始研究全屏四边形),这应该足以让您朝正确的方向前进,但如果您不喜欢阅读这种着色器,我想你的工作已经完成了。

这不是一个简单的问题吗?在另一个图像上同时显示灰度和彩色图像,然后GL_剪辑彩色精灵的内容?