2011-12-02 18 views
0

在工作的時候使用glUseProgram設置prgram,然後通過glGetIntegerv(GL_CURRENT_PROGRAM, &pid)檢查當前的計劃,但pid回報0。所以我不能使用這個着色器。着色器已編譯並鏈接正常。glUseProgram不會在iOS中

代碼:

[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]; 

爲什麼不能重新設置着色器?

回答

3

您正在使用2個GL上下文,而shader1可能是在context1中編譯和鏈接的,所以這就是它的工作原理。您需要共享它(使用特定於平臺的API)才能在另一個上下文(如context2)中使用它,您不能直接使用它,而不必明確告訴API與另一個上下文共享它。

這就是爲什麼它不起作用。

另一種選擇是在兩種情況下編譯和鏈接着色器。

+0

在iOS中,我認爲只是使用EAGLContext * context2 = [[EAGLContext alloc] initWithAPI:context1.API sharegroup:context1.sharegroup]; ,,,兩個上下文將使用相同的共享組。我在第二次之前使用gluseprogram(0),並且可以成功呈現。我不知道爲什麼? – Alex

1

正如Matias所說,您很可能在與您嘗試使用的上下文不同的上下文中創建着色器。爲了解決這個問題,上下文2應該CONTEXT1的sharegroup創建:

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

與您共創shader1(與CONTEXT1作爲當前上下文)後,請務必切換到上下文2之前調用glFlush(),使上下文改變/創建的資源是同步的(即創建shader1)。