glUseProgram在iOS中不起作用

时间:2011-12-02 04:04:13

标签: objective-c ios opengl-es shader

当我使用glUseProgram设置prgram时,请按glGetIntegerv(GL_CURRENT_PROGRAM, &pid)检查当前程序,但pid返回0。所以我不能使用这个着色器。着色器已编译并链接正常。

代码:

[EAGLContext setCurrentContext:context1];
 glBindFramebuffer(GL_FRAMEBUFFER, Framebuffer1);

//there have many render option use shader1;
//and the shader1 is work normal.
glBindRenderbuffer(GL_RENDERBUFFER,Renderbuffer1);
[context1 presentRenderbuffer:GL_RENDERBUFFER];
glFlush();

[EAGLContext setCurrentContext:context2];
 glBindFramebuffer(GL_FRAMEBUFFER, Framebuffer2);

//than gluseprogram(shader1) , 
//check current shader return 0;
//but no glError
glBindRenderbuffer(GL_RENDERBUFFER,Renderbuffer2);
[context2 presentRenderbuffer:GL_RENDERBUFFER];

为什么我不能再设置着色器?

2 个答案:

答案 0 :(得分:3)

您正在使用2个GL上下文,并且shader1可能已在context1中编译和链接,因此这就是它的工作原理。你需要共享它(使用一些特定于平台的API)才能在另一个上下文中使用它(比如context2),你不能在没有明确地告诉API与另一个上下文共享的情况下使用它。

这就是为什么它不起作用。

另一个选择是在两个上下文中编译和链接着色器。

答案 1 :(得分:1)

正如Matias所说,你最有可能在一个单独的上下文中创建着色器,而不是你试图使用它的上下文。要修复它,应使用context1的sharegroup创建context2:

EAGLContext* context2 = [[EAGLContext alloc] initWithAPI:context1.API sharegroup:context1.sharegroup];

在创建shader1(context1是当前上下文)之后,确保在切换到context2之前调用glFlush(),以便上下文的已更改/创建的资源同步(即创建shader1)。