glsl - gl_FragColor 和 glReadPixels

标签 glsl opengl-es-2.0

我仍在尝试从片段着色器读取像素,但有一些问题。 我知道 gl_FragColor 返回 vec4 意味着 RGBA,4 个 channel 。 之后,我使用 glReadPixels 读取 FBO 并将其写入数据

GLubyte *pixels = new GLubyte[640*480*4];
glReadPixels(0, 0, 640,480, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

这工作正常,但确实存在速度问题。相反,我只想读取 RGB,因此忽略 alpha channel 。我尝试过:

GLubyte *pixels = new GLubyte[640*480*3];
glReadPixels(0, 0, 640,480, GL_RGB, GL_UNSIGNED_BYTE, pixels);

相反,这不起作用。我想这是因为 gl_FragColor 返回 4 个 channel ,也许我应该在此之前做点什么?实际上,由于我返回的图像(gl_FragColor)是灰度的,所以我做了类似的事情

float gray = 0.5 //or some other values
gl_FragColor = vec4(gray,gray,gray,1.0);

那么有没有什么有效的方法可以使用 glReadPixels 而不是使用前 4 个 channel 的方法?有什么建议吗?顺便说一句,这是 opengl es 2.0 代码。

最佳答案

OpenGL ES 2.0 spec表示有两种有效的调用形式:

glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

GLint format, type;
glGetIntegerv(IMPLEMENTATION_COLOR_READ_FORMAT, &format);
glGetIntegerv(IMPLEMENTATION_COLOR_READ_TYPE, &type);
glReadPixels(x, y, w, h, format, type, pixels);

formattype 的可能组合是(图片取自规范):

table

实现将决定您可以使用哪个。

但是,如果您创建适当格式的渲染表面,那么您将在此处获得的格式很可能就是这样。看看是否可以修改代码以获得 RGB 帧缓冲区(即 0 位用于 alpha channel )。或者您可能想为此目的创建一个离屏帧缓冲区对象?

关于glsl - gl_FragColor 和 glReadPixels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339274/

相关文章:

c - OpenGL glUniform1f 不更新顶点着色器

opengl-es - OpenGL ES 2.0 软件库

android - SurfaceTexture 大小,如何定义?

ios - 显示上面有 3D 对象的平铺 map

c++ - 调用函数后程序忽略所有内容

c++ - 如何从点画正方形?

opengl - 从深度缓冲区和任意 View 投影矩阵重建世界坐标

Java gl 着色器语法错误

java - gl_Normal 计算不正确

java - 使用 OpenGL ES 2.0 在 Android 中高效绘制许多纹理