use*_*168 5 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);
Run Code Online (Sandbox Code Playgroud)
这工作正常,但它确实有速度问题.而不是这个,我想读取RGB,所以忽略alpha通道.我试过了:
GLubyte *pixels = new GLubyte[640*480*3];
glReadPixels(0, 0, 640,480, GL_RGB, GL_UNSIGNED_BYTE, pixels);
Run Code Online (Sandbox Code Playgroud)
相反,这不起作用.我想这是因为gl_FragColor返回4个频道,也许我应该在此之前做点什么?实际上,由于我的返回图像(gl_FragColor)是灰度的,我做了类似的事情
float gray = 0.5 //or some other values
gl_FragColor = vec4(gray,gray,gray,1.0);
Run Code Online (Sandbox Code Playgroud)
那么有没有有效的方法来使用glReadPixels而不是使用前4通道方法?有什么建议吗?顺便说一下,这是关于opengl es 2.0的代码.
OpenGL ES 2.0 规范规定有两种有效的调用形式:
glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
Run Code Online (Sandbox Code Playgroud)
或者
GLint format, type;
glGetIntegerv(IMPLEMENTATION_COLOR_READ_FORMAT, &format);
glGetIntegerv(IMPLEMENTATION_COLOR_READ_TYPE, &type);
glReadPixels(x, y, w, h, format, type, pixels);
Run Code Online (Sandbox Code Playgroud)
format和的可能组合type是(图片取自规范):

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