我仍在尝试从片段着色器读取像素,我有一些问题。 我知道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代码的。
答案 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);
format
和type
的可能组合(从规范中获取):
实施将决定哪些可供您使用。
但是,如果您创建适当格式的渲染表面,那么这将是您在此处获得的格式。看看你是否可以修改代码以获得RGB帧缓冲区(即alpha通道的0位)。或者您可能想为此目的创建一个屏幕外的帧缓冲对象?