2012-08-31 2 views
1

OpenGL의 기본 개념을 이해하려고합니다. 일주일 만에 아직 멀었습니다. 내가 glsl에 있으면, 나는 무엇을해야하는지에 관해 안다. 그러나 나는 거기에 도착하는 것이 교묘 한 작은 조각 인 것을 안다.OpenGL ES 쉐이더를 사용하여 비디오 위에 이미지 오버레이

현재 조작하고 표시하는 비디오 픽셀을 전달할 수 있습니다. 그런 다음 정지 이미지를 오버레이로 추가하려고했습니다. 이것은 내가 잃어버린 곳입니다. 최종 목표는 내 비디오와 스틸 이미지의 픽셀 데이터로 동일한 조각 셰이더에서 끝내는 것입니다. 이것은 두 개의 텍스처가 필요하고 두 개의 픽셀 버퍼를 전달해야 함을 의미합니다. I는 현재 다음과 같이 비디오 화소를 통과하고 :

glGenTextures(1, &textures[0]); 

//target, texture 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
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, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 

I는 다음 화상으로부터 제 2 버퍼 텍스처 [1]에이 프로세스를 반복 할 것인가? 그렇다면 GL_TEXTURE0와 GL_TEXTURE1을 바인딩합니까? ... 내 쉐이더가 이렇게 생겼을 까?

uniform sampler2D videoData; 
uniform sampler2D imageData; 

나는 쉐이더에서 오전하면? 아무리 노력해도 이미지와 비디오가 항상 양쪽 모두에서 비디오 데이터가되는 것처럼 보입니다.

많은 질문이 여기에 통합되어 죄송합니다. 많은 가정을 지우고 계속 진행하고 싶습니다. 질문을 명확히하기 위해 설명 된 프로세스에서 스틸 이미지의 픽셀을 추가하려면 어떻게해야합니까? (이해하기 쉬운 "샘플 코드 또는 힌트의 모든 유형"을 이해하기 쉽습니다).

답변

2

에서 보면 glActiveTextureARB 를 사용하여 적이에서 멀티 필요? 내 오픈 소스 GPUImage 프레임 워크 내에서이 모든 것을 가지고 있고, 다음과 같은 코드를 사용하여 수행 할 수있는 이미지 당기는, 비디오 카메라 소스를 설정 및 비디오에 해당 이미지를 오버레이 :이 모든

videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; 
filter = [[GPUImageOverlayBlendFilter alloc] init]; 
[videoCamera addTarget:filter]; 
inputImage = [UIImage imageNamed:@"WID-small.jpg"]; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 
[sourcePicture processImage];    
[sourcePicture addTarget:filter]; 
[filter addTarget:filterView]; 
[videoCamera startCameraCapture]; 

는 뒤에서 OpenGL ES 2.0을 사용하여 비디오 프레임과 스틸 이미지에 조각 쉐이더를 적용하며 iOS에서 알고있는 것보다 훨씬 빠릅니다. 이미지를 지원하는 장치의 경우 이미지 및 비디오 프레임 업로드 프로세스의 속도를 높이기 위해 몇 가지 추가 최적화를 사용하도록 조정했습니다.

여기서 구체적인 질문에 대답하려면 예, 거기에 표시되는 것처럼 두 가지 질감 유니폼을 만듭니다. 링크 된 셰이더 프로그램을 사용하기 전에 각 셰이더 식별자를 가져와야합니다. 당신의 코드에서 다음과 유사한 코드를 사용하여 유니폼에 그 텍스처 유닛의 값을 두 개의 서로 다른 텍스처 유닛에 두 개의 텍스처를 결합하고 할당해야 할 것 :

glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, sourceTexture); 
glUniform1i(filterInputTextureUniform, 2); 

glActiveTexture(GL_TEXTURE3); 
glBindTexture(GL_TEXTURE_2D, filterSourceTexture2);     
glUniform1i(filterInputTextureUniform2, 3); 

일반적인 실수를 저 I 사람들이 보게 된 것은 텍스처가 바인딩 된 텍스처 단위 대신에 glUniform1i()에있는 텍스처 이름을 사용하는 것입니다.

+0

설명해 주셔서 감사합니다, Brad. 여러분의 경험을 공유하기 위해 노력한 모든 노력에 감사드립니다. 나는 여기에 당신의 다른 답변을 많이 읽었으며 이전 예제에서 많은 것을 얻었습니다. 나는 당신의 오픈 소스 프레임 워크 (iPhone에서 OpenGL을 할 때 놓치기 힘들다)를 알고있다. 아마도 나는 그것을 미래에 사용 하겠지만, 지금은 그것을 배우려하고있다. 나는이 대답을 받아 들일 것이고 내일까지 계속 될 것이다. – BlueVoodoo

+0

@BluVoodoo - 그 프레임 워크를 그 자체로 참조로 만들려고 했으므로 배운 내용을 통합했습니다.이 문제를 해결하려고한다면 샘플 코드를 작성하는 것이 좋지 않습니다. 당신이 묘사 한 바를 토대로, 하나의 균일 한 세트를 만든 것처럼 들리지만, 하나의 텍스처 유닛을 각각의 유니폼 대신에 두 유니폼에 묶는 것이 좋습니다. –

+0

네, 방금 작동했습니다. 내 문제는 glUniform1() 호출에있었습니다. – BlueVoodoo

0

당신은이 코드를 직접 작성하는 귀찮게하지에 대해 어떻게이 튜토리얼 http://www.clockworkcoders.com/oglsl/tutorial8.htm

+2

여기에서 사용하는 OpenGL ES 2.0에는 적용되지 않습니다. 그 튜토리얼은 데스크톱 OpenGL을위한 것이고 그 중 많은 부분이 이것을 위해 작동하지 않을 것입니다. –

관련 문제