我正在尝试实现一个自定义的CIFilter来与我的ARSCNView中的SCNNode一起使用。不幸的是,它只会在节点应该出现在屏幕上的位置创建一个灰色矩形。我还尝试了内置的CIFilters来检查我的代码,但没有成功。
在其他一些SO帖子上,我读到CIFilter仅在选择OpenGL作为SCNView的渲染API时才起作用,因为CoreImage与Metal不兼容,并且据我所知,无法让ARSCNView在OpenGL下运行。该帖子发布于2016年,因此我想知道是否有任何变化。
我尝试实现的是在屏幕上勾画/突出显示对象以向用户反馈对象选择。通过添加着色器修改器,我已经实现了可用的东西,但它对着色控制有限。我真的不想接管所有的着色工作。
以下是我用于轮廓绘制的CIKernel,在Quartz Composer上效果非常好。
非常感谢您的帮助和信息。
在其他一些SO帖子上,我读到CIFilter仅在选择OpenGL作为SCNView的渲染API时才起作用,因为CoreImage与Metal不兼容,并且据我所知,无法让ARSCNView在OpenGL下运行。该帖子发布于2016年,因此我想知道是否有任何变化。
我尝试实现的是在屏幕上勾画/突出显示对象以向用户反馈对象选择。通过添加着色器修改器,我已经实现了可用的东西,但它对着色控制有限。我真的不想接管所有的着色工作。
以下是我用于轮廓绘制的CIKernel,在Quartz Composer上效果非常好。
非常感谢您的帮助和信息。
kernel vec4 outline(sampler src) {
vec2 texturePos = destCoord();
float alpha = 4.0f * sample(src, texturePos).a;
float thickness = 5.0f;
alpha -= sample(src, texturePos + vec2(thickness, 0.0f)).a;
alpha -= sample(src, texturePos + vec2(-thickness, 0.0f)).a;
alpha -= sample(src, texturePos + vec2(0.0f, thickness)).a;
alpha -= sample(src, texturePos + vec2(0.0f, -thickness)).a;
if (alpha > 0.9f) {
vec4 resultCol = vec4(1.0f, 1.0f, 1.0f, alpha);
return resultCol;
}else{
vec4 resultCol = sample(src, texturePos);
return resultCol;
}
}