OpenGL glTexImage2D内存问题

时间:2015-06-14 23:10:02

标签: c opengl

我正在加载立方体贴图来创建一个天空盒,一切都很好,天空盒使用正确的纹理应用程序正确渲染。

但是,我决定用valgrind检查我的程序安全性,Valgrind给出了这个错误:http://pastebin.com/seqmXjyx

sky.c中的第53行是:

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, texture.width, texture.height, 0, GL_BGR, GL_UNSIGNED_BYTE, texture.pixels);

protoype:
void glTexImage2D( GLenum target,
              GLint level,
              GLint internalformat,
              GLsizei width,
              GLsizei height,
              GLint border,
              GLenum format,
              GLenum type,
              const GLvoid *pixels )

纹理宽度和高度是无符号整数(1024x1024),像素采用bmp纹理格式。

它是正确解析的(正如我之前所说,一切都正确呈现,openGL没有返回错误,我只从valgrind得到4的无效写入)。

(每次加载纹理时都会出现此无效写入)

所以我读了这个男人,这让我更加困惑,这就是我从中得到的:

  

GL_INVALID_VALUE is generated if width or height is less than 0 or greater than 2 + GL_MAX_TEXTURE_SIZE, or if either cannot be represented as 2^k +2 (border) for some integer value of k.

glGetError()给我GL_NO_ERROR,当我发送1024 * 1024作为参数时,显然不是(2 ^ k + 2)

我还读到了border参数,这对我现在使用的openGL来说似乎没什么用处,但这可能是这个覆盖的链接吗?

最后,正如我所说,一切正常,但我肯定想知道这些残疾人的写作来自哪里。

完整项目:https://github.com/toss-dev/minetoss

1 个答案:

答案 0 :(得分:0)

你在引用哪个手册页?有多个手册页可用,并非所有手册都映射到相同的OpenGL版本。

无论如何,+ 2 (border)背后的想法是将2乘以border的值,这在你的情况为0.所以你的代码就好了。 border是最新GL版本不支持的功能,因此不会出现在最近的手册页中。

现在,回到你的问题。 valgrind错误来自GeForce GL驱动程序,因此除非您可以访问源代码,否则您不可能随时随地调查它(如果您愿意,可以尝试联系驱动程序维护人员......但可能很难得到任何答案的时间)。