2012-09-11 11 views
7

Estoy intentando volver a escribir el código Apple Sample GLCameraRipple, con la imagen como fondo. En realidad estoy tratando de crear un efecto dominó en la imagen del agua usando este código, pero el código está funcionando para la cámara. En su lugar, solo quiero usar una imagen de agua simple como fondo en lugar de cámara. Cualquier dirección o código de muestra será de gran ayuda. Gracias por adelantado.¿Cómo puedo reescribir la muestra GLCameraRipple con Imagen como fondo?

Respuesta

9

La forma en que funciona el efecto de ondulación de la cámara es deformar las coordenadas de la textura en una cuadrícula de triángulos, por lo que la buena noticia es que el efecto que desea es bastante independiente de la textura del video; su textura resulta ser un video. Para lograr lo que quieres, todo lo que tienes que hacer es eliminar todo el código de video de la cámara y vincular tu propia textura.

Así que en viewDidLoad, que te comente [self setupAVCapture], y seguir adelante y comente las dos uniformes en textura SetupGL, ya que sólo se va a utilizar una (las dos líneas son glUniform1i(uniforms[UNIFORM_Y], 0);, glUniform1i(uniforms[UNIFORM_UV], 1);), y luego crear & se unen a su propia textura.

GLKit es la manera más rápida de hacer algo como esto. GLKit oculta muchas de las llamadas de función OpenGL de usted, pero es muy rápido & efectivo.

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

Ahora ha perdido una configuración muy importante que se incluyó en setupAVCapture. Así que lo puso en después de que el código anterior en 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]; 
} 

Y por último, usted tiene que cambiar el fragment shader un poco.

Abran Shader.fsh y cambiar la función principal para esto:

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

De todos modos, que debería hacerlo. Es muy divertido experimentar con el modelo RippleModel & para ver qué tipo de efectos extraños puedes hacer.

+2

Gran respuesta jankins, esto funciona como un encanto! Esta respuesta debe marcarse como aceptada. –

+1

Gracias jankins, esto debería marcarse como aceptado – Andrea

+0

Respuesta muy incompleta – rraallvv

Cuestiones relacionadas