2012-10-22 26 views
6

Tôi đang sử dụng Xcode 4.5.1 và thử nghiệm trên iPhone5 với iOS6.Chụp khung hình trong Xcode không thành công

Tôi đã sử dụng chức năng chụp khung không có vấn đề, nhưng đột nhiên nó ngừng hoạt động. Khi tôi nhấn nút chụp khung, có vẻ như khung được chụp và điện thoại sẽ chuyển sang màn hình trống, chỉ đột nhiên chuyển về màn hình ứng dụng và ứng dụng tiếp tục chạy. Tôi vẫn có thể gỡ lỗi và tạm dừng ứng dụng, nhưng không có cách nào để lấy lại khung hình. Tôi không thấy bất kỳ lỗi nào trong bảng điều khiển.

Lý do nó ngừng hoạt động là đoạn mã này. Mã này được cho là để render một thứ gì đó cho một rendertexture, nhưng rendertexture có vẻ trống. Tôi muốn sử dụng chức năng chụp khung hình để tìm hiểu những gì sai, nhưng mã tự nó sẽ không cho phép tôi chụp ... :(

Bất cứ ý tưởng tại sao

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

Chỉnh sửa: (2012/Tháng Mười/28)

tôi phát hiện ra lý do tại sao các mã trên đã không được làm việc. tôi quên để ràng buộc một render đệm! các mã bên dưới công trình, nhưng vẫn chụp khung thất bại khi mã này đang hoạt động ...

Trên init,

// Tạo bộ dựng hình và liên kết nó 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); 

On cập nhật,

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 ... 

Kết thúc cập nhật,

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

Chúng tôi có chính xác cùng một vấn đề.Không biết nguyên nhân là gì :( – Split

+1

Nhật ký duy nhất tôi có thể nhận được cho đến thời điểm này là: ' 10/28/12 7: 02: 19.818 PM Xcode [5371]: [MT] DVTAssertions: Cảnh báo trong/SourceCache/GPUDebuggeriOSSupport/GPUDebuggeriOSSupport-51,8/GPUiOSReplayController.m: 127 chi tiết: replayer chấm dứt không đúng Object: Phương pháp: -_handleGuestAppStatusChangeNotification: Ðề tài: {name = (null), num = 1} Hãy nộp lỗi tại http://bugreport.apple.com với thông báo cảnh báo này và bất kỳ thông tin hữu ích nào mà bạn có thể cung cấp. ' – endavid

Trả lời

2

Có vẻ như đó là một lỗi của Xcode. Phiên bản mới nhất, Xcode 4.5.2 cho phép tôi chụp khung :)

Sau khi tôi nắm bắt được khung hình, tôi nhận được một lỗi trong phần này của mã:

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

Trên glUniform1i tôi có được điều này lỗi: "Thao tác được chỉ định không hợp lệ đối với trạng thái OpenGL hiện tại".

Không biết tại sao tôi nhận được lỗi này (làm cho nó làm việc), nhưng tôi nghi ngờ lỗi này có thể là lý do tại sao tôi đã không thể chụp một khung hình trong các phiên bản trước của Xcode ...

+0

Lý do lỗi là tôi đã đặt đồng phục (MY_TEXTURE) không được xác định trong trình đổ bóng (tên của bộ lấy mẫu khác nhau). Tôi nên thử với Xcode 4.5.1 một lần nữa mà không có lỗi và xem nếu chụp hoạt động ... nhưng ai sẽ sử dụng một phiên bản cũ của Xcode anyway? ;) – endavid

0

Tôi đã nhìn thấy hành vi rất giống nhau, và trong khi nó có một chút thất thường, nó dường như có liên quan đến việc sử dụng bộ nhớ. Thông thường khi nó không thành công, ứng dụng phát lại dường như hết bộ nhớ (tôi sẽ thấy cảnh báo bộ nhớ trong bảng điều khiển khi nó không thành công).

Chuyển sang thiết bị có nhiều bộ nhớ cố định (iPad 4 từ iPad 3), nhưng tôi cũng có thể làm việc xung quanh nó bằng cách giảm lượng bộ nhớ kết cấu được sử dụng - bỏ qua thiết lập mipmap trên cùng cho tất cả họa tiết của tôi thường sẽ giải phóng đủ.

Các vấn đề liên quan