我想对我加载的位图进行图像处理。我担心在cpu上的普通android中做任何事都需要很长时间,并且已经读过允许gpu做事情可能会大大加快速度。我觉得如果我可以将图像从rgb转换为hsv在opengl中我可以弄清楚如何做我需要的一切。
我想在片段着色器中工作(因为这是关于像素颜色),因为我根本不想变换图像,我觉得顶点着色器对我的需求毫无用处。我还需要顶点着色器吗?阅读有关直通顶点着色器的内容。我读过一些不需要两者的实现。我的主要困惑点在于opengl的工作原理。我已经收集了如何形成纹理和帧缓冲对象。我不懂GLUtils.texSubImage2D。什么是它和texImage2d之间的差异。在任何情况下,根据this site (Site 1)和this code (Site 2),他们使用texSubImage2D加载位图。
我得到了如何加载顶点着色器和片段着色器。我不明白glUseProgram()之后会发生什么。它完成了吗?您是否不断向其提供处理信息?怎么阻止它?
我认为你使用统一的sampler2D传递纹理 - 我的意思是我认为这是如何在片段着色器中使用纹理。我猜它会自动放入片段着色器。这一切如何运作是一个谜。我计划使用glReadPixels从纹理中恢复我的位图。我什么时候打电话给这个? android doc中讨论的回调函数只处理一个surfaceview afaik
我计划使用来自this site (Site3)的信息减去它们的顶点着色器来转换它。我只需要把它们放在一起。
对不起,如果这还不够。 BTW我不想使用任何库。
我试过阅读有关opengl和特别是opengl es 2.0的内容。他们都谈论使用surfaceview(我不想要)或处理许多三角形。我确实得到了我正在使用opengl的目的,而opengl并非完全适合。
这是来自Site3的一些代码 所以我认为tex将是通过texSubImage2D传递的纹理 色调,没有头绪。 texture2D()获取我猜的像素,但vTextureCoord来自哪里是一个谜。如果我想,比如像素周围的3x3矩阵,我只需减去并添加到vTextureCoord值并继续调用texture2D()。以及如何将像素设置为某种颜色。什么是gl_FragColor
uniform sampler2D tex;
uniform vec3 hue;
// Add the two methods here (rgb2hsv and hsv2rgb are at Site 3)
void main() {
vec4 textureColor = texture2D(tex, vTextureCoord);
vec3 fragRGB = textureColor.rgb;
vec3 fragHSV = rgb2hsv(fragRGB).xyz;
fragHSV.x += hue.x;
fragHSV.yz *= hue.yz;
fragHSV.xyz = mod(fragHSV.xyz, 1.0);
fragRGB = hsv2rgb(fragHSV);
gl_FragColor = vec4(fragRGB, textureColor.w);
}
我还需要顶点着色器吗?阅读有关直通顶点着色器的内容。我读过一些不需要两者的实现。
您必须按照规范使用两者,否则您的程序将无法链接:
以下列出了导致链接错误的一些条件。顶点着色器和片段着色器不同时存在于程序对象中。
GLUtils.texSubImage2D。什么是它和texImage2d之间的差异。
glTexSubImage2D
将数据区域上传到当前存在的纹理。但是如果你正在使用它,你必须先用其他一些操作来分配纹理(例如,glTexImage2D
或glCopyTexImage2D
。
我不明白glUseProgram()之后会发生什么。它完成了吗?您是否不断向其提供处理信息?怎么阻止它?
它没有运行任何东西。使用glDraw*
命令渲染时,将执行顶点和片段着色器。 glUseProgram
仅设置将在某些操作中使用的程序。
我认为你使用统一的sampler2D传递纹理 - 我的意思是我认为这是如何在片段着色器中使用纹理。我猜它会自动放入片段着色器。这一切如何运作是一个谜。我计划使用glReadPixels从纹理中恢复我的位图。我什么时候打电话给这个? android doc中讨论的回调函数只处理一个surfaceview afaik
采样器是对纹理图像单元的引用。基本上是的,你将相应的纹理图像单元号作为一个统一传递。 glReadPixels
返回当前帧缓冲区中的数据。完成所有必需的渲染操作后,您需要调用。虽然请注意glReadPixels
会阻止管道,从而减慢程序速度。您也可以将它与Pixel Buffer Objects(OpenGL ES 3.0+中提供)一起使用,或者使用EGLImageKHR。
我试过阅读有关opengl和特别是opengl es 2.0的内容。他们都谈论使用surfaceview(我不想要)或处理许多三角形。我确实得到了我正在使用opengl的目的,而opengl并非完全适合。
SurfaceView只是您可以渲染的系统级事物。您不必使用它,而是可以使用EGL设置屏幕外渲染表面。您将不得不使用三角形(除非您可以使用OpenGL ES 3.1和计算着色器),但您只需要其中的两个。图像处理是OpenGL的有效应用程序,它实际上是许多图像处理库/程序使用的。
texture2D()获取我猜的像素,但vTextureCoord来自哪里是一个谜。
您需要将其作为顶点着色器中的varying
传递。
以及如何将像素设置为某种颜色。什么是gl_FragColor
gl_FragColor
是此片段着色器实例当前正在处理的片段的输出颜色。
如果我想,比如像素周围的3x3矩阵,我只需减去并添加到vTextureCoord值并继续调用texture2D()。
是的,但请注意过滤,因为附近的纹素可能会影响纹理查找功能。较新版本的OpenGL ES版本允许您使用texelFetch
函数。