You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载纹理触发访问违规错误,请求排查原因

问题排查与修复方案

核心问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:01:27