当我使用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];
为什么我不能再设置着色器?
答案 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)。