gl_FragColor和glReadPixels

时间:2011-12-01 09:47:28

标签: glsl opengl-es-2.0

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

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

这样可以正常工作,但确实存在速度问题。而不是这个,我想读取RGB,所以忽略alpha通道。我试过了:

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

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

这样的事情
float gray = 0.5 //or some other values
gl_FragColor = vec4(gray,gray,gray,1.0);

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

1 个答案:

答案 0 :(得分:4)

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帧缓冲区(即alpha通道的0位)。或者您可能想为此目的创建一个屏幕外的帧缓冲对象?