Objective c glCreateProgram()失败?

Objective c glCreateProgram()失败?,objective-c,xcode,opengl-es,glsl,shader,Objective C,Xcode,Opengl Es,Glsl,Shader,注: 仔细研究后,发现glCreateProgram()始终返回0。一旦我弄明白了,我会发布一个补丁。如果你们知道可能的原因,请留下评论^^ 上下文已正确创建 context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles2]; 谢谢 此文件正在正确加载。它保存为cl.vsh 它加载良好,但在编译阶段失败 这是cl.vsh中的代码 attribute vec4 position; attribute vec3 normal;

注:

仔细研究后,发现
glCreateProgram()
始终返回0。一旦我弄明白了,我会发布一个补丁。如果你们知道可能的原因,请留下评论^^

上下文已正确创建

context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles2];

谢谢


此文件正在正确加载。它保存为cl.vsh

它加载良好,但在编译阶段失败

这是cl.vsh中的代码

attribute vec4 position;
attribute vec3 normal;

uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat3 normalMatrix;

uniform float time;

varying vec3 eyespaceNormal;
varying vec4 eyespacePosition;
varying vec3 noiseVector;


void main()
{

    int i = 0;
//    vec3 translation = vec3(1.0, 1.0, 1.0) * time / 20.0;
//    noiseVector = position.xyz + translation;
//    
//    eyespaceNormal = normalMatrix * normal;
//    eyespacePosition = modelViewMatrix * position;
//    gl_Position = modelViewProjectionMatrix * position;
}
这是汇编部分
shaderString
是cl.vsh的精确代码

 GLint status;
    const GLchar *source;

    source = 
      (GLchar *)[shaderString UTF8String];
    if (!source)
    {
        NSLog(@"Failed to load vertex shader");
        return NO;
    }

    *shader = glCreateShader(type);
    glShaderSource(*shader, 1, &source, NULL);
    glCompileShader(*shader);

    glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);

    if (status != GL_TRUE)
    {
        GLint logLength;
        glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
        if (logLength > 0)
        {
            GLchar *log = (GLchar *)malloc(logLength);
            glGetShaderInfoLog(*shader, logLength, &logLength, log);
            NSLog(@"Shader compile log:\n%s", log);
            free(log);
        }
    }   
打印日志_


经过一些挖掘,我意识到我需要将我的上下文设置为当前上下文。FML。这就是问题所在

[EAGLContext setCurrentContext:context];

这个问题现在已经解决了。

经过一些挖掘,我意识到我需要将我的上下文设置为当前上下文。FML。这就是问题所在

[EAGLContext setCurrentContext:context];

问题现已解决。

我看到您调用了
glGetShaderInfoLog(…)
,您是否介意分享问题中的输出?完成。它是空的。。。。。请检查更新,它到底什么时候失败?(当你在调试器中检查
log
时?)我在尝试编译时没有看到它失败,如果你有编译问题,你应该从“Shader compile log”
NSLog
语句中看到一些东西。当我将它放入测试应用程序时,我确实看到它失败链接,但这仅仅是因为我没有使用相同的变量加入附带的片段着色器。如果您使用的是代码似乎来自的模板,您应该会看到链接失败的日志。但是为什么没有日志?我看到您调用了
glGetShaderInfoLog(…)
,您介意共享问题中的输出吗?完成。它是空的。。。。。请检查更新,它到底什么时候失败?(当你在调试器中检查
log
时?)我在尝试编译时没有看到它失败,如果你有编译问题,你应该从“Shader compile log”
NSLog
语句中看到一些东西。当我将它放入测试应用程序时,我确实看到它失败链接,但这仅仅是因为我没有使用相同的变量加入附带的片段着色器。如果您使用的是代码似乎来自的模板,则应该会看到链接失败的日志。但为什么没有日志?错误,如果要检测错误检测代码是否正确编写,这应该是一个很小的问题。您应该在每次调用后检查
glGetError(…)
的状态。您会发现,每个人都在生成
GL\u INVALID\u操作
,因为没有执行该操作的活动上下文。OpenGL API调用有时会失败而不返回状态代码,但它们会标记错误状态。因此,当您想确定调用是否成功时,测试返回值只是整个过程的一半。呃,如果要检测错误检测代码是否正确编写,这应该是一个微不足道的问题。您应该在每次调用后检查
glGetError(…)
的状态。您会发现,每个人都在生成
GL\u INVALID\u操作
,因为没有执行该操作的活动上下文。OpenGL API调用有时会失败而不返回状态代码,但它们会标记错误状态。因此,当您想要确定调用是否成功时,测试返回值只是整个过程的一半。