【发布时间】:2019-06-21 13:41:37
【问题描述】:
我们在 GLSL (ES) 中为 Android 版本的应用编写了许多图像过滤器。从 iOS 12 开始,OpenGL 已被弃用,CIFilter 内核必须使用 Metal 编写。
我以前有一些 OpenGL 的背景,但是在 Metal 中编写 CIFilter 内核对我来说是新的。
这是过滤器之一。你能帮我把它作为 CIFilter 内核翻译成 Metal 吗?这将为我提供一个很好的例子,这样我就可以翻译其他人了。
#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sTexture;
uniform float texelWidth;
uniform float texelHeight;
uniform float intensivity;
void main() {
float SIZE = 1.25 + (intensivity / 100.0)*2.0;
vec4 color;
float min = 1.0;
float max = 0.0;
float val = 0.0;
for (float x = -SIZE; x < SIZE; x++) {
for (float y = -SIZE; y < SIZE; y++) {
color = texture2D(sTexture, vTextureCoord + vec2(x * texelWidth, y * texelHeight));
val = (color.r + color.g + color.b) / 3.;
if (val > max) { max = val; } else if (val < min) { min = val; }
}
}
float range = 5. * (max - min);
gl_FragColor = vec4(pow(1. - range, SIZE * 1.5));
gl_FragColor = vec4((gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3. > 0.75 ? vec3(1.) : gl_FragColor.rgb, 1.);
}
【问题讨论】:
-
这里有一些关于金属着色语言的资源:@987654321@希望对您有所帮助
-
您能否提供一个示例输入和输出图像以及强度参数的预期范围?通过检查这个内核应该做什么并不是很明显。
-
@warrenm 你好,沃伦!该内核生成输入图像的草图版本。强度参数范围为 (0,100)。这是一个示例:原始 - imgur.com/SlARGMy, p=100 -> imgur.com/IqRw4A1, p=50 -> imgur.com/Lygjaqs, p=0 -> imgur.com/oypgOo0
标签: android ios opengl-es metal core-image