2013-10-29 2 views
2

iOS 플랫폼 용으로 개발 된 xcode와 함께 GPUimage를 사용하고 있습니다.GPUImage 그리드 효과 생성 방법

예를 들어 라이브 비디오 스트림을 9 개 타일로 변환하려고 시도했습니다.

비디오를 원래 크기로 0.33 크기로 조정 한 다음 프래그먼트 셰이더를 적용하여 다른 비디오 크기 조정 비디오를 다른 타일로 반복하려고했습니다.

그러나 셰이더는 전체 화면이 아닌 크기가 조정 된 비디오에만 적용됩니다.

varying highp vec2 textureCoordinate; 
uniform sampler2D inputImageTexture; 

uniform mediump float range; 

void main() 
{ 
    mediump vec2 p = textureCoordinate; 


    if (p.x > 0.66) { 
     p.x = (p.x-0.66); 
    } 
    else if (p.x > 0.33) { 
     p.x = (p.x-0.33); 
    } 

    if (p.y > 0.66) { 
     p.y = (p.y-0.66); 
    } 
    else if (p.y > 0.33) { 
     p.y = (p.y-0.33); 
    } 

    lowp vec4 outputColor = texture2D (inputImageTexture, p); 
    gl_FragColor = outputColor; 
} 

제안 : 여기

내 쉐이더입니까? 당신은 "클론"걱정 할 필요가 없습니다

답변

0

sample image 예, GL_REPEAT에 텍스처 랩 모드를 설정!

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

그리고 당신의 쉐이더는해야한다 : 어떤 이유로 당신이하고 싶지는 GL_REPEAT을 사용하지 않는 경우, 단지 모드() 함수를 사용하여 직접 텍스처를 반복

varying highp vec2 textureCoordinate; 
uniform sampler2D inputImageTexture; 

uniform mediump float range; 

void main() 
{ 
    mediump vec2 p = 3.0 * textureCoordinate - vec2(1.0); 
    lowp vec4 outputColor = texture2D (inputImageTexture, p); 
    gl_FragColor = outputColor; 
} 

:

mediump vec2 p = mod(3.0 * textureCoordinate - vec2(1.0), 1.0); 
+0

완벽하게 작동하는 바그너에게 감사드립니다 ....하지만 어떻게 처리하고 있는지 알고 싶습니다 ....이 코드 줄에서 무엇을하는지 조금 더 설명 할 수 있습니까? ... mediump vec2 p = mod (3.0 * textureCoordinate - vec2 (1.0), 1.0); – Jatin

+0

@Wagner Patriota, GPUImage에서이 쉐이더를 사용하는 방법은 무엇입니까? – Allan

2
// This is necessary for non-power-of-two textures 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

그리고는 비디오 입력이 아닌 2 제곱 텍스처를 생성한다.

그래서 사용되는 스크립트는 다음

varying highp vec2 textureCoordinate; 
    uniform sampler2D inputImageTexture; 

    // num tiles row x col 
    uniform mediump float range; 


    void main() 
    { 
     mediump vec2 p = mod(range * textureCoordinate - vec2(1.0), 1.0); 

     lowp vec4 outputColor = texture2D (inputImageTexture, p); 
     gl_FragColor = outputColor; 
    } 

범위 행과 COLS의 수를 나타낸다.

+0

이 쉐이더를 한 프레임에 어떻게 추가 할 수 있습니까? – Allan