2012-09-11 5 views
7

アップルサンプルGLCameraRippleコードを、画像をバックグラウンドとして書き直そうとしています。実際には私はこのコードを使用して水の画像に波及効果を作成しようとしていますが、コードはカメラのために働いています、代わりに私はちょうどカメラの代わりに背景として単純な水の画像を使用したい。方向やサンプルコードは大きな助けになります。前もって感謝します。GLCrameRippleサンプルを背景としてImageを書き換えるにはどうすればよいですか?

答えて

9

効果を波打つカメラが動作する方法は、テクスチャが三角形のグリッド上の座標変形である - ので、良いニュースは、あなたが望む効果は映像の質感とは全く別であるということです。彼らのテクスチャはちょうどビデオになります。あなたが望むことを達成するためには、すべてのカメラビデオコードを削除し、独自のテクスチャをバインドするだけです。

だから、のviewDidLoadに、あなたは[self setupAVCapture]をコメントアウトしたい、とあなただけ(2行glUniform1i(uniforms[UNIFORM_Y], 0);glUniform1i(uniforms[UNIFORM_UV], 1);ある)いずれかを使用して、作成しますから、先に行くとSetupGLの両方のテクスチャの制服をコメントアウトあなたをバインド&独自のテクスチャ。

GLKitはこのような何かを成し遂げるための最速の方法です。 GLKitはあなたからのOpenGL関数呼び出しをたくさん隠しますが、非常に高速です&効果的です。

//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); 

setupAVCaptureに含まれていた非常に重要な設定が失われました。だから、のviewDidLoadで上記のコードの後に​​それを置く:

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]; 
} 

そして最後に、あなたは、フラグメントシェーダを少し変更する必要があります。

はShader.fshを開き、これに主な機能を変更します。

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

をとにかく、それはそれを行うべきです。 RippleModel &を試してみるのはとても楽しいです。

+2

偉大な答えjankins、これは魅力のように動作します!この回答には受け入れ済みとマークする必要があります。 –

+1

ありがとうjankinsが、これは(すべてのクレジットがjankinsに行くとApple)、あなたはここでそれを見つけることができます私は@jankinsの変更を行い、新しいプロジェクトにカメラコードを削除ここ – Andrea

+0

非常に不完全な答え – rraallvv

関連する問題