OpenGL和SDL' #version需要和缺失'但是在调试中工作

时间:2014-12-17 15:21:22

标签: c++ macos opengl sdl

我对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...

N.B有一个片段着色器编译位看起来完全一样。第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中调试内存泄漏的任何提示可能会有所帮助,但无论如何都要感谢:)

1 个答案:

答案 0 :(得分:2)

一旦读取它们就会丢弃字符串,从而导致vSource引用已删除的内存(以及未定义的行为),而在需要std::string保持有效时将源保持为char*

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);