2012-10-22 6 views
6

विफल रहता है मैं एक्सकोड 4.5.1 का उपयोग कर रहा हूं और आईओएस 6 के साथ आईफोन 5 पर परीक्षण कर रहा हूं।एक्सकोड में फ़्रेम कैप्चर

मैं समस्या के बिना फ्रेम कैप्चर फ़ंक्शन का उपयोग कर रहा था, लेकिन अचानक यह काम करना बंद कर दिया। जब मैं फ्रेम कैप्चर बटन दबाता हूं, ऐसा लगता है कि फ्रेम कैप्चर किया गया है, और फोन एक रिक्त स्क्रीन पर स्विच करता है, केवल एप्लिकेशन स्क्रीन पर वापस स्विच करने के लिए, और एप्लिकेशन चल रहा रहता है। मैं अभी भी एप्लिकेशन को डीबग और रोक सकता हूं, लेकिन फ्रेम कैप्चर करने का कोई तरीका नहीं है। मुझे कंसोल में कोई भी त्रुटि दिखाई नहीं दे रही है।

कारण यह काम करना बंद कर दिया गया यह कोड कोड का टुकड़ा है। यह कोड एक रेंडरटेक्चर में कुछ प्रस्तुत करना है, लेकिन रेंडरटेक्चर खाली लगता है। मैं फ्रेम पर कब्जा समारोह का उपयोग करने के क्या गलत है पता लगाने के लिए चाहता था, लेकिन कोड में ही मुझे पर कब्जा नहीं दूँगा ... :(

किसी भी विचार क्यों

// ------------- 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/अक्टूबर/28)

मुझे पता चला क्यों उपरोक्त कोड काम नहीं कर रहा था। मैं बफर प्रस्तुत करना! काम करता है नीचे कोड एक बाध्य करने के लिए भूल गया, लेकिन अभी भी फ्रेम पर कब्जा विफल रहता है जब इस कोड सक्रिय है ...

इनिट पर,

// रेंडरबफर बनाएं और इसे glgenRenderbuffers (1, & g_renderbuffer) बांधें; glbindRenderbuffer (GL_RENDERBUFFER, g_renderbuffer); glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8_OES, डब्ल्यू, एच);

// 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: थ्रेड: {नाम = (शून्य), num = 1} कृपया इस चेतावनी संदेश और किसी भी उपयोगी जानकारी के साथ http://bugreport.apple.com पर एक बग फ़ाइल करें। ' – endavid

उत्तर

2

ऐसा लगता है यह Xcode का एक बग था।

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

glUniform1i मैं इस मिल पर: नवीनतम संस्करण, Xcode 4.5.2 मुझे फ्रेम :)

पर कब्जा करने के बाद मैं फ्रेम पर कब्जा, मैं कोड के इस हिस्से में एक त्रुटि प्राप्त करने देता है त्रुटि: "वर्तमान ओपनजीएल राज्य के लिए निर्दिष्ट ऑपरेशन अमान्य है"।

कोई विचार क्यों मैं इस त्रुटि मिलती है (यह काम कर रहा प्रतिपादन), लेकिन मुझे लगता है कि मैं क्यों Xcode के पिछले संस्करण में एक फ्रेम पर कब्जा करने में सक्षम नहीं था इस त्रुटि कारण हो सकता है ...

+0

त्रुटि का कारण यह है कि मैं एक वर्दी (MY_TEXTURE) को शेडर में परिभाषित नहीं कर रहा था (नमूने का नाम अलग था)। मुझे त्रुटि के बिना फिर से एक्सकोड 4.5.1 के साथ प्रयास करना चाहिए और देखें कि कैप्चर काम करता है ... लेकिन जो भी एक्सकोड के पुराने संस्करण का उपयोग कर रहा है? ;) – endavid

0

मैंने बहुत ही समान व्यवहार देखा है, और जब यह थोड़ा अनियमित था, यह स्मृति उपयोग से संबंधित प्रतीत होता था। आम तौर पर जब यह असफल हो जाता है, तो रीप्ले एप्लिकेशन मेमोरी से बाहर चल रहा था (जब यह विफल हुआ तो मुझे कंसोल में मेमोरी चेतावनी दिखाई देगी)।

अधिक मेमोरी वाले डिवाइस पर स्विच करना (आईपैड 3 से आईपैड 4), लेकिन मैं कभी-कभी बनावट बनावट की मात्रा को कम करके इसे चारों ओर काम करने में सक्षम था - मेरे सभी बनावट के लिए शीर्ष मिपमैप सेट करना आमतौर पर पर्याप्त मुक्त होगा।