Alb*_*ore 9 gpgpu opengl-es image-processing glsl
我试图在GPU上进行一些图像处理,例如中值,模糊,亮度等.一般的想法是从GPU Gems 1 做这样的框架.
我能够编写用于处理像素的GLSL片段着色器,因为我在效果设计器应用程序中尝试了不同的东西.
但我不确定如何完成任务的其他部分.也就是说,我想在图像坐标中处理图像,然后将结果输出到纹理.我知道这个gl_FragCoords
变量.
据我所知它是这样的:我需要设置一个视图(可能是正交的?)和四边形,这样像素着色器将被应用到图像中的每个像素一次,这样它会渲染到纹理或其他东西.但是我怎么能实现这一目标,考虑到可能会让我感到有些尴尬的深度......
如果有人能帮我完成这个相当简单的任务,我会非常感激,因为我对自己感到非常沮丧.
看来我必须使用一个FBO,得到一个这样的: glBindFramebuffer(...)
使用本教程,它针对的是OpenGL 2.0,但ES 2.0中提供了大多数功能,我唯一怀疑的是浮点纹理.
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html
基本上,您需要四个顶点位置(如vec2)(四角(-1,-1)和(1,1))作为顶点属性传递.
你真的不需要投影,因为着色器不需要任何投影.
创建一个FBO,绑定它并附加目标表面.不要忘记检查完整性状态.绑定着色器,设置输入纹理并绘制四边形.
您的顶点着色器可能如下所示:
#version 130
in vec2 at_pos;
out vec2 tc;
void main() {
tc = (at_pos+vec2(1.0))*0.5; //texture coordinates
gl_Position = vec4(at_pos,0.0,1.0); //no projection needed
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 130
in vec2 tc;
uniform sampler2D unit_in;
void main() {
vec4 v = texture2D(unit_in,tc);
gl_FragColor = do_something();
}
Run Code Online (Sandbox Code Playgroud)