2015-04-21 56 views
0

我的问题是,我无法读取存储在仅含有红色成分的纹理中的值。我的第一个实现导致缓冲区溢出。所以我读了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); 
+0

你可以显示你的'glGetTexImage()'调用吗?格式/类型参数尤其重要。 –

回答

0

第一个令人困惑的事情是,在NVIDIA执行包的价值紧密连接起来。

这正是应该发生的事情。当你真正与GL_RGGL_RGBGL_RGBA格式(和源纹理HASS元件少读回扩展到2,3或4的组件才有意义。如果你只是为GL_RED AKS你也只能得到GL_RED

[...]除了双组分质地并将其存储第二值不在alpha通道,但在绿色通道,这让也更有意义对我来说,但它的定义是正确的?

正确定义是规范中的参考页面,参考页面通常有很小的不准确或遗漏,不适用ortunately。在这种情况下,我认为这个参考文献已经过时了。描述与旧的和现在不推荐使用的GL_LUMINANCEGL_LUMINANCE_ALPHA格式相匹配,并非现代的GL_REDGL_RG

所以我问你:“什么是颜色格式?”

的彩色格式是一个用于颜色纹理,而相比之下,非彩色格式,如GL_DEPTH_COMPONENTGL_STENCIL_INDEX

关于您的问题GL_PACK_ALIGNMENT:GL的行为完全按照其意图行事。你有2x2纹理和GL_PACK_ALIGNMENT为4,这意味着数据将被填充在每行,因此从一行到下一行的距离将是4的倍数。因此,您将得到第一行紧紧包装,2填充字节,最后是第二行。