2014-07-11 2 views
2
내가 GPUImageTextureInput 및 GPUImageMovieWriter을 사용하고

,GPUImage 기록의 OpenGL ES 장면의 질감, ​​비디오

검은 색하지만 난 항상 검은 색 화면을 얻었다.

나는 무엇인가 놓치고 있습니까? 나는 이것에 일을 보냈다.

프레임 버퍼 및 텍스처 설정은 여기에 있습니다 :

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]]; 



[EAGLContext setCurrentContext:self.context]; 
    GLenum status; 

glGenFramebuffers(1, &newFrameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, newFrameBuffer); 




glGenTextures(1, &outputTexture); 
glBindTexture(GL_TEXTURE_2D, outputTexture); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 1136 , 0, GL_RGBA, 
      GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0); 

및 영화 작가 : 같은

textureInput = [[GPUImageTextureInput alloc] initWithTexture:outputTexture size:size]; 

NSURL *movieURL = [NSURL fileURLWithPath: 
          [NSString stringWithFormat:@"%@%f.mp4", NSTemporaryDirectory(), 
          [[NSDate date] timeIntervalSince1970]]]; 



movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640, 1136)]; 
movieWriter.encodingLiveVideo = YES; 


[textureInput addTarget:movieWriter]; 

double delayToStartRecording = 1.0; 
dispatch_time_t sstartTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC); 
dispatch_after(sstartTime, dispatch_get_main_queue(), ^(void){ 
    NSLog(@"Start recording"); 

    //videoCamera.audioEncodingTarget = movieWriter; 
    [movieWriter startRecording]; 

    started = YES; 

    //  NSError *error = nil; 
    //  if (![videoCamera.inputCamera lockForConfiguration:&error]) 
    //  { 
    //   NSLog(@"Error locking for configuration: %@", error); 
    //  } 
    //  [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; 
    //  [videoCamera.inputCamera unlockForConfiguration]; 

    double delayInSeconds = 20.0; 
    dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ 




     [movieWriter finishRecordingWithCompletionHandler:^{ 
      NSLog(@"Movie completed"); 
      finished = YES; 

     }]; 

     //   [videoCamera.inputCamera lockForConfiguration:nil]; 
     //   [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOff]; 
     //   [videoCamera.inputCamera unlockForConfiguration]; 
    }); 
}); 

와 drawInRect 검은

[(GLKView*)self.view bindDrawable]; 

glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glBindVertexArrayOES(_vertexArray); 

// Render the object with GLKit 
[self.effect prepareToDraw]; 

glDrawArrays(GL_TRIANGLES, 0, 36); 

// Render the object again with ES2 
glUseProgram(_program); 

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

glDrawArrays(GL_TRIANGLES, 0, 36); 

glFlush(); 


//[EAGLContext setCurrentContext:self.context]; 

glBindFramebuffer(GL_FRAMEBUFFER, newFrameBuffer); 
glViewport(0,0, 640,1138); 

glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glBindVertexArrayOES(_vertexArray); 

// Render the object with GLKit 
[self.effect prepareToDraw]; 

glDrawArrays(GL_TRIANGLES, 0, 36); 

// Render the object again with ES2 
glUseProgram(_program); 

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

glDrawArrays(GL_TRIANGLES, 0, 36); 

glFlush(); 

// some GPUImage code 
+0

검은 색 인 이유를 잘 모릅니다. 나는 당신이 ** glBindFramebuffer (GL_FRAMEBUFFER, 0) **을 놓치고 있다는 것을 알아 차릴 것이다. ** FBO가 여러 개이기 때문에 좋은 연습 인 ** drawInRect **의 끝에. 약간 틀린 것 - 당신의 drawInRect가 기하학을 두 번 드로잉하는 것처럼 보입니다. 보조 FBO가 있기 때문에 먼저 렌더링 할 수 있습니다. 그런 다음 모든 것을 단순한 쿼드 렌더링 텍스쳐로 렌더링하면 기본 FBO로 이동합니다. http://mickyd.wordpress.com/2012/05/20/creating-render-to-texture-secondary-framebuffer-objects-on-ios-using-opengl-es-2/ – MickyD

+0

방금 ​​렌더링하면 어떻게됩니까? 기하학 및 비디오 녹화의 지금 차례? – MickyD

+0

렌더링 도형이 괜찮습니다. 화면에서는 볼 수 있지만 녹화 비디오는 검은 색입니다. – notedit

답변

0

내 프레임 버퍼 출력/출력 질감이되었다 잘. 나는 Brad Larson의 CubeExample에 뒤따라 디버깅을하고 며칠 동안 많은 것을 시도했다.

는 최대한 빨리이 호출을 추가로 상황이 나타나고 시작 : 전화 AFTER

glBindTexture(GL_TEXTURE_2D, 0)

glTexImage2D에와 glFramebufferTexture2D

여기에 참조하는 예제 프로젝트입니다. https://github.com/BradLarson/GPUImage/tree/master/examples/iOS/CubeExample