如何在android中的位图上启动rgb到hsv的opengl转换

问题描述 投票:0回答:1

我想对我加载的位图进行图像处理。我担心在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);
} 
android image-processing opengl-es-2.0 hsv
1个回答
0
投票

我还需要顶点着色器吗?阅读有关直通顶点着色器的内容。我读过一些不需要两者的实现。

您必须按照规范使用两者,否则您的程序将无法链接:

以下列出了导致链接错误的一些条件。顶点着色器和片段着色器不同时存在于程序对象中。

GLUtils.texSubImage2D。什么是它和texImage2d之间的差异。

glTexSubImage2D将数据区域上传到当前存在的纹理。但是如果你正在使用它,你必须先用其他一些操作来分配纹理(例如,glTexImage2DglCopyTexImage2D

我不明白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函数。

© www.soinside.com 2019 - 2024. All rights reserved.