我的问题是,我无法读取存储在仅含有红色成分的纹理中的值。我的第一个实现导致缓冲区溢出。所以我读了openGL参考,它说:用GetTextureImage读取仅含红色成分的纹理数据的openGL
如果选定的纹理图像不包含四个组件,则应用以下映射。单组分纹理被视为RGBA缓冲区,红色设置为单分量值,绿色设置为0,蓝色设置为0,alpha设置为1.双组分纹理被视为RGBA缓冲区,红色设置为该值零部件,Alpha设置为组件1的值,绿色和蓝色设置为0.最后,三组件纹理被视为RGBA缓冲区,红色设置为零,绿色设置为组件1,蓝色设置为组件2 ,alpha设置为1.
第一个令人困惑的事情是,nvidia实现将数值紧密地包装在一起。如果我有四个一个字节值,我只需要四个字节的空间,而不是16. 因此,我读了openGL specification,它在表格8.18中的第236页告诉我相同,除了双组分纹理存储第二个值不在alpha频道,但是在绿色频道中,这对我来说也更有意义。但是哪个定义是正确的?
它还说:
如果格式是一种颜色格式,那么该组分中的R,G,B和A根据表8.18 [...]
分配 所以我问你:“什么是彩色格式?”和“如果格式不是颜色格式,我的纹理数据是否紧密”? 我的质地是这样定义的: 类型:GL_UNSIGNED_BYTE 格式:GL_RED internalformat:GL_R8
另一件事是,当我的纹理有一个大小的两倍两个像素的前两个值都被保存在头两字节,但我的缓冲区的第六和第六个字节中的另外两个值。它们之间的两个字节是填充。所以我得到了“GL_PACK_ALIGNMENT”状态,它表示四个字节。怎么可能?
的GetTexImage电话:
std::vector<GLubyte> values(TEXTURERESOLUTION * TEXTURERESOLUTION);
GLvoid *data = &values[0];//values are being passed through a function which does that
glBindTexture(GL_TEXTURE_2D, TEXTUREINDEX);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D, 0);
你可以显示你的'glGetTexImage()'调用吗?格式/类型参数尤其重要。 –