调用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
相关产品推荐
相关产品推荐

