gl_FragColor和glReadPixels
问题描述:
我现在还在读片段着色器像素和我有一些问题。 我知道gl_FragColor返回与vec4意义RGBA,4通道。 在那之后,我使用glReadPixels读取FBO,它在数据gl_FragColor和glReadPixels
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);
那么,有没有用的,而不是使用前4个通道的方法glReadPixels任何有效的方法?任何建议?顺便说一下,这是在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);
的可能组合format
和type
是(PIC从规格拍摄):
然后执行将决定哪些是可用的。
然而,很可能是,如果你创建一个适当的格式的渲染表面,那么这将是你获得这里的格式。看看你是否可以修改你的代码来获得一个RGB帧缓冲区(即alpha通道为0位)。或者,您可能想为此创建一个离屏帧缓冲区对象?
感谢您的回复!我一定会尽快尝试!但是,你能否给我更多关于屏外帧缓冲的想法或描述?我对图形有一点新意,所以我不熟悉术语。也许链接教程?再次感谢! – user2168
帧缓冲区对象(FBO)基本上是您自己创建的辅助渲染目标。它可能包含一个颜色缓冲区,深度缓冲区,alpha缓冲区或任何东西。然后您可以绘制它(而不是“屏幕”,即主帧缓冲区),并以某种方式使用结果,例如作为效果纹理,或者读取像素(在您的情况下)。 – Kos
http://www.songho.ca/opengl/gl_fbo.html看起来像一个很好的实用教程,其中包含示例代码(但对于OpenGL,它应该是+ - 在ES 2中是相同的)。在规范中也有一个阅读(早些时候联系在一起;章节4.4.3)。 – Kos