MacOS上的OpenGL着色器加载失败

时间:2017-04-21 18:55:14

标签: xcode macos opengl shader

我有一个应该加载着色器的函数:

- (GLuint)compileShaderOfType:(GLenum)type file:(NSString *)file
{
    GLuint shader;
    GLint success;
    GLchar infoLog[512];

    const GLchar *shaderText = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSASCIIStringEncoding error:nil] cStringUsingEncoding:NSASCIIStringEncoding];

    if (nil == shaderText)
    {
        [NSException raise:kFailedToInitialiseGLException format:@"Failed to read shader file %@", file];
    }

    shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(shader, 1, &shaderText, NULL);
    // Compile shader
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if(!success)
    {
        glGetShaderInfoLog(shader, 512, NULL, infoLog);
        NSLog(@"Shader source loading failed with error:\n%s", infoLog);
    }

    return shader;
}

运行代码的结果会产生错误:"着色器源加载失败,错误:"。 infoLog是空的。 shader等于零。但是着色器文本已成功加载。我正在尝试遵循我认为当前版本的OpenGL已弃用的Apple开发人员教程,但在MacOS和OpenGL(https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_shaders/opengl_shaders.html)上没有其他更好的东西。也请遵循本教程:https://learnopengl.com/#!Getting-started/Shaders。运行最新版本的MacOS和XCode,所以我假设我使用的是最新版本的OpenGL。为什么glShaderSource离开shader不受影响? 我的猜测:字符串不是空终止。我添加了' \ 0'到文件的末尾,但这没有帮助。不确定如何在Objective C中终止字符串。

1 个答案:

答案 0 :(得分:0)

获取编译错误信息的更好方法是:

glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if ( success == GL_FALSE )
{
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &success);
    if ( success > 0 )
    {
        int nChars = 0;
        glGetShaderInfoLog(shader, 512, &nChars, infoLog);
        NSLog(@"Shader source loading failed with error:\n%s", infoLog);
    }
}