我有一个应该加载着色器的函数:
- (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中终止字符串。
答案 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);
}
}