我有這應該加載着色器的函數: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.
你顯然不能真正編譯着色器之前檢查'GL_COMPILE_STATUS'。 – Vallentin
@Vallentin得到了glCompileShader(着色器);在錯誤的地方。我糾正了這一點。但仍然是同樣的問題。 –
@genpfault實際上是這個問題。對不起,不知道。當我在drawRect函數中使用openGL時,上下文沒有設置。蘋果文檔提到了它,但不是它們描述使用NSOpenGLView的部分。我猜NSOpenGLView本身設置了當前的上下文,但是稍後一段時間。 –