GLSL编译失败,没有错误日志

GLSL fails to compile, no error log

本文关键字:有错误 日志 编译 失败 GLSL      更新时间:2023-10-16

我正尝试将着色器与OpenGL一起使用,但似乎无法编译着色器。更令人沮丧的是,错误日志似乎也是空的。我在这个网站上进行了广泛的搜索,查看了许多不同的教程,但似乎没有解释它失败的原因。我甚至买了一本关于着色器的书,但它没有考虑到日志文件的消失。

我的感觉是,我链接着色器源的方式一定有错误。

//Create shader
GLuint vertObject;
vertObject = glCreateShader(GL_VERTEX_SHADER);
//Stream
ifstream vertfile;
//Try for open - vertex
try
{
    //Open
    vertfile.open(vertex.c_str());
    if(!vertfile)
    { 
        // file couldn't be opened
        cout << "Open " << vertex << " failed.";
    }
    else
    {
        getline(vertfile, verttext, '');
        //Test file read worked
        cout << verttext;
    }
    //Close
    vertfile.close();
}
catch(std::ifstream::failure e)
{
    cout << "Failed to open" << vertfile;
}

//Link source
GLint const shader_length = verttext.size();
GLchar const *shader_source = verttext.c_str();
glShaderSource(vertObject, 1, &shader_source, &shader_length);
//Compile
glCompileShader(vertObject);
//Check for compilation result
GLint isCompiled = 0;
glGetShaderiv(vertObject, GL_COMPILE_STATUS, &isCompiled);
if (!isCompiled)
{
    //Did not compile, why?
    std::cout << "The shader could not be compiledn" << std::endl;
    char errorlog[500] = {''};
    glGetShaderInfoLog(vertObject, 500, 0, errorlog);
    string failed(errorlog);
    printf("Log size is %d", failed.size());
}
printf("Compiled state = %d", isCompiled);

着色器代码尽可能的琐碎。

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

我无法编译我的片段或顶点着色器。如果我能显示错误日志,那么至少我可以开始错误检查我自己的工作。不过,就目前而言,我甚至无法了解错误。

在这种情况下,glCompile在没有日志的情况下失败的原因似乎是因为我试图在OpenGL上下文初始化之前执行此操作(glutCreateWindow等)。

如果将来有其他人遇到这个问题,请尝试在创建任何GLSL对象之前获取您的版本。

  printf("OpenGL version is (%s)n", glGetString(GL_VERSION));

如果得到"OpenGL版本为(null)",则没有有效的上下文来创建着色器。找到创建上下文的位置,并确保随后创建着色器。