OpenGL 和 SDL '#version required and missing',但正在调试中工作
OpenGL and SDL '#version required and missing' but working in debug
我对C++相当菜鸟,所以现在进入这种事情可能还为时过早,但无论如何。我一直在努力在OpenGL和SDL中设置一个简单的三角形,但是我已经发生了一些奇怪的事情。第一件事是,当我编译它时,我得到三个错误之一:
Line 194: ERROR: Compiled vertex shader was corrupt.
Line 156: ERROR: 0:1: '' : #version required and missing. ERROR: 0:1: '<' : syntax error syntax error
Line 126: ERROR: 0:1: '' : #version required and missing.
ERROR: 0:1: 'lour' : syntax error syntax error
就像字面意思一样,我只是反复点击构建按钮,它是否显示一条或另一条消息似乎完全随机。好吧,这很奇怪,但更奇怪的是,当我在调试模式下运行它时(即我放置一个断点并逐步完成所有内容(,它完美运行,没有明显的原因。
所以,我得出的结论是,我在记忆方面做了一些愚蠢的事情,但无论如何,这里是相关的代码(询问您是否想查看更多(:
读取文件功能
std::string readFile(std::string name) {
std::ifstream t1(name.c_str());
if (t1.fail()) {
std::cout << "Error loading stream" << "n";
}
std::stringstream buffer;
buffer << t1.rdbuf();
std::string src = buffer.str();
std::cout << src << std::endl;
return src;
}
编译着色器
const char *vSource = readFile("vertexShader.gl").c_str();
// Read fragment shader
const char *fSource = readFile("fragmentShader.gl").c_str();
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vSource, NULL);
glCompileShader(vs);
GLint isCompiled = 0;
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE) { // ... Error stuff here...
注意:有一个片段着色器编译位,看起来完全相同。第 126 行和第 156 行分别位于顶点和片段着色器的错误填充部分。
链接着色器
shader_programme = glCreateProgram();
glAttachShader(shader_programme, vs);
glAttachShader(shader_programme, fs);
glLinkProgram(shader_programme);
GLint isLinked = 0;
glGetProgramiv(shader_programme, GL_LINK_STATUS, (int *)&isLinked);
if(isLinked == GL_FALSE) { // ... Error stuff ... }
glDetachShader(shader_programme, vs);
glDetachShader(shader_programme, fs);
如果需要,您可以看到着色器,但它们可以工作(如在片段着色器中在调试模式下显示正确的颜色(,所以我不认为它们是问题所在。
我在OSX上使用SDL2,OpenGL v3.2,GLSL v1.50和Xcode 4(是的,如果你明白我的意思,我做了文本文件的事情(。
很抱歉发布了很多代码 - 如果有人有任何关于如何在 Xcode 中调试内存泄漏的提示可能会有所帮助,但无论如何谢谢:)
一旦
读取字符串,就会丢弃字符串,导致 vSource 引用已删除的内存(和未定义的行为(,而是在需要char*
保持有效时将源保持为std::string
:
std::string vSource = readFile("vertexShader.gl");
char* vSourcecharp = vSource.c_str();
// Read fragment shader
std::string fSource = readFile("fragmentShader.gl");
char* fSourcecharp = fSource.c_str();
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vSourcecharp, NULL);
glCompileShader(vs);
相关文章:
- Visual Studio 调试优化如何工作?
- 添加新行时工作代码引发异常.调试技巧?
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- 在调试配置中编译工作正常,但发布会给出链接错误
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- Mongodb Cxx 驱动程序测试在发布版本中崩溃 [ 在调试中工作正常]
- 函数无法正常工作,调试器没有帮助
- Android Studio 调试原生代码 lldb 服务器工作无穷大
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- Qt curl.exe在调试/发布中工作,但不在部署中工作
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用
- 为什么在发布模式下无法访问 for 循环,但在调试中它工作正常
- CLION 调试器在执行一个步骤后停止工作
- Python在调试模式下以C 工作,但在EXE文件中不工作
- 该代码在调试模式下工作,但在发布模式C 中不起作用
- 在发行模式下开放的软崩溃(调试工作正常)
- 台阶调试工作正常,但是在使用_tprintf时,调试而无需踩踏会导致奇怪的错误
- VS 2012 更改默认调试"工作目录"
- Visual Studio.如何构建DLL(在命令行中),通过附加到进程来调试工作