我从 OpenGL ES 2 开始,我正在尝试构建一个非常简单的应用程序,其中我有一个静态图像和一个按钮,该按钮使用 GLSL 片段着色器将类似 Instagram 的照片过滤器应用于该图像。
我一直在阅读很多教程,其中很好地解释了不同的算法,但我只是不知道如何输入。我的意思是,我在哪里“将图像作为参数传递”以获得它的位图或像素缓冲区,以便我可以操作它?
提前致谢。
我从 OpenGL ES 2 开始,我正在尝试构建一个非常简单的应用程序,其中我有一个静态图像和一个按钮,该按钮使用 GLSL 片段着色器将类似 Instagram 的照片过滤器应用于该图像。
我一直在阅读很多教程,其中很好地解释了不同的算法,但我只是不知道如何输入。我的意思是,我在哪里“将图像作为参数传递”以获得它的位图或像素缓冲区,以便我可以操作它?
提前致谢。
Android SDK 中有一个很好的示例应用程序,名为“HelloEffects”,可以执行此操作。图像通过函数 glTexImage2D() 或 GLUtils.texImage2D() 作为“纹理”加载。
我认为这篇文章会有所帮助:
基本上,这都是关于绑定你的纹理并将其 ID 作为指向所谓的GLSL 纹理采样器的统一传递(Sampler_(GLSL) wiki 链接)。然后,神奇的 glsl 命令是texture2D()
.
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(program,"texsampler"),0);
whereglActiveTexture(GL_TEXTUREi);
激活指定的i槽并将glBindTexture(GL_TEXTURE_2D, textureID);
textureID 绑定到该槽。0 inglUniform1i()
实际上等于i。
使用后不要忘记取消绑定所有内容。
顶点着色器示例:
varying vec2 texcoord;
void main() {
gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;
texcoord=gl_Vertex.xy; // or whatever you need to pass texture coordinates
}
片段着色器示例:
varying vec2 texcoord;
uniform sampler2D texsampler;
void main() {
gl_FragColor=vec4(texture2D(texsampler,texcoord).rgb,1.0);
}