2017-04-21 54 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); 
    } 
}