我正在开发一个OpenGL应用程序,并且在 Linux (x86_32和x86_64)下一切正常但在将应用程序移植到 Windows 期间我遇到了障碍。我的应用程序使用非常基本的 OpenGL 1.0 ,很棒的 glfw 2.7.6 和 libpng 1.5.7 。在移植整个程序之前,我尝试编写最简单的代码来测试这些库是否在Windows下正常运行,在我开始使用纹理之前,一切似乎都运行良好!
使用glTexImage2D(..)
我的程序使用纹理会出现访问冲突,并出现以下错误:
First-chance exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.
Unhandled exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.
我做了一些研究,found out可能是GPU驱动程序错误。遗憾的是,我有一台带有 AMD Radeon HD5650 的 Toshiba L650-1NU 笔记本电脑,但没有提供任何驱动程序,但供应商分发过时。给定帖子的作者建议使用glBindBuffer
,但由于我使用 OpenGL 1.0 ,我无法访问此方法。
对于如何在不使用新的OpenGL的情况下绕过此问题,您有什么想法吗?然而,如果这是The One Solution,我可以获得有关如何将 OpenGL 2.1 与 glfw 一起使用的教程或代码段吗?
这是我的代码片段,导致错误:
img = img_loadPNG(BACKGROUND);
if (img) {
printf("%p %d %d %d %d", img->p_ubaData, img->uiWidth, img->uiHeight, img->usiBpp, img->iGlFormat);
glGenTextures(1, &textures[0]);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->uiWidth, img->uiHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->p_ubaData); //SEGFAULT HERE ON WINDOWS!
//img_free(img); //it may cause errors on windows
} else printf("Error: loading texture '%s' failed!\n", BACKGROUND);
答案 0 :(得分:3)
您遇到的错误是因为传递给glTexImage2D的缓冲区比glTexImage2D尝试从参数中推断出的缓冲区要短。这是在Windows下崩溃但不是Linux崩溃,因为在Linux下,内存分配往往比你要求的要大一些,而在Windows下你会得到非常严格的约束。
PNG很可能读取为RGB。但是你告诉glTexImage2D你通过了GL_RGBA,这当然会访问越界。
我看到您收到的img
结构有一个元素iGlFormat
。我敢打赌,这将是传递给glTexImage2D的格式。所以试试这个:
glTexImage2D(
GL_TEXTURE_2D, 0,
img->iGlFormat, // This is not ideal, OpenGL will chose whatever suits
img->uiWidth, img->uiHeight, 0,
img->iGlFormat, GL_UNSIGNED_BYTE,
img->p_ubaData )