2012-09-11 13 views
7

Görüntüyü arka plan olarak içeren Apple Sample GLCameraRipple kodunu yeniden yazmaya çalışıyorum. Aslında ben bu kodu kullanarak su resmi üzerinde dalgalanma etkisi yaratmaya çalışıyorum, ancak Kamera için kod çalışıyor, bunun yerine sadece fotoğraf yerine arka plan olarak basit bir su görüntüsü kullanmak istiyorum. Herhangi bir yön veya herhangi bir örnek kod harika bir yardımcı olacaktır. Şimdiden teşekkürler.GLCameraRipple örneğini Image olarak arka plan olarak nasıl yazabilirim?

cevap

9

Fotoğraf makinesi dalgalanma efektinin çalışma şekli, üçgenler ızgarasındaki doku koordinatlarını deforme etmesidir - bu nedenle iyi haber, istediğiniz efektin video dokusundan tamamen farklı olmasıdır; dokuları sadece bir video olur. İstediğinizi gerçekleştirmek için tek yapmanız gereken tüm kamera video kodunu kaldırmak ve kendi dokunuzu bağlamak.

Yani viewDidLoad, sen [self setupAVCapture] açıklama ediyorum ve devam edin ve yalnızca birini (iki satır, glUniform1i(uniforms[UNIFORM_UV], 1); glUniform1i(uniforms[UNIFORM_Y], 0); vardır) kullanacağız çünkü SetupGL hem doku üniformaları açıklama ve bağlama sonra & tane oluştur kendi dokusunu.

GLKit bu gibi bir şey elde etmenin en hızlı yoludur. GLKit bir çok OpenGL işlevini sizden saklar, ancak çok hızlı bir şekilde & etkilidir.

//create the GLKTextureInfo object 
NSError *error; 
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:GLKTextureLoaderOriginBottomLeft]; 
GLKTextureInfo *texture = [GLKTextureLoader textureWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"] options:options error:&error]; 
if (error) NSLog(@"Ripple FRONT TEXTURE ERROR: %@", error); 

//bind the texture to texture unit 0 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(texture.target, texture.name); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

Şimdi kurulumAVCapture'da bulunan bazı önemli ayarları kaybettiniz.

if (_ripple == nil || 
    texture.width != _textureWidth || 
    texture.height != _textureHeight) 
{ 
    _textureWidth = texture.width; 
    _textureHeight = texture.height; 

    _ripple = [[RippleModel alloc] initWithScreenWidth:_screenWidth 
              screenHeight:_screenHeight 
              meshFactor:_meshFactor 
              touchRadius:5 
              textureWidth:_textureWidth 
             textureHeight:_textureHeight]; 

    [self setupBuffers]; 
} 

Ve son sen Fragman Shader biraz değiştirmek gerekecek: Yani viewDidLoad yukarıdaki kodundan sonra onu koymak.

Shader.fsh açın ve bu ana işlevi değiştirin:

void main() 
{ 
    gl_FragColor = texture2D(SamplerY, texCoordVarying); 
} 

Neyse, bu bunu yapmak gerektiğini. RippleModel & ile deneme yapmak süper eğlenceli olabilir ne tür bir haylaz efektler yapabilirsiniz.

+2

Harika cevap jankins, bu bir çekicilik gibi çalışır! Bu cevap kabul edildi olarak işaretlenmelidir. –

+1

Teşekkürler jankins, kabul edilmiş olarak işaretlenmiş olmalı – Andrea

+0

Çok eksik cevap – rraallvv

İlgili konular