- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Apple 的 sample project与使用 ARMatteGenerator
相关生成一个 MTLTexture,可以用作人遮挡技术中的遮挡 mask 。
我想确定如何通过 CIFilter 运行生成的 mask 。在我的代码中,我像这样“过滤” mask ;
func updateMatteTextures(commandBuffer: MTLCommandBuffer) {
guard let currentFrame = session.currentFrame else {
return
}
var targetImage: CIImage?
alphaTexture = matteGenerator.generateMatte(from: currentFrame, commandBuffer: commandBuffer)
dilatedDepthTexture = matteGenerator.generateDilatedDepth(from: currentFrame, commandBuffer: commandBuffer)
targetImage = CIImage(mtlTexture: alphaTexture!, options: nil)
monoAlphaCIFilter?.setValue(targetImage!, forKey: kCIInputImageKey)
monoAlphaCIFilter?.setValue(CIColor.red, forKey: kCIInputColorKey)
targetImage = (monoAlphaCIFilter?.outputImage)!
let drawingBounds = CGRect(origin: .zero, size: CGSize(width: alphaTexture!.width, height: alphaTexture!.height))
context.render(targetImage!, to: alphaTexture!, commandBuffer: commandBuffer, bounds: drawingBounds, colorSpace: CGColorSpaceCreateDeviceRGB())
}
func compositeImagesWithEncoder(renderEncoder: MTLRenderCommandEncoder) {
guard let textureY = capturedImageTextureY, let textureCbCr = capturedImageTextureCbCr else {
return
}
// Push a debug group allowing us to identify render commands in the GPU Frame Capture tool
renderEncoder.pushDebugGroup("CompositePass")
// Set render command encoder state
renderEncoder.setCullMode(.none)
renderEncoder.setRenderPipelineState(compositePipelineState)
renderEncoder.setDepthStencilState(compositeDepthState)
// Setup plane vertex buffers
renderEncoder.setVertexBuffer(imagePlaneVertexBuffer, offset: 0, index: 0)
renderEncoder.setVertexBuffer(scenePlaneVertexBuffer, offset: 0, index: 1)
// Setup textures for the composite fragment shader
renderEncoder.setFragmentBuffer(sharedUniformBuffer, offset: sharedUniformBufferOffset, index: Int(kBufferIndexSharedUniforms.rawValue))
renderEncoder.setFragmentTexture(CVMetalTextureGetTexture(textureY), index: 0)
renderEncoder.setFragmentTexture(CVMetalTextureGetTexture(textureCbCr), index: 1)
renderEncoder.setFragmentTexture(sceneColorTexture, index: 2)
renderEncoder.setFragmentTexture(sceneDepthTexture, index: 3)
renderEncoder.setFragmentTexture(alphaTexture, index: 4)
renderEncoder.setFragmentTexture(dilatedDepthTexture, index: 5)
// Draw final quad to display
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4)
renderEncoder.popDebugGroup()
}
最佳答案
我认为您不想申请 CIFilter
到 alphaTexture
.我假设您使用的是 Apple 的 Effecting People Occlusion in Custom Renderers示例代码。如果你看今年的Bringing People into AR在 WWDC session 上,他们讨论了使用 ARMatteGenerator
生成分段 mask ,这就是 alphaTexture = matteGenerator.generateMatte(from: currentFrame, commandBuffer: commandBuffer)
正在做的事情. alphaTexture
是 MTLTexture
这本质上是一个 alpha 掩码,用于在相机框架中检测到人类(即完全不透明的人类和完全透明的人类)。
向 alpha 纹理添加过滤器不会过滤最终渲染的图像,而只会影响合成中使用的蒙版。如果您正在尝试实现 your previous question 中链接的视频,我建议调整发生合成的 Metal 着色器。在 session 中,他们指出他们比较了dilatedDepth
和 renderedDepth
看看他们是否应该从相机中绘制虚拟内容或像素:
fragment half4 customComposition(...) {
half4 camera = cameraTexture.sample(s, in.uv);
half4 rendered = renderedTexture.sample(s, in.uv);
float renderedDepth = renderedDepthTexture.sample(s, in.uv);
half4 scene = mix(rendered, camera, rendered.a);
half matte = matteTexture.sample(s, in.uv);
float dilatedDepth = dilatedDepthTexture.sample(s, in.uv);
if (dilatedDepth < renderedDepth) { // People in front of rendered
// mix together the virtual content and camera feed based on the alpha provided by the matte
return mix(scene, camera, matte);
} else {
// People are not in front so just return the scene
return scene
}
}
Shaders.metal
.找到
compositeImageFragmentShader
功能。在函数结束时,您会看到
half4 occluderResult = mix(sceneColor, cameraColor, alpha);
这与
mix(scene, camera, matte);
的操作基本相同我们在上面看到的。我们正在根据分割 mask 决定是使用场景中的像素还是相机输入中的像素。我们可以通过替换
cameraColor
轻松地用任意 rgba 值替换相机图像像素。与
half4
代表一种颜色。例如,我们可以使用
half4(float4(0.0, 0.0, 1.0, 1.0))
将分割哑光内的所有像素绘制为蓝色:
…
// Replacing camera color with blue
half4 occluderResult = mix(sceneColor, half4(float4(0.0, 0.0, 1.0, 1.0)), alpha);
half4 mattingResult = mix(sceneColor, occluderResult, showOccluder);
return mattingResult;
compositeImageFragmentShader
添加:
float random(float offset, float2 tex_coord, float time) {
// pick two numbers that are unlikely to repeat
float2 non_repeating = float2(12.9898 * time, 78.233 * time);
// multiply our texture coordinates by the non-repeating numbers, then add them together
float sum = dot(tex_coord, non_repeating);
// calculate the sine of our sum to get a range between -1 and 1
float sine = sin(sum);
// multiply the sine by a big, non-repeating number so that even a small change will result in a big color jump
float huge_number = sine * 43758.5453 * offset;
// get just the numbers after the decimal point
float fraction = fract(huge_number);
// send the result back to the caller
return fraction;
}
compositeImageFragmentShader
到:
…
float randFloat = random(1.0, cameraTexCoord, rgb[0]);
half4 occluderResult = mix(sceneColor, half4(float4(randFloat, randFloat, randFloat, 1.0)), alpha);
half4 mattingResult = mix(sceneColor, occluderResult, showOccluder);
return mattingResult;
关于arkit - 如何使用 ARMatteGenerator 将 CIFilter 添加到 MTLTexture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57228411/
我正在尝试对 ARSCNView 中的相机实时 Steam 图像应用模糊效果。我检查了 WWDC 视频。他们只提到了使用 Metal 进行自定义渲染,但我在网上没有找到任何完整的示例。知道怎么做吗?
是否有任何 CIFilter 具有与 Photoshop“添加噪点”滤镜类似的效果? 最佳答案 您可以使用CIRandomGenerator与一些混合过滤器(加法、筛选或其他)结合使用。总效应链应该是
是否有显示所有 CIFilter 及其各自值范围的作弊列表? 苹果怎么能逃脱写doc like this列出所有过滤器而不告诉我们可能的范围? 来吧苹果。 最佳答案 我已经对其进行了更新,以使其能够正
static func effectTransfer(image: UIImage) -> UIImage { let coreImage = CIImage(image: image)
我正在拍摄 subview 的快照并将其转换为图像: let image = UIImage(view: swiftyDraw) let scaledImage = scaleImage(image:
我需要有关如何在内存上高效使用 CIFilter 的建议。基本上,我将两个过滤器链接在一起。棘手的部分是我必须先将 UIImage 转换为 CIImage,然后再调用过滤器。代码贴在下面: CIIma
我发现 CIFilter 与 CIGaussianBlur 滤镜的行为非常奇怪。 我正在对不同的图像快速连续地多次执行此方法。有时,将返回“最后处理的图像”而不是我发送的图像。例如,如果我有图像: A
谁能解释一下,我们如何为过滤器中的不同输入参数识别正确的值。我尝试了默认值,但只有少数过滤器对其他不起作用的过滤器提供了适当的效果。 谁能指导我以正确的方式实现 CIFilter? 谢谢 最佳答案 内
我知道可以使用像素缓冲区更改像素的颜色,如下面的代码所示,但我只想使用“CIFilter”模糊像素而不是更改颜色。我不想在整个图像上应用“CIFilter”。 //data pointer – sto
我正在尝试使用以下代码向图层添加模糊效果。 但它不起作用,有什么建议吗? let layer = CALayer() layer.frame = CGRect(x: 150, y: 150, widt
我正在将 CIFilter 应用于 UIImage,但它会减慢我的 UITableView 上的滚动速度。有什么我可以做的吗? - (UITableViewCell *)tableView:(UITa
我正在使用 CISourceOverCompositing 混合两个图像。使用此代码可以正常处理相同大小的图像: CIFIlter *filter1 = [CIFilter filterWithNam
我目前正在尝试用一张由不同的 CIFilter 过滤的图片填充一个 Collection View 。我使用 apples 的方式来获取一组过滤器。 let filterNames = CIFilte
我正在将 CIFilter 应用于肖像图像。由于某种原因,它顺时针旋转了 90 度。我怎样才能解决这个问题?我的代码在下面 var imgOrientation = oImage.imageOrien
我编写了一个自己的 CIFilter 内核,它对相机信号进行一些图像处理。它需要两个参数:参数一是“inputImage”(当前相机图像),参数2是“backgroundImage”,它正在使用第一个
我在图像上添加多个 CIFilter 时遇到问题,例如当我添加亮度滤镜然后尝试添加对比度图像时,图像将变为原始图像(丢失亮度滤镜),然后添加对比度滤镜。 - (IBAction)brightnessS
有谁知道自定义 CIFilter 的图像大小有什么限制?我创建了一个过滤器,当图像高达 2 兆像素时,它可以按预期执行,但当图像更大时,会产生非常奇怪的结果。我已经在我的 cocoa 应用程序和 qu
我想以网格和列表模式复制停靠堆栈的背景。背景是半透明的黑色,带有模糊效果: Example of dock stack in grid mode http://www.thecustommac.com
我正在使用以下代码进行曝光调整及其工作。我需要锐化、降噪、高光、色温、阴影、模糊等滤镜名称。 [CIFilter filterWithName: @"CIExposureAdjust"
我有一个圆形 ImageView 。我设置了它的图像并给出了色调效果,如下所示,效果很好。 let filter = CIFilter(name: "CIPhotoEffectTonal")!
我是一名优秀的程序员,十分优秀!