我正在开发一个代码,我用assimp加载一个3d模型,用3d坐标和法线填充,然后我想要将我的纹理检索到CPU。
我尝试使用"glReadPixels“来检索纹理,但是我的数据被夹在0 1之间,就像它们在这里中描述的那样。
我使用的纹理示例:
glGenTextures(1, &pos3d);
glBindTexture(GL_TEXTURE_2D, pos3d);
glViewport(0, 0, width, height);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + gpos3dLayout, GL_TEXTURE_2D, pos3d, 0);
glBindTexture(GL_TEXTURE_2D, 0);
然后我用这个检索:
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, pos3d);
glReadBuffer(GL_COLOR_ATTACHMENT0);
std::vector<GLfloat> positions3d(width * height * 4); // 4 because of RGBA * 1 float
glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &positions3d[0]);
正如我所说的,我的值似乎被限制在0到1之间。那么有什么方法可以禁用这个夹紧吗?
发布于 2019-04-24 13:32:36
数据被夹紧,因为附加到帧缓冲区的颜色平面上的纹理的内部格式是GL_RGBA
(与GL_RGBA8
相同)。这种格式是一种无符号规范化定点格式,为每个彩色通道提供8位,其中0表示0.0,所有8位集(255)代表1.0。
这导致在纹理的数据存储中数据的表示被夹紧。glReadPixels
从连接到帧缓冲区颜色平面的数据存储区读取数据。
在使用GL_RGBA16F
指定二维纹理图像时,将纹理的内部格式更改为浮点格式(例如glTexImage2D
)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
当从缓冲区读取像素时,它们可能被夹紧到0.0,1.0范围内。这取决于glClampColor
的设置。
见OpenGL 4.6API核心文件规范- 18.2.8最终转换,第535页
读取颜色夹紧由调用控制。
void ClampColor( enum target, enum clamp )
目标设置为CLAMP_READ_COLOR
。如果钳位为TRUE
,则启用读色夹紧;如果钳位为FALSE
,则禁用读色夹持。..。 对于浮点的RGBA颜色,如果类型为FLOAT
或HALF_FLOAT
,则每个组件被夹紧为0,如果启用读颜色夹紧,则为1。
注意,在OpenGL ES中,颜色在任何情况下都是夹紧的。
glGetTexImage
仅在桌面OpenGL中提供,不夹紧颜色。
https://stackoverflow.com/questions/55831002
复制相似问题