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); 

的可能组合formattype是(PIC从规格拍摄):

table

然后执行将决定哪些是可用的。

然而,很可能是,如果你创建一个适当的格式的渲染表面,那么这将是你获得这里的格式。看看你是否可以修改你的代码来获得一个RGB帧缓冲区(即alpha通道为0位)。或者,您可能想为此创建一个离屏帧缓冲区对象?

+0

感谢您的回复!我一定会尽快尝试!但是,你能否给我更多关于屏外帧缓冲的想法或描述?我对图形有一点新意,所以我不熟悉术语。也许链接教程?再次感谢! – user2168

+1

帧缓冲区对象(FBO)基本上是您自己创建的辅助渲染目标。它可能包含一个颜色缓冲区,深度缓冲区,alpha缓冲区或任何东西。然后您可以绘制它(而不是“屏幕”,即主帧缓冲区),并以某种方式使用结果,例如作为效果纹理,或者读取像素(在您的情况下)。 – Kos

+1

http://www.songho.ca/opengl/gl_fbo.html看起来像一个很好的实用教程,其中包含示例代码(但对于OpenGL,它应该是+ - 在ES 2中是相同的)。在规范中也有一个阅读(早些时候联系在一起;章节4.4.3)。 – Kos