加载纹理触发访问违规错误,请求排查原因
问题排查与修复方案
核心问题1:纹理格式不匹配导致内存越界
你的代码强制用GL_RGBA作为纹理的内部格式和像素格式,但实际加载的noise.jpg大概率是**3通道(RGB)**图片。当stbi_load返回3通道数据时,OpenGL用GL_RGBA解析会读取超出数组范围的内存,直接触发访问违规。
修复方式:根据实际加载的通道数动态设置格式:
unsigned char *height_map = stbi_load("textures/noise.jpg", &width, &height, &nr_channels, 0); if (height_map) { GLenum format; if (nr_channels == 1) format = GL_RED; else if (nr_channels == 3) format = GL_RGB; else if (nr_channels == 4) format = GL_RGBA; glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, height_map); glGenerateMipmap(GL_TEXTURE_2D); set_int(shader_program, "height_map", 0); printf("Loaded a height map that's %i in width and %i in height", width, height); stbi_image_free(height_map); // 移到if块内,避免空指针操作 } else { printf("Failed to load texture"); }
核心问题2:OpenGL上下文未正确初始化
如果这段代码在OpenGL上下文创建绑定前执行(比如调用glfwMakeContextCurrent之前),所有GL函数调用都会触发非法内存访问。确保代码是在上下文绑定完成后执行的。
额外排查点
- 检查图片路径:确认
textures/noise.jpg的相对路径是否正确,程序运行时的工作目录是否和预期一致。 - 测试图片尺寸:部分旧版OpenGL驱动对非2的幂次尺寸的纹理支持有问题,可以先用2^n尺寸的图片(比如256x256、512x512)测试。
- 检查
set_int函数:确认该函数内部没有非法内存操作,比如是否正确绑定了目标着色器程序。
内容的提问来源于stack exchange,提问作者Chillzy
相关产品推荐
相关产品推荐

