我有这应该加载着色器的函数: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本身设置了当前的上下文,但是稍后一段时间。 –