2012-10-22 12 views
6

私はXcode 4.5.1を使用しており、iOS6でiPhone5でテストしています。Xcodeでのフレームキャプチャに失敗しました

私は問題なくフレームキャプチャ機能を使用していましたが、突然停止しました。 フレームキャプチャボタンを押すと、フレームがキャプチャされたように見え、電話が空白の画面に切り替わり、突然アプリケーション画面に戻り、アプリケーションが実行を継続します。私はまだアプリケーションをデバッグし、一時停止することができますが、フレームを取得する方法はありません。コンソールにもエラーは表示されません。

これが機能しなくなった理由は、このコードです。このコードは何かをレンダーテクスチャにレンダリングするはずですが、レンダリングテクスチャは空白のようです。私が間違っているものを見つけるために、フレームキャプチャ機能を使用していたが、それ自体は私がキャプチャさせませんコード... :(

任意のアイデアなぜ

// ------------- 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)

上記のコードが動作しなかった理由私は、レンダリングバッファをバインドするのを忘れていました。見つけた!以下のコードは動作しますが、このコードがアクティブであるときに静止フレームキャプチャが失敗した...

開始時、

//レンダーバッファを作成してバインドします。 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] DVTAssertions:/ SourceCache/GPUDebuggeriOSSupport/GPUDebuggeriOSSupport-51.8/GPUiOSReplayController.m:127 詳細:replayer終了誤っ オブジェクト 方法:-_handleGuestAppStatusChangeNotification: スレッド {名前=(NULL)、NUM = 1} ください ' – endavid

答えて

2

Xcodeののバグだったようです。

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

私はこれを取得glUniform1iオン: 最新バージョンでは、Xcodeの4.5.2は、私は、フレームをキャプチャした後、私は、私は、コードのこの部分でエラーを取得するフレーム:)

をキャプチャすることができますエラー: "指定された操作は、現在のOpenGL状態に対して無効です"。

私は(それが働いているレンダリング)が、私は、私はXcodeの以前のバージョンでのフレームをキャプチャすることができませんでした、なぜこのエラーが理由かもしれ疑うこのエラーを取得する理由はありませんアイデア...

+0

エラーの原因は、シェーダで定義されていないユニフォーム(MY_TEXTURE)を設定していたためです。サンプラーの名前は異なっていた)。とにかく、Xcode 4.5.1をエラーなく再試行して、キャプチャが動作するかどうかを確認する必要がありますが、誰がXcodeの古いバージョンを使用していますか? ;) – endavid

0

私は非常に似たような動作を見てきましたが、それは少し不安定でしたが、メモリ使用量に関連しているようでした。通常、失敗したときには、再生アプリケーションのメモリが不足しているように見えます(失敗したときにコンソールにメモリ警告が表示されます)。

メモリを増やしたデバイスに切り替えると(iPad 3からiPad 4)、テクスチャメモリの使用量を減らして時折回避できました - すべてのテクスチャのトップミップマップを設定しないでください通常は十分に解放されます。

関連する問題