微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 OpenGL 着色器转换为要在 CIFilter 中使用的内核核心图像

如何解决将 OpenGL 着色器转换为要在 CIFilter 中使用的内核核心图像

我有一个 OpenGL 代码,需要在核内核核心图像语言中进行转换。关于它没有那么多文档。 如何在内核语言中传输电影的失真?我知道用Metal比较好,但是我用的是第三方视频采集库,并不意味着MTKView的存在,视频录制库使用(FilterCam库)GLKit。

这里是需要转换的代码


#define TRACKING_HEIGHT 0.15
#define TRACKING_SEVERITY 0.025
#define TRACKING_SPEED 0.2

#define SHIMMER_SPEED 30.0

#define RGB_MASK_SIZE 2.0

void mainImage( out vec4 fragColor,in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy / iResolution.xy;
    
    // x wigglies (sampling error)
    uv.x -= sin(uv.y * 500.0 + iTime) * INTERLACING_SEVERITY;
    
    float scan = mod(fragCoord.y,3.0);
  
    // Convert our xy coordinates into a linear index we can use in
    // the next step
    // periodically offset y by 1 pixel to get that shimmer
    float yOffset = floor(sin(iTime*SHIMMER_SPEED));
    float pix = (fragCoord.y+yOffset) * iResolution.x + fragCoord.x;
    pix = floor(pix);
    
    // Simulate pixel layout by using a repeating RGB mask
    vec4 colMask = vec4(mod(pix,RGB_MASK_SIZE),mod((pix+1.0),mod((pix+2.0),1.0);
    colMask = colMask / (RGB_MASK_SIZE - 1.0) + 0.5;

    // Tracking
    float t = -iTime * TRACKING_SPEED;
    float fractionalTime = (t - floor(t)) * 1.3 - TRACKING_HEIGHT;
    if(fractionalTime + TRACKING_HEIGHT >= uv.y && fractionalTime <= uv.y)
    {
        uv.x -= fractionalTime * TRACKING_SEVERITY;
    }
    
    fragColor = texture(iChannel0,uv)*colMask*scan;
}

我这样做是为了实现我的需求


final class NinetyEightFilter: CIFilter {
    
    @objc
    dynamic var inputimage: CIImage?
    
    dynamic override var outputimage: CIImage? {
        guard let inputimage = inputimage else { return nil }
        
        let extent = inputimage.extent

        let kernel = CIKernel(source: """
        
        kernel vec? .... ?
        
        """)!
        
        let roiCallback: CIKernelROICallback = { _,rect -> CGRect in
            return CGRect(x: rect.minX,y: rect.minY,width: rect.width,height: rect.height)
        }

        let arguments = [inputimage] as [Any]
        let finalImage = kernel.apply(extent: extent,roiCallback: roiCallback,arguments: arguments)
        
        return finalImage
    }
}

我为我的问题道歉,但我真的很想解决这个任务......

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。