2017-09-11 9 views
1

私はイメージに多くの解決策を加えることができます。しかし、私は選択GPUImage(GPUImageLookupFilter)私のイメージを作る。
私のソースコードを使用しています。
IO - Objective-c GPUImageルックアップフィルタはルックアップイメージで効果を出します。

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; 


まず私は、配列の画像を扱うとき、私は、ライブラリ内のビデオや選択肢多くの画像で親指(ルックアップ画像8×8(512 )

enter image description here
を使用しますが、 )より高いメモリ。
私は小さなルックアップイメージ(4x4)を使用するとメモリが減少すると思います。ルックアップイメージ4x4(16 )を作成します。

enter image description here
と私はGPUImageLookupFilterの編集コードを試してみたが、それは動作しません。

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


あなたは私がイメージ4×4でこのコードの動作を編集することができます。
ありがとうございました!

答えて

1

以下のアルゴリズムは、ルックアップテクスチャのどのサイズでも機能します。 tilesをx方向とy方向のタイルの数に合わせるだけで、カラールックアップテクスチャのフルサイズに合わせてcolTexSizeに合わせる必要があります。
アルゴリズムは、固定サイズの値を除いて、元のアルゴリズムと同じですが、変数tilescolTexSizeで置き換えられました。

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

なぜ63.0を変更しないのですか?私は15.0を変更しますか? –

+0

なぜそれは63ですか? 63 = 2^6 - 1? –

+0

ありがとうございます。それは働く。 63.0は不明です:)。 –

関連する問題