2012-10-22 34 views
6

我正在使用Xcode 4.5.1並在iOS6上測試iPhone5。Xcode中的幀捕獲失敗

我正在使用幀捕捉功能沒有問題,但突然它停止工作。 當我按下圖像採集按鈕時,看起來圖像被採集,手機切換到黑屏,只是突然切換回應用程序屏幕,應用程序繼續運行。我仍然可以調試和暫停應用程序,但是無法獲取幀捕獲。我在控制檯中也看不到任何錯誤。

停止工作的原因是這段代碼。這段代碼應該呈現給rendertexture,但rendertexture似乎是空白的。我想用幀捕獲功能,以找出什麼是錯的,但代碼本身不會讓我捕捉... :(

任何想法,爲什麼

// ------------- init function ----------------- 
// Create the framebuffer and bind it 
glGenFramebuffers(1, &g_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
//Create the destination texture, and attach it to the framebuffer’s color attachment point. 
glGenTextures(1, &g_texture); 
glBindTexture(GL_TEXTURE_2D, g_texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_texture, 0);  
//Test the framebuffer for completeness 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
} else { 
    NSLog(@"SkyPlugin initialized"); 
} 


// ----------------- on update ------------------ 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 
glGetIntegerv(GL_VIEWPORT, oldViewPort); 
// set the framebuffer and clear 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glViewport(0, 0, 32, 32); 
//glClearColor(0.9f, 0.1f, 0.1f, 1.0f); 
glDisable(GL_DEPTH_TEST); 
glClear(GL_COLOR_BUFFER_BIT); 
// Set shader 
glUseProgram(m_program); 
// do some glEnableVertexAttribArray 
// ... 
// texture setting 
glActiveTexture(GL_TEXTURE0); 
glUniform1i(m_uniform, 0); 
ResourceManager* resourceManager = ResourceManager::GetInstance(); 
glBindTexture(GL_TEXTURE_2D, m_texture[0]); 
// ----------- Draw ----------- 
// Draws a full-screen quad to copy textures 
static const vertexDataUV quad[] = { 
    {/*v:*/{-1.f,-1.f,0}, /*t:*/{0,0}}, 
    {/*v:*/{-1.f,1,0}, /*t:*/{0,1}}, 
    {/*v:*/{1,-1.f,0}, /*t:*/{1,0}}, 
    {/*v:*/{1,1,0}, /*t:*/{1,1}} 
}; 
static const GLubyte indeces[] = {0,2,1,3}; 
glVertexAttribPointer(m_posAttrib, 3, GL_FLOAT, 0, sizeof(vertexDataUV), &quad[0].vertex); 
glVertexAttribPointer(m_texCoordAttrib, 2, GL_FLOAT, 0, sizeof(vertexDataUV), &quad[0].uv); 
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indeces); 
// ------------ End 
// go back to the main framebuffer! 
glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
glViewport(oldViewPort[0], oldViewPort[1], oldViewPort[2], oldViewPort[3]); 
glEnable(GL_DEPTH_TEST); 
//glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 

編輯:(2012/10月/ 28)

我發現,爲什麼上面的代碼是不工作。我忘了綁定渲染緩衝器!下面工作的代碼,但仍當這個代碼是活躍的幀捕獲失敗...

On init,

//創建渲染緩衝區並綁定它 glGenRenderbuffers(1,& g_renderbuffer); glBindRenderbuffer(GL_RENDERBUFFER,g_renderbuffer); glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA8_OES,w,h);

// Create the framebuffer and bind it 
glGenFramebuffers(1, &g_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, 
          GL_COLOR_ATTACHMENT0, 
          GL_RENDERBUFFER, g_renderbuffer); 
//Create the destination texture, and attach it to the framebuffer’s color attachment point. 
glGenTextures(1, &g_texture); 
glBindTexture(GL_TEXTURE_2D, g_texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_texture, 0); 

上更新,

glGetIntegerv(GL_RENDERBUFFER_BINDING, &oldRBO); 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 
glGetIntegerv(GL_VIEWPORT, oldViewPort); 

// set the framebuffer and clear 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, g_framebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, g_renderbuffer); 
glViewport(0, 0, 32, 32); 

// ... draw stuff ... 

末更新,

// go back to the main framebuffer! 
glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
glBindRenderbuffer(GL_RENDERBUFFER, oldRBO); 
+1

我們有完全相同的問題。不知道是什麼原因:( – Split

+1

到目前爲止唯一的日誌是這樣的: ' 10/28/12 7:02:19.818 PM Xcode [5371]:[MT] DVTAssertions:Warning in/SourceCache/GPUDebuggeriOSSupport/GPUDebuggeriOSSupport-51.8/GPUiOSReplayController.m:127 詳細說明:回放器終止錯誤 對象: 方法:-_handleGuestAppStatusChangeNotification: 螺紋: {名稱=(空),NUM = 1} 請在http://bugreport.apple.com上提供一個錯誤,提供這個警告信息和你可以提供的任何有用信息。 ' – endavid

回答

2

看來這是Xcode中的一個bug。 的最新版本的Xcode 4.5.2讓我捕捉到框架:)

我捕捉幀後,我在這部分代碼得到一個錯誤:

// ... draw stuff ... 
glActiveTexture(GL_TEXTURE0); 
glUniform1i(MY_TEXTURE, 0); 

在glUniform1i我得到這個錯誤:「指定的操作對當前的OpenGL狀態無效」。

不知道爲什麼我得到這個錯誤(渲染它的工作),但我懷疑這個錯誤可能是原因,我沒能捕捉到在以前版本的Xcode的框架...

+0

錯誤的原因是我設置了着色器中未定義的統一(MY_TEXTURE)採樣器的名稱不同)。我應該再次嘗試使用Xcode 4.5.1而不會出現錯誤,並查看捕獲是否有效......但是誰又會使用舊版Xcode? ;) – endavid

0

我看到了非常相似的行爲,儘管它有點不穩定,但它似乎與內存使用有關。通常當它失敗時,重放應用程序似乎內存不足(當失敗時,我會在控制檯中看到內存警告)。

切換到固定更多內存的設備(iPad 3的iPad 3),但我也偶爾可以通過減少紋理內存使用量來繞過它 - 跳過設置我的所有紋理的頂部mipmap通常會騰出足夠的空間。