2017-09-11 15 views
1

Je sais que beaucoup de résoudre faire l'effet de l'image. Mais je choisis GPUImage (GPUImageLookupFilter) fais mon image.
Mon code source est utilisé.
IO - Objectif-c GPUImage Filtre de recherche faire l'effet avec l'image de recherche 4x4

GPUImagePicture *sourceImagePic = [[GPUImagePicture alloc] initWithImage:sourceImage]; 
GPUImagePicture *lookupImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"lookup.png"]]; 
GPUImageLookupFilter *lookupImageFilter = [[GPUImageLookupFilter alloc] init]; 

[sourceImagePic addTarget:lookupImageFilter]; 
[lookupImageSource addTarget:lookupImageFilter]; 
[lookupImageFilter useNextFrameForImageCapture]; 

[sourceImagePic processImage]; 
[lookupImageSource processImage]; 
resultImage = [lookupImageFilter imageFromCurrentFramebufferWithOrientation:UIImageOrientationUp]; 

return resultImage; 


Tout d'abord j'utiliser l'image recherche 8x8 (512)

enter image description here
Mais quand je travaille avec l'image de tableau (pouce vidéo ou le choix de nombreuses images dans la bibliothèque) mémoire supérieure.
Je pense que si j'utilise une petite image de recherche (4x4), la mémoire peut être réduite. Je fais une image de recherche 4x4 (16).

enter image description here
et j'essaie modifier le code de GPUImageLookupFilter mais ça marche pas.

void main(){ 
highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 

highp float blueColor = textureColor.b * 63.0; 

highp vec2 quad1; 
quad1.y = floor(floor(blueColor)/8.0); 
quad1.x = floor(blueColor) - (quad1.y * 8.0); 

highp vec2 quad2; 
quad2.y = floor(ceil(blueColor)/8.0); 
quad2.x = ceil(blueColor) - (quad2.y * 8.0); 

highp vec2 texPos1; 
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); 
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); 

highp vec2 texPos2; 
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); 
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); 

lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1); 
lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2); 

lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); 
gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity); 
} 


Vous pouvez me aider à modifier ce code de travail avec l'image 4x4.
Merci !.

Répondre

1

L'algorithme suivant fonctionnera pour n'importe quelle taille de la texture de recherche. Il vous suffit d'adapter tiles au nombre de mosaïques dans les directions x et y, et colTexSize à la taille maximale de la texture de recherche de couleur.
L'algorithme est identique à l'algorithme d'origine, à l'exception des valeurs de taille constante qui ont été remplacées par les variables tiles et colTexSize.

void main() 
{ 
    vec2 tiles  = vec2(4.0, 4.0); // original texture vec2(8.0, 8.0) 
    vec2 colTexSize = vec2(64.0, 64.0) // original texture vec2(512.0, 512.0) 

    highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 

    highp float blueColor = textureColor.b * ((tiles.x*tiles.y)-1.0); 

    highp vec2 quad1; 
    quad1.y = floor(floor(blueColor)/tiles.y); 
    quad1.x = floor(blueColor) - (quad1.y * tiles.x); 

    highp vec2 quad2; 
    quad2.y = floor(ceil(blueColor)/tiles.y); 
    quad2.x = ceil(blueColor) - (quad2.y * tiles.x); 

    highp vec2 texPos1; 
    texPos1.x = (quad1.x/tiles.x) + 0.5/colTexSize.x + (1.0/(tiles.x - colTexSize.x) * textureColor.r); 
    texPos1.y = (quad1.y/tiles.y) + 0.5/colTexSize.y + (1.0/(tiles.y - colTexSize.y) * textureColor.g); 

    highp vec2 texPos2; 
    texPos2.x = (quad2.x/tiles.x) + 0.5/colTexSize.x + (1.0/(tiles.x - colTexSize.x) * textureColor.r); 
    texPos2.y = (quad2.y/tiles.y) + 0.5/colTexSize.y + (1.0/(tiles.y - colTexSize.y) * textureColor.g); 

    lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1); 
    lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2); 

    lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); 
    gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity); 
} 
+0

pourquoi vous ne changez pas 63,0? Je change est 15,0? –

+0

pourquoi c'est 63? 63 = 2^6 - 1? –

+0

merci. ça marche. 63,0 est inconnu :). –