2012-03-24 3 views
2

화면을 덮는 2 차원 텍스처에서 비디오 프레임을 얻으려고합니다. 결국 프레임 버퍼를 사용해야합니다. 왜냐하면 결국 탁구 렌더링 기술을 사용하기를 원하기 때문입니다. 그러나 당분간 프레임 버퍼를 사용하여 화면에 렌더링하는 것만을 먼저 얻고 싶습니다.GLSL 프레임 버퍼를 사용한 오류 렌더링

이 내 설치 코드입니다 : 여기까지 모두 확인

// Texture setup 

int[] text = new int[1]; 
glGenTextures(1, text, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 512, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, null); 

// Frambuffer setup 

int[] fbo = new int[1]; 
glGenFramebuffers(1, fbo, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, text[0], 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

, 나는 작은 그것을 유지하기 위해 여기에 테스트 코드를 작성하지 않았지만, 프레임 버퍼가 제대로 만들어 졌는지 내가 확인 직후에, 그리고 모두 괜찮습니다. 나는 검은 색 화면을 얻을이 시점에서

// Use the GLSL program 

glUseProgram(programHandle); 

// Swap to my FBO 

glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glViewport(0, 0, 512, 512); 

// Pass the new image data to the program so the fragment shader processes it. 
// Using glTexSubImage2D to speed up 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glUniform1i(glGetUniformLocation(programHandle, "u_texture"), 0); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_LUMINANCE, GL_UNSIGNED_BYTE, NewImageData); 

// Draw the quad 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Swap back to the default screen frambuffer 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

및 로그에 나는 내가 glBindFramebuffer 호출 후 glDrawArrays을 퍼팅 시도 1286. GL_INVALID_FRAMEBUFFER_OPERATION를 볼 수 있습니다 내 렌더링 루프에서 지금

나는 다음에 무엇을 , 그러나 응용 프로그램이 충돌합니다. 의견이 있으십니까? 미리 감사드립니다.

+0

int 텍스트 [] = 새로운 int [1]; ??? int fbo = 새로운 int [1]; ??? C++에서 변수와 배열을 선언하는 방법을 배우는 것은 불쾌감을주지는 않지만 장면을 텍스처로 렌더링하는 방법을 배우기 전에 먼저해야 할 일입니다. – Robinson

+0

죄송합니다. 내 잘못은 여기에 붙여 넣기 위해 청소하는 동안 오타입니다. 반면에 자바로 작성되었습니다. 코드를 avobe로 업데이트했습니다. 누군가 내가 뭘 잘못하고 있는지 알기를 바랍니다. – PerracoLabs

+0

아. 그것은 자바입니다. 당신은 int 상태를 호출 할 수 = glCheckFramebufferStatus (GL_FRAMEBUFFER); (사용을 위해 버퍼를 바인딩 한 후) 리턴되는 것을보십시오. – Robinson

답변

2

루미 너스 텍스처는 렌더링 할 수 없으므로 FBO를 사용하여 렌더링 할 수 없습니다. 이 문제는 GL_ARB_texture_rg 확장으로 해결할 수 있습니다.이 확장은 렌더링 가능한 하나 및 두 개의 채널 텍스처 형식을 도입합니다.

+0

코드는 Android에서 실행되어야하므로 모든 휴대 전화 모델에 공통적이지 않을 수있는 확장 프로그램을 사용할 수 없습니다. 그래서 나는 전체 접근 방식을 재고해야한다고 생각합니다. – PerracoLabs

관련 문제