2011-02-23 6 views
1

문서를 보면 BGRA를 텍스처의 내부 형식으로 사용할 수 있어야합니다. 나는 BGRA 데이터로 텍스쳐를 공급하고있다. (glRenderBufferStorage에 GL_RGBA8_OES를 사용하면 BGRA가 허용되지 않는다.) 그러나, 다음은 작동하지 않습니다iPhone의 BGRA glTexImage2D 및 glReadPixels

glTexImage2D(GL_TEXTURE_2D, 0, **GL_BGRA**, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, GL_BGRA, GL_UNSIGNED_BYTE,buffer, 0); 

를이 나에게 검은 색 프레임 제공하는 동안 :

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_BGRA**, GL_UNSIGNED_BYTE,buffer, 0); 

을 그리고이 작업을 수행하지만, 블루스/붉은 색이 반전 (I는 텍스처에 BGRA 데이터를 제공) :

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_RGBA**, GL_UNSIGNED_BYTE,buffer, 0); 

... 전체적으로 BGRA를 사용할 수없는 이유는 무엇입니까? 나는 glRenderbufferStorage가 BGRA 포맷을 받아들이지 않는 것 같아서 ... 정말 혼란 스럽습니다. BGRA는 내 데이터가있는 유일한 형식으로, 아이폰의 카메라에서 나온 것입니다.

답변

5

세 번째 매개 변수 glTexImage2D()은 텍스처의 픽셀 순서가 아니라 텍스처의 색상 구성 요소 수입니다. 여기서 GL_RGBA을 사용하고 싶습니다. 그렇지 않으면 작동하지 않습니다.

iOS 기기의 glReadPixels()은 (으)로 GL_BGRA이 (가) 지원하지 않습니다. BGRA 형식의 텍스처에 픽셀 데이터를 제공하는 것은 Apple에서 비디오 이미지 프레임을 처리 할 때 권장되지만 RGBA 형식으로 다시 읽은 다음 디스크에 인코딩하는 것이 좋습니다. 다른 곳에서 설명한 것처럼 말입니다.

BGRA에서 카메라 비디오 프레임을 가져 와서 텍스처로 보내고, 쉐이더를 사용하여 처리 한 다음 결과 픽셀을 다시 읽는 샘플 프로젝트를 보려면 here을 빌드 한 것을 확인하십시오.

+0

감사합니다. 그리고 그게 제가 해왔 던 것입니다. 문제는 화면에 표시 할 때 반전 된 것입니다. 나는 방금 마지막 쉐이더에서 화면을 보았고 그 효과를 보았습니다. 내 프레임 속도가 이미 고생하고 있으므로 추가 패스는 피하기 만했습니다. :) – akaru

0

OpenGL ES2를 직접 살펴보면 iOS에서 BEGA little endian 기본 형식으로 작동한다는 것을 알 수 있습니다. 여기서 "픽셀"은 CGBitmapContextCreate()에서 가져 오거나 CGImageRef에서 이미지 데이터를 가져 오는 32 비트 BGRA 버퍼를 가리 킵니다.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); 

here의 경우 apple ext를 참조하십시오. 이 호의 좋은 토론 here