画像を背景にして、AppleサンプルGLCameraRippleコードを書き直そうとしています。実際、このコードを使用して水画像に波及効果を作成しようとしていますが、コードはカメラで機能しています。代わりに、カメラの代わりに単純な水画像を背景として使用したいと思います。任意の方向または任意のサンプルコードが非常に役立ちます。前もって感謝します。
1 に答える
カメラの波打つ効果が機能する方法は、三角形のグリッド上のテクスチャ座標を変形することです。したがって、良いニュースは、必要な効果がビデオテクスチャから完全に分離されていることです。彼らのテクスチャはたまたまビデオです。あなたが望むことを達成するためにあなたがしなければならないのは、すべてのカメラビデオコードを削除し、あなた自身のテクスチャをバインドすることです。
したがって、viewDidLoadでは、コメントアウトし[self setupAVCapture]
、SetupGLで両方のテクスチャユニフォームをコメントアウトします。これは、1つだけを使用し(2行はglUniform1i(uniforms[UNIFORM_Y], 0);
、glUniform1i(uniforms[UNIFORM_UV], 1);
)、独自のテクスチャを作成してバインドするためです。
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を開き、main関数を次のように変更します。
void main()
{
gl_FragColor = texture2D(SamplerY, texCoordVarying);
}
とにかく、それはそれをするべきです。RippleModelを試して、どのような奇抜な効果を生み出すことができるかを確認するのはとても楽しいです。