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

调用glShaderSource时程序崩溃,请求排查问题原因

着色器加载代码崩溃的原因及修复方案

你的崩溃问题直接出在glShaderSource的参数传递错误上,我们来一步步拆解:

核心错误点

看你代码里的这一行:

glShaderSource(shader, 1, (const GLchar* const *)source.c_str(), nullptr);

glShaderSource的第三个参数要求是**const GLchar* const*类型**——简单说,这是一个指向字符串指针数组的指针(支持传入多个字符串片段拼接成一个着色器源码)。

而你这里把source.c_str()返回的const char*(字符串首地址)强制转换成了const GLchar* const*,这相当于告诉OpenGL:“去这个地址读取一个指针值,作为着色器源码的起始地址”。但实际上这个地址是字符串的第一个字符,不是指针数组的地址,OpenGL会尝试读取非法内存,直接导致程序崩溃。

修复方法

你只需要传递单个字符串指针的地址即可,有两种常见写法:

写法一:用临时变量存储指针

std::string source;
// ... 读取文件到source的代码不变 ...

const GLchar* shaderSource = source.c_str(); // 先获取字符串指针
glShaderSource(shader, 1, &shaderSource, nullptr); // 传递指针的地址
glCompileShader(shader);

写法二:用数组包装

std::string source;
// ... 读取文件到source的代码不变 ...

const GLchar* shaderSources[] = { source.c_str() };
glShaderSource(shader, 1, shaderSources, nullptr); // 直接传递数组名(数组名本身就是指针)
glCompileShader(shader);

额外调试建议

为了避免后续的着色器问题,建议在编译后检查编译状态,打印错误日志:

GLint compileStatus;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
if (!compileStatus) {
    GLchar infoLog[512];
    glGetShaderInfoLog(shader, 512, nullptr, infoLog);
    std::cerr << "着色器编译失败:" << infoLog << std::endl;
}

内容的提问来源于stack exchange,提问作者user9983006

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:12:38