2017-04-21 38 views
-1

我有这应该加载着色器的函数:OpenGL着色加载失败在MacOS

- (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弃用了,但是在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',但这没有帮助。不知道如何为NULL目的C.

+0

你显然不能真正编译着色器之前检查'GL_COMPILE_STATUS'。 – Vallentin

+0

@Vallentin得到了glCompileShader(着色器);在错误的地方。我纠正了这一点。但仍然是同样的问题。 –

+0

@genpfault实际上是这个问题。对不起,不知道。当我在drawRect函数中使用openGL时,上下文没有设置。苹果文档提到了它,但不是它们描述使用NSOpenGLView的部分。我猜NSOpenGLView本身设置了当前的上下文,但是稍后一段时间。 –

回答

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